diff --git a/html5lib/treebuilders/etree.py b/html5lib/treebuilders/etree.py
index d394148..4d12bd4 100644
--- a/html5lib/treebuilders/etree.py
+++ b/html5lib/treebuilders/etree.py
@@ -100,6 +100,7 @@ def getETreeBuilder(ElementTreeImplementation, fullTree=False):
             node.parent = self
 
         def removeChild(self, node):
+            self._childNodes.remove(node)
             self._element.remove(node._element)
             node.parent = None
 

diff --git a/html5lib/tests/test_parser2.py b/html5lib/tests/test_parser2.py
index 0ec5b04..b7a92fd 100644
--- a/html5lib/tests/test_parser2.py
+++ b/html5lib/tests/test_parser2.py
@@ -7,7 +7,7 @@ import io
 from . import support  # noqa
 
 from html5lib.constants import namespaces
-from html5lib import parse, HTMLParser
+from html5lib import parse, parseFragment, HTMLParser
 
 
 # tests that aren't autogenerated from text files
@@ -88,3 +88,8 @@ def test_debug_log():
             expected[i] = tuple(log)
 
     assert parser.log == expected
+
+
+def test_no_duplicate_clone():
+    frag = parseFragment("<b><em><foo><foob><fooc><aside></b></em>")
+    assert len(frag) == 2

etree treewalker infinite loop
This goes into an infinite loop:

```python
import html5lib

frag = html5lib.parseFragment("<b><em><foo><foob><fooc><aside></b></em>")

walker = html5lib.getTreeWalker("etree")

print list(walker(frag))
```
html5lib/tests/test_parser2.py::test_no_duplicate_clone
html5lib/tests/test_parser2.py::test_assertDoctypeCloneable html5lib/tests/test_parser2.py::test_line_counter html5lib/tests/test_parser2.py::test_namespace_html_elements_0_dom html5lib/tests/test_parser2.py::test_namespace_html_elements_1_dom html5lib/tests/test_parser2.py::test_namespace_html_elements_0_etree html5lib/tests/test_parser2.py::test_namespace_html_elements_1_etree html5lib/tests/test_parser2.py::test_unicode_file html5lib/tests/test_parser2.py::test_duplicate_attribute html5lib/tests/test_parser2.py::test_debug_log