diff --git a/omegaconf/dictconfig.py b/omegaconf/dictconfig.py
index 7c180f8..808a687 100644
--- a/omegaconf/dictconfig.py
+++ b/omegaconf/dictconfig.py
@@ -1,4 +1,5 @@
 from .config import Config
+import copy
 from .errors import (
     ReadonlyConfigError,
     MissingMandatoryValue,
@@ -21,6 +22,15 @@ class DictConfig(Config):
         self._deepcopy_impl(res)
         return res
 
+    def __copy__(self):
+        res = DictConfig({})
+        res.__dict__["content"] = copy.copy(self.__dict__["content"])
+        res.__dict__["parent"] = self.__dict__["parent"]
+        return res
+
+    def copy(self):
+        return copy.copy(self)
+
     def __setitem__(self, key, value):
         assert isinstance(key, str)
 
diff --git a/omegaconf/listconfig.py b/omegaconf/listconfig.py
index 993ba31..3d56753 100644
--- a/omegaconf/listconfig.py
+++ b/omegaconf/listconfig.py
@@ -121,7 +121,7 @@ class ListConfig(Config):
         return c
 
     def copy(self):
-        return self[:]
+        return copy.copy(self)
 
     if six.PY2:
 

diff --git a/tests/test_base_config.py b/tests/test_base_config.py
index a35f714..747b4e4 100644
--- a/tests/test_base_config.py
+++ b/tests/test_base_config.py
@@ -332,3 +332,45 @@ def test_open_dict_restore(flag_name, ctx):
         cfg.foo.bar = 20
     assert cfg._get_node_flag(flag_name)
     assert not cfg.foo._get_node_flag(flag_name)
+
+
+@pytest.mark.parametrize(
+    "copy_method", [lambda x: copy.copy(x), lambda x: x.copy()],
+)
+class TestCopy:
+    @pytest.mark.parametrize(
+        "src", [[], [1, 2], ["a", "b", "c"], {}, {"a": "b"}, {"a": {"b": []}}],
+    )
+    def test_copy(self, copy_method, src):
+        src = OmegaConf.create(src)
+        cp = copy_method(src)
+        assert id(src) != id(cp)
+        assert src == cp
+
+    @pytest.mark.parametrize(
+        "src,interpolating_key,interpolated_key",
+        [([1, 2, "${0}"], 2, 0), ({"a": 10, "b": "${a}"}, "b", "a")],
+    )
+    def test_copy_with_interpolation(
+        self, copy_method, src, interpolating_key, interpolated_key
+    ):
+        cfg = OmegaConf.create(src)
+        assert cfg[interpolated_key] == cfg[interpolating_key]
+        cp = copy_method(cfg)
+        assert id(cfg) != id(cp)
+        assert cp[interpolated_key] == cp[interpolating_key]
+        assert cfg[interpolated_key] == cp[interpolating_key]
+
+        # Interpolation is preserved in original
+        cfg[interpolated_key] = "XXX"
+        assert cfg[interpolated_key] == cfg[interpolating_key]
+
+        # Test interpolation is preserved in copy
+        cp[interpolated_key] = "XXX"
+        assert cp[interpolated_key] == cp[interpolating_key]
+
+    def test_list_copy_is_shallow(self, copy_method):
+        cfg = OmegaConf.create([[10, 20]])
+        cp = copy_method(cfg)
+        assert id(cfg) != id(cp)
+        assert id(cfg[0]) == id(cp[0])
diff --git a/tests/test_basic_ops_list.py b/tests/test_basic_ops_list.py
index 9060228..32ec4db 100644
--- a/tests/test_basic_ops_list.py
+++ b/tests/test_basic_ops_list.py
@@ -252,14 +252,6 @@ def test_count(src, item, count):
     assert src.count(item) == count
 
 
-@pytest.mark.parametrize("src", [[], [1, 2], ["a", "b", "c"]])
-def test_copy(src):
-    src = OmegaConf.create(src)
-    cp = src.copy()
-    assert id(src) != id(cp)
-    assert src == cp
-
-
 def test_sort():
     c = OmegaConf.create(["bbb", "aa", "c"])
     c.sort()

OmegaConf object doesn't support a .copy method
A dict is supposed to have a .copy() method (https://docs.python.org/3/library/stdtypes.html#dict.copy). For an OmegaConf object to be compatible with a dict's API, it should also support the copy() method -

```
>>> from omegaconf import OmegaConf
>>> conf = OmegaConf.create({"a": 2, "b": [1,2,3]})
>>> conf
{'a': 2, 'b': [1, 2, 3]}
>>> conf.copy()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
```
tests/test_base_config.py::TestCopy::test_copy[src4-<lambda>1] tests/test_base_config.py::TestCopy::test_copy_with_interpolation[src0-2-0-<lambda>1] tests/test_base_config.py::TestCopy::test_copy_with_interpolation[src1-b-a-<lambda>1] tests/test_base_config.py::TestCopy::test_copy[src3-<lambda>1] tests/test_base_config.py::TestCopy::test_copy[src5-<lambda>1]
tests/test_base_config.py::TestCopy::test_copy[src2-<lambda>0] tests/test_base_config.py::TestCopy::test_copy[src1-<lambda>0] tests/test_base_config.py::TestCopy::test_copy_with_interpolation[src1-b-a-<lambda>0] tests/test_base_config.py::TestCopy::test_copy[src2-<lambda>1] tests/test_base_config.py::TestCopy::test_copy[src0-<lambda>0] tests/test_base_config.py::TestCopy::test_list_copy_is_shallow[<lambda>0] tests/test_base_config.py::TestCopy::test_copy[src5-<lambda>0] tests/test_base_config.py::TestCopy::test_copy[src3-<lambda>0] tests/test_base_config.py::TestCopy::test_copy_with_interpolation[src0-2-0-<lambda>0] tests/test_base_config.py::TestCopy::test_copy[src4-<lambda>0] tests/test_base_config.py::TestCopy::test_copy[src0-<lambda>1] tests/test_base_config.py::TestCopy::test_copy[src1-<lambda>1] tests/test_base_config.py::TestCopy::test_list_copy_is_shallow[<lambda>1] tests/test_base_config.py::test_tokenize_with_escapes[-tokenized9] tests/test_base_config.py::test_str[input_6] tests/test_base_config.py::test_repr[input_6] tests/test_base_config.py::test_tokenize_with_escapes[whitespace\\ tests/test_base_config.py::test_set_value[input_1-foo-value1-expected1] tests/test_base_config.py::test_deepcopy_struct[src0] tests/test_base_config.py::test_repr[input_4] tests/test_base_config.py::test_str[input_2] tests/test_base_config.py::test_deepcopy_struct[src3] tests/test_base_config.py::test_set_value[input_4-0-10-expected4] tests/test_base_config.py::test_tokenize_with_escapes[None-tokenized8] tests/test_base_config.py::test_set_value[input_0-foo-10-expected0] tests/test_base_config.py::test_deepcopy[src2] tests/test_base_config.py::test_tokenize_with_escapes[dog, tests/test_base_config.py::test_tokenize_with_escapes[dog,cat-tokenized0] tests/test_base_config.py::test_set_value[input_5-1-10-expected5] tests/test_base_config.py::test_open_dict_restore[readonly-read_write] tests/test_base_config.py::test_read_write_override[src1-<lambda>-expectation1] tests/test_base_config.py::test_set_value_validation_fail[input_0-foo-str] tests/test_base_config.py::test_deepcopy_after_del tests/test_base_config.py::test_tokenize_with_escapes[dog\\,cat\\ tests/test_base_config.py::test_str[input_5] tests/test_base_config.py::test_set_value[input_6-1-value6-expected6] tests/test_base_config.py::test_repr[input_3] tests/test_base_config.py::test_set_value[input_7-1-value7-expected7] tests/test_base_config.py::test_flag_override[src0-struct-False-<lambda>-expectation0] tests/test_base_config.py::test_to_container_returns_primitives[input_0] tests/test_base_config.py::test_set_value[input_3-foo-value3-expected3] tests/test_base_config.py::test_tokenize_with_escapes[\\ tests/test_base_config.py::test_deepcopy_struct[src1] tests/test_base_config.py::test_deepcopy_with_interpolation tests/test_base_config.py::test_set_value[input_8-1-value8-expected8] tests/test_base_config.py::test_freeze_nested_dict[struct] tests/test_base_config.py::test_tokenize_with_escapes[dog,\\ tests/test_base_config.py::test_empty[input_0-True] tests/test_base_config.py::test_struct_override[src0-<lambda>-expectation0] tests/test_base_config.py::test_str[input_4] tests/test_base_config.py::test_str[input_1] tests/test_base_config.py::test_deepcopy[src3] tests/test_base_config.py::test_flag_override[src1-readonly-False-<lambda>-expectation1] tests/test_base_config.py::test_freeze_nested_dict[readonly] tests/test_base_config.py::test_to_container_returns_primitives[input_1] tests/test_base_config.py::test_to_container_returns_primitives[input_2] tests/test_base_config.py::test_flag_dict[struct] tests/test_base_config.py::test_repr[input_1] tests/test_base_config.py::test_deepcopy_readonly[src3] tests/test_base_config.py::test_deepcopy_readonly[src0] tests/test_base_config.py::test_repr[input_5] tests/test_base_config.py::test_flag_dict[readonly] tests/test_base_config.py::test_deepcopy_struct[src2] tests/test_base_config.py::test_str[input_0] tests/test_base_config.py::test_deepcopy[src0] tests/test_base_config.py::test_str[input_3] tests/test_base_config.py::test_deepcopy_and_merge_and_flags tests/test_base_config.py::test_deepcopy_readonly[src2] tests/test_base_config.py::test_tokenize_with_escapes[no tests/test_base_config.py::test_repr[input_2] tests/test_base_config.py::test_empty[input_3-False] tests/test_base_config.py::test_repr[input_0] tests/test_base_config.py::test_empty[input_2-False] tests/test_base_config.py::test_empty[input_1-True] tests/test_base_config.py::test_set_value_validation_fail[input_1-1-str] tests/test_base_config.py::test_set_value[input_2-foo-value2-expected2] tests/test_base_config.py::test_to_container_returns_primitives[input_3] tests/test_base_config.py::test_open_dict_restore[struct-open_dict] tests/test_base_config.py::test_to_container_returns_primitives[input_4] tests/test_base_config.py::test_deepcopy_readonly[src1] tests/test_base_config.py::test_read_write_override[src0-<lambda>-expectation0] tests/test_base_config.py::test_deepcopy[src1] tests/test_basic_ops_list.py::TestListAdd::test_list_plus[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[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[list12-list22-expected2] tests/test_basic_ops_list.py::TestListAdd::test_list_plus[list11-list21-expected1] tests/test_basic_ops_list.py::test_insert_throws_not_changing_list tests/test_basic_ops_list.py::test_index[src1-10-0-expectation1] tests/test_basic_ops_list.py::test_pretty_list tests/test_basic_ops_list.py::test_list_config_with_list tests/test_basic_ops_list.py::test_list_not_eq[input12-input22] tests/test_basic_ops_list.py::test_list_pop tests/test_basic_ops_list.py::test_list_not_eq[input15-input25] tests/test_basic_ops_list.py::test_list_config_with_tuple tests/test_basic_ops_list.py::test_list_append tests/test_basic_ops_list.py::test_list_eq[l14-l24] tests/test_basic_ops_list.py::test_clear[2-src1] tests/test_basic_ops_list.py::test_hash tests/test_basic_ops_list.py::test_remove[src0-10-result0-expectation0] tests/test_basic_ops_list.py::test_list_value tests/test_basic_ops_list.py::test_clear[2-src0] tests/test_basic_ops_list.py::test_clear[2-src2] tests/test_basic_ops_list.py::test_assign[parent1-0-value1-expected1] tests/test_basic_ops_list.py::test_extend[src1-append1-result1] tests/test_basic_ops_list.py::test_list_eq[l12-l22] tests/test_basic_ops_list.py::test_list_dir tests/test_basic_ops_list.py::test_insert tests/test_basic_ops_list.py::test_list_not_eq[input10-input20] tests/test_basic_ops_list.py::test_list_delitem tests/test_basic_ops_list.py::test_assign[parent2-foo-value2-expected2] tests/test_basic_ops_list.py::test_items_with_interpolation tests/test_basic_ops_list.py::test_assign[parent0-0-value0-expected0] tests/test_basic_ops_list.py::test_list_eq[l10-l20] tests/test_basic_ops_list.py::test_index_slice tests/test_basic_ops_list.py::test_count[src3-None-0] tests/test_basic_ops_list.py::test_list_len tests/test_basic_ops_list.py::test_list_not_eq[input13-input23] tests/test_basic_ops_list.py::test_list_eq_with_interpolation[l10-l20] tests/test_basic_ops_list.py::test_list_get_with_default tests/test_basic_ops_list.py::test_clear[1-src0] tests/test_basic_ops_list.py::test_count[src1-10-1] tests/test_basic_ops_list.py::test_clear[1-src2] tests/test_basic_ops_list.py::test_extend[src0-append0-result0] tests/test_basic_ops_list.py::test_pretty_without_resolve tests/test_basic_ops_list.py::test_assign[parent3-foo-value3-expected3] tests/test_basic_ops_list.py::test_list_eq[l16-l26] tests/test_basic_ops_list.py::test_remove[src3-2-result3-expectation3] tests/test_basic_ops_list.py::test_count[src2-10-2] tests/test_basic_ops_list.py::test_list_of_dicts tests/test_basic_ops_list.py::test_list_eq[l11-l21] tests/test_basic_ops_list.py::test_list_enumerate tests/test_basic_ops_list.py::test_index[src0-20--1-expectation0] 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_iterate_list tests/test_basic_ops_list.py::test_index_slice2 tests/test_basic_ops_list.py::test_list_not_eq[input14-input24] tests/test_basic_ops_list.py::test_negative_index tests/test_basic_ops_list.py::test_list_not_eq[input11-input21] tests/test_basic_ops_list.py::test_sort tests/test_basic_ops_list.py::test_getattr tests/test_basic_ops_list.py::test_list_eq[l13-l23] tests/test_basic_ops_list.py::test_remove[src2-remove2-result2-expectation2] tests/test_basic_ops_list.py::test_nested_list_assign_illegal_value tests/test_basic_ops_list.py::test_pretty_with_resolve tests/test_basic_ops_list.py::test_extend[src2-append2-result2] tests/test_basic_ops_list.py::test_clear[1-src1] tests/test_basic_ops_list.py::test_list_not_eq[input16-input26] tests/test_basic_ops_list.py::test_remove[src1-oops-None-expectation1] tests/test_basic_ops_list.py::test_list_eq[l15-l25] tests/test_basic_ops_list.py::test_in_list tests/test_basic_ops_list.py::test_items_on_list tests/test_basic_ops_list.py::test_append_throws_not_changing_list