diff --git a/omegaconf/listconfig.py b/omegaconf/listconfig.py
index 6969aab..d2696b5 100644
--- a/omegaconf/listconfig.py
+++ b/omegaconf/listconfig.py
@@ -207,3 +207,10 @@ class ListConfig(Config):
                 return v
 
         return MyItems(self.content)
+
+    def __add__(self, o):
+        # res is sharing this list's parent to allow interpolation to work as expected
+        res = ListConfig(parent=self.__dict__["parent"], content=[])
+        res.extend(self)
+        res.extend(o)
+        return res

diff --git a/tests/test_basic_ops_list.py b/tests/test_basic_ops_list.py
index a97aecb..d2e5a86 100644
--- a/tests/test_basic_ops_list.py
+++ b/tests/test_basic_ops_list.py
@@ -373,3 +373,27 @@ def test_hash():
     assert hash(c1) == hash(c2)
     c2[0] = 20
     assert hash(c1) != hash(c2)
+
+
+@pytest.mark.parametrize(
+    "list1, list2, expected",
+    [
+        ([], [], []),
+        ([1, 2], [3, 4], [1, 2, 3, 4]),
+        (["x", 2, "${0}"], [5, 6, 7], ["x", 2, "x", 5, 6, 7]),
+    ],
+)
+class TestListAdd:
+    def test_list_plus(self, list1, list2, expected):
+        list1 = OmegaConf.create(list1)
+        list2 = OmegaConf.create(list2)
+        expected = OmegaConf.create(expected)
+        ret = list1 + list2
+        assert ret == expected
+
+    def test_list_plus_eq(self, list1, list2, expected):
+        list1 = OmegaConf.create(list1)
+        list2 = OmegaConf.create(list2)
+        expected = OmegaConf.create(expected)
+        list1 += list2
+        assert list1 == expected

consider implementing + operator for ListConfig
tests/test_basic_ops_list.py::TestListAdd::test_list_plus[list10-list20-expected0] tests/test_basic_ops_list.py::TestListAdd::test_list_plus[list11-list21-expected1] tests/test_basic_ops_list.py::TestListAdd::test_list_plus[list12-list22-expected2] tests/test_basic_ops_list.py::TestListAdd::test_list_plus_eq[list10-list20-expected0] tests/test_basic_ops_list.py::TestListAdd::test_list_plus_eq[list11-list21-expected1] tests/test_basic_ops_list.py::TestListAdd::test_list_plus_eq[list12-list22-expected2]
tests/test_basic_ops_list.py::test_list_value tests/test_basic_ops_list.py::test_list_of_dicts tests/test_basic_ops_list.py::test_pretty_list tests/test_basic_ops_list.py::test_list_get_with_default tests/test_basic_ops_list.py::test_iterate_list tests/test_basic_ops_list.py::test_items_with_interpolation tests/test_basic_ops_list.py::test_list_pop tests/test_basic_ops_list.py::test_in_list tests/test_basic_ops_list.py::test_list_config_with_list tests/test_basic_ops_list.py::test_list_config_with_tuple tests/test_basic_ops_list.py::test_items_on_list tests/test_basic_ops_list.py::test_list_enumerate tests/test_basic_ops_list.py::test_list_delitem tests/test_basic_ops_list.py::test_list_len tests/test_basic_ops_list.py::test_assign_list_in_list tests/test_basic_ops_list.py::test_assign_dict_in_list tests/test_basic_ops_list.py::test_nested_list_assign_illegal_value tests/test_basic_ops_list.py::test_assign_list_in_dict tests/test_basic_ops_list.py::test_list_append tests/test_basic_ops_list.py::test_pretty_without_resolve tests/test_basic_ops_list.py::test_pretty_with_resolve tests/test_basic_ops_list.py::test_index_slice tests/test_basic_ops_list.py::test_index_slice2 tests/test_basic_ops_list.py::test_negative_index tests/test_basic_ops_list.py::test_list_dir tests/test_basic_ops_list.py::test_getattr tests/test_basic_ops_list.py::test_insert tests/test_basic_ops_list.py::test_extend[src0-append0-result0] tests/test_basic_ops_list.py::test_extend[src1-append1-result1] tests/test_basic_ops_list.py::test_extend[src2-append2-result2] tests/test_basic_ops_list.py::test_remove[src0-10-result0-expectation0] tests/test_basic_ops_list.py::test_remove[src1-oops-None-expectation1] tests/test_basic_ops_list.py::test_remove[src2-remove2-result2-expectation2] tests/test_basic_ops_list.py::test_remove[src3-2-result3-expectation3] tests/test_basic_ops_list.py::test_clear[1-src0] tests/test_basic_ops_list.py::test_clear[1-src1] tests/test_basic_ops_list.py::test_clear[1-src2] tests/test_basic_ops_list.py::test_clear[2-src0] tests/test_basic_ops_list.py::test_clear[2-src1] tests/test_basic_ops_list.py::test_clear[2-src2] tests/test_basic_ops_list.py::test_index[src0-20--1-expectation0] tests/test_basic_ops_list.py::test_index[src1-10-0-expectation1] tests/test_basic_ops_list.py::test_index[src2-20-1-expectation2] tests/test_basic_ops_list.py::test_count[src0-10-0] tests/test_basic_ops_list.py::test_count[src1-10-1] tests/test_basic_ops_list.py::test_count[src2-10-2] tests/test_basic_ops_list.py::test_count[src3-None-0] tests/test_basic_ops_list.py::test_copy[src0] tests/test_basic_ops_list.py::test_copy[src1] tests/test_basic_ops_list.py::test_copy[src2] tests/test_basic_ops_list.py::test_sort tests/test_basic_ops_list.py::test_list_eq[l10-l20] tests/test_basic_ops_list.py::test_list_eq[l11-l21] tests/test_basic_ops_list.py::test_list_eq[l12-l22] tests/test_basic_ops_list.py::test_list_eq[l13-l23] tests/test_basic_ops_list.py::test_list_eq[l14-l24] tests/test_basic_ops_list.py::test_list_eq[l15-l25] tests/test_basic_ops_list.py::test_list_eq[l16-l26] tests/test_basic_ops_list.py::test_list_eq_with_interpolation[l10-l20] tests/test_basic_ops_list.py::test_list_not_eq[input10-input20] tests/test_basic_ops_list.py::test_list_not_eq[input11-input21] tests/test_basic_ops_list.py::test_list_not_eq[input12-input22] tests/test_basic_ops_list.py::test_list_not_eq[input13-input23] tests/test_basic_ops_list.py::test_list_not_eq[input14-input24] tests/test_basic_ops_list.py::test_list_not_eq[input15-input25] tests/test_basic_ops_list.py::test_list_not_eq[input16-input26] tests/test_basic_ops_list.py::test_insert_throws_not_changing_list tests/test_basic_ops_list.py::test_append_throws_not_changing_list tests/test_basic_ops_list.py::test_hash