diff --git a/router/java/test/junit/net/i2p/router/util/CachedIteratorCollectionTest.java b/router/java/test/junit/net/i2p/router/util/CachedIteratorCollectionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b8d4689bd58f5cbb44d0984b18ff852e9afc1b5
--- /dev/null
+++ b/router/java/test/junit/net/i2p/router/util/CachedIteratorCollectionTest.java
@@ -0,0 +1,799 @@
+package net.i2p.router.util;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+
+/* when using with JUnit5+Idea
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.DisplayName;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.fail;
+*/
+
+
+
+/**
+ * A set of tests to ensure that the CachedIteratorCollection class is
+ * functioning as intended
+ */
+
+public class CachedIteratorCollectionTest {
+
+    /* Add n-number of objects to the given CachedIteratorCollection object
+     *
+     */
+    private void AddNObjects(CachedIteratorCollection<String> a, int n) {
+        if (n > 0) {
+            for (int j = 0; j < n; j++) {
+                String s = "test" + j;
+                a.add(s);
+            }
+        } else {
+            throw new UnsupportedOperationException("Please use a positive integer");
+        }
+    }
+
+    private void AddNObjectsLL(LinkedList<String> a, int n) {
+        if (n > 0) {
+            for (int j = 0; j < n; j++) {
+                String s = "test" + j;
+                a.add(s);
+            }
+        } else {
+            throw new UnsupportedOperationException("Please use a positive integer");
+        }
+    }
+
+    //@DisplayName("Add 1 Element Test")
+    @Test
+    public void Add1Test() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 1);
+        String testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        while(testCollection1Itr.hasNext()) {
+            testString += testCollection1Itr.next();
+        }
+
+        assertEquals("test0", testString);
+        assertEquals(1, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 1);
+        testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        while(testCollection2Itr.hasNext()) {
+            testString += testCollection2Itr.next();
+        }
+
+        assertEquals("test0", testString);
+        assertEquals(1, testCollection2.size());
+        assertFalse(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+    }
+
+    //@DisplayName("Add 10 Elements Test")
+    @Test
+    public void Add10Test() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+        String testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        while(testCollection1Itr.hasNext()) {
+            testString += testCollection1Itr.next();
+        }
+
+        assertEquals("test0test1test2test3test4test5test6test7test8test9", testString);
+        assertEquals(10, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList OBject
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+        testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        while(testCollection2Itr.hasNext()) {
+            testString += testCollection2Itr.next();
+        }
+
+        assertEquals("test0test1test2test3test4test5test6test7test8test9", testString);
+        assertEquals(10, testCollection2.size());
+        assertFalse(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+    }
+
+    //@DisplayName("AddAll() Test")
+    @Test
+    public void AddAll() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        ArrayList<String> stringArrayList = new ArrayList<>();
+
+        for (int i = 0; i < 10; i++) {
+            String s = "test" + i;
+            stringArrayList.add(s);
+        }
+
+        testCollection1.addAll(stringArrayList);
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        String testString = "";
+
+        while(testCollection1Itr.hasNext()) {
+            testString += testCollection1Itr.next();
+        }
+
+        assertEquals("test0test1test2test3test4test5test6test7test8test9", testString);
+        assertEquals(10, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        stringArrayList = new ArrayList<>();
+
+        for (int i = 0; i < 10; i++) {
+            String s = "test" + i;
+            stringArrayList.add(s);
+        }
+
+        testCollection2.addAll(stringArrayList);
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        testString = "";
+
+        while(testCollection2Itr.hasNext()) {
+            testString += testCollection2Itr.next();
+        }
+
+        assertEquals("test0test1test2test3test4test5test6test7test8test9", testString);
+        assertEquals(10, testCollection2.size());
+        assertFalse(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+    }
+
+    //@DisplayName("Single Element Remove Test - Size 1 Collection")
+    @Test
+    public void SingleRemove() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 1);
+        String testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        while(testCollection1Itr.hasNext()) {
+            testString += testCollection1Itr.next();
+            testCollection1Itr.remove();
+        }
+
+        assertEquals("test0", testString);
+        assertEquals(0, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertTrue(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 1);
+        testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        while(testCollection2Itr.hasNext()) {
+            testString += testCollection2Itr.next();
+            testCollection2Itr.remove();
+        }
+
+        assertEquals("test0", testString);
+        assertEquals(0, testCollection2.size());
+        assertFalse(testCollection2Itr.hasNext());
+        assertTrue(testCollection2.isEmpty());
+    }
+
+    //@DisplayName("Single Element Remove From Start Test - Size 10 Collection")
+    @Test
+    public void RemoveFromStart() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+        String testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        String s = "";
+        while (testCollection1Itr.hasNext()) {
+            s = testCollection1Itr.next();
+            if (s.equals("test0")) {
+                testCollection1Itr.remove();
+            } else {
+                testString += s;
+            }
+        }
+
+        assertEquals("test1test2test3test4test5test6test7test8test9", testString);
+        assertEquals(9, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+        testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        s = "";
+        while (testCollection2Itr.hasNext()) {
+            s = testCollection2Itr.next();
+            if (s.equals("test0")) {
+                testCollection2Itr.remove();
+            } else {
+                testString += s;
+            }
+        }
+
+        assertEquals("test1test2test3test4test5test6test7test8test9", testString);
+        assertEquals(9, testCollection2.size());
+        assertFalse(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+    }
+
+    //@DisplayName("Single Element Remove From Middle Test")
+    @Test
+    public void RemoveFromMiddle() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+        String testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        String s = "";
+        while (testCollection1Itr.hasNext()) {
+            s = testCollection1Itr.next();
+            if (s.equals("test5")) {
+                testCollection1Itr.remove();
+            } else {
+                testString += s;
+            }
+        }
+
+        assertEquals("test0test1test2test3test4test6test7test8test9", testString);
+        assertEquals(9, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+        testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        s = "";
+        while (testCollection2Itr.hasNext()) {
+            s = testCollection2Itr.next();
+            if (s.equals("test5")) {
+                testCollection2Itr.remove();
+            } else {
+                testString += s;
+            }
+        }
+
+        assertEquals("test0test1test2test3test4test6test7test8test9", testString);
+        assertEquals(9, testCollection2.size());
+        assertFalse(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+    }
+
+    //@DisplayName("Multiple Elements Remove From Middle Test")
+    @Test
+    public void RemoveMultipleFromMiddle() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+        String testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        String s = "";
+        while (testCollection1Itr.hasNext()) {
+            s = testCollection1Itr.next();
+            if (s.equals("test5") || s.equals("test6")) {
+                testCollection1Itr.remove();
+            } else {
+                testString += s;
+            }
+        }
+
+        assertEquals("test0test1test2test3test4test7test8test9", testString);
+        assertEquals(8, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+        testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        s = "";
+        while (testCollection2Itr.hasNext()) {
+            s = testCollection2Itr.next();
+            if (s.equals("test5") || s.equals("test6")) {
+                testCollection2Itr.remove();
+            } else {
+                testString += s;
+            }
+        }
+
+        assertEquals(8, testCollection2.size());
+        assertEquals("test0test1test2test3test4test7test8test9", testString);
+        assertFalse(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+    }
+
+    //@DisplayName("Single Element Remove From End Test")
+    @Test
+    public void RemoveFromEnd() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+        String testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        String s = "";
+        while (testCollection1Itr.hasNext()) {
+            s = testCollection1Itr.next();
+            if (s.equals("test9")) {
+                testCollection1Itr.remove();
+            } else {
+                testString += s;
+            }
+        }
+
+        assertEquals("test0test1test2test3test4test5test6test7test8", testString);
+        assertEquals(9, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+        testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        s = "";
+        while (testCollection2Itr.hasNext()) {
+            s = testCollection2Itr.next();
+            if (s.equals("test9")) {
+                testCollection2Itr.remove();
+            } else {
+                testString += s;
+            }
+        }
+
+        assertEquals(9, testCollection2.size());
+        assertEquals("test0test1test2test3test4test5test6test7test8", testString);
+        assertFalse(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+    }
+
+    //@DisplayName("Remove All - Size 10 Collection")
+    @Test
+    public void RemoveAll() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+        String testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        assertEquals(10, testCollection1.size());
+        assertTrue(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Remove all test
+        while (testCollection1Itr.hasNext()) {
+            testCollection1Itr.next();
+            testCollection1Itr.remove();
+        }
+
+        assertEquals(0, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertTrue(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        assertEquals(10, testCollection2.size());
+        assertTrue(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+
+        // Remove all test
+        while (testCollection2Itr.hasNext()) {
+            testCollection2Itr.next();
+            testCollection2Itr.remove();
+        }
+
+        assertEquals(0, testCollection2.size());
+        assertFalse(testCollection2Itr.hasNext());
+        assertTrue(testCollection2.isEmpty());
+    }
+
+    //@DisplayName("Test Iterator Equality/Inequality")
+    @Test
+    public void Equality() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+        Iterator<String> testCollection1Itr1 = testCollection1.iterator();
+        Iterator<String> testCollection1Itr2 = testCollection1.iterator();
+        Iterator<String> testCollection1Itr3 = testCollection1.iterator();
+        Iterator<String> testCollection1Itr4 = testCollection1.iterator();
+
+        assertSame(testCollection1Itr1,testCollection1Itr2);
+        assertSame(testCollection1Itr2,testCollection1Itr3);
+        assertSame(testCollection1Itr3,testCollection1Itr4);
+
+        // LinkedList object's iterator should return different objects
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+        Iterator<String> testCollection2Itr1 = testCollection2.iterator();
+        Iterator<String> testCollection2Itr2 = testCollection2.iterator();
+        Iterator<String> testCollection2Itr3 = testCollection2.iterator();
+        Iterator<String> testCollection2Itr4 = testCollection2.iterator();
+
+        assertNotSame(testCollection2Itr1,testCollection2Itr2);
+        assertNotSame(testCollection2Itr2,testCollection2Itr3);
+        assertNotSame(testCollection2Itr3,testCollection2Itr4);
+    }
+
+    //@DisplayName("Restart Iterator Test")
+    @Test
+    public void Restart() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+
+        String testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        String s = "";
+        while(testCollection1Itr.hasNext()) {
+            testString += testCollection1Itr.next();
+        }
+
+        assertEquals("test0test1test2test3test4test5test6test7test8test9", testString);
+        assertEquals(10, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Restart Iterator
+        testCollection1Itr = testCollection1.iterator();
+
+        assertTrue("test0".equals(testCollection1Itr.next()));
+        assertEquals(10, testCollection1.size());
+        assertTrue(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+
+        testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        while(testCollection2Itr.hasNext()) {
+            testString += testCollection2Itr.next();
+        }
+
+        assertEquals("test0test1test2test3test4test5test6test7test8test9", testString);
+        assertEquals(10, testCollection2.size());
+        assertFalse(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+
+        // Restart Iterator
+        testCollection2Itr = testCollection2.iterator();
+
+        assertEquals(10, testCollection2.size());
+        assertTrue("test0".equals(testCollection2Itr.next()));
+        assertTrue(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+
+    }
+
+    //@DisplayName("Clear Test")
+    @Test
+    public void Clear() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+
+        String testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        assertEquals(10, testCollection1.size());
+        assertTrue(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Clear
+        testCollection1.clear();
+
+        assertEquals(0, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertTrue(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+
+        testString = "";
+
+        // Iterator test
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        assertEquals(10, testCollection2.size());
+        assertFalse(testCollection2.isEmpty());
+        assertTrue(testCollection2Itr.hasNext());
+
+        // Clear
+        testCollection2.clear();
+
+        assertEquals(0, testCollection2.size());
+        assertTrue(testCollection2.isEmpty());
+        assertFalse(testCollection2Itr.hasNext());
+    }
+
+    //@DisplayName("Remove Twice Before next() Test")
+    @Test
+    public void RemoveTwice() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+        testCollection1Itr.next();
+        testCollection1Itr.remove();
+        testCollection1Itr.next();
+        testCollection1Itr.remove();
+
+        /* Junit5 + java8+
+        assertThrows(IllegalStateException.class, () -> {
+            // Remove called once more here before a next()
+            testCollection1Itr.remove();
+        });
+        */
+
+        try {
+            testCollection1Itr.remove();
+            fail("Exception should be caught; This should not print.");
+        } catch (IllegalStateException e) {
+            System.out.println("RemoveTwice()+CachedIteratorCollection: IllegalStateException caught successfully." + e);
+        }
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+        testCollection2Itr.next();
+        testCollection2Itr.remove();
+        testCollection2Itr.next();
+        testCollection2Itr.remove();
+
+        /* Junit5 + java8+
+        assertThrows(IllegalStateException.class, () -> {
+            // Remove called once more here before a next()
+            testCollection2Itr.remove();
+        });
+        */
+
+        try {
+            testCollection2Itr.remove();
+            fail("Exception should be caught; This should not print.");
+        } catch (IllegalStateException e) {
+            System.out.println("RemoveTwice()+LinkedList: IllegalStateException caught successfully." + e);
+        }
+    }
+
+    //@DisplayName("next() When No Elements Left Test")
+    @Test
+    public void NextWhenNone() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        while(testCollection1Itr.hasNext()) {
+            testCollection1Itr.next();
+        }
+
+        assertEquals(10, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+        /* JUnit5 java8+
+        // next() should throw an exception as there are no more nodes
+        assertThrows(NoSuchElementException.class, () -> { testCollection1Itr.next(); });
+        */
+
+        try {
+            testCollection1Itr.next();
+            fail("Exception should be caught; This should not print.");
+        } catch (NoSuchElementException e) {
+            System.out.println("NextWhenNone()+CachedIteratorCollection: NoSuchElementException caught successfully." + e);
+        }
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        while(testCollection2Itr.hasNext()) {
+            testCollection2Itr.next();
+        }
+
+        assertEquals(10, testCollection2.size());
+        assertFalse(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+        /* JUnit5 java8+
+        // next() should throw an exception as there are no more nodes
+        assertThrows(NoSuchElementException.class, () -> { testCollection2Itr.next(); });
+        */
+
+        try {
+            testCollection2Itr.next();
+            fail("Exception should be caught; This should not print.");
+        } catch (NoSuchElementException e) {
+            System.out.println("NextWhenNone()+LinkedList: NoSuchElementException caught successfully." + e);
+        }
+    }
+
+    //@DisplayName("Add, Remove All and Add Again Test")
+    @Test
+    public void ReAdd() {
+        CachedIteratorCollection<String> testCollection1 = new CachedIteratorCollection<>();
+
+        AddNObjects(testCollection1, 10);
+
+        Iterator<String> testCollection1Itr = testCollection1.iterator();
+
+        String testString = "";
+
+        while (testCollection1Itr.hasNext()) {
+            testString += testCollection1Itr.next();
+        }
+
+        assertEquals("test0test1test2test3test4test5test6test7test8test9", testString);
+        assertEquals(10, testCollection1.size());
+
+        // Reset and remove all
+        testCollection1Itr = testCollection1.iterator();
+
+        while(testCollection1Itr.hasNext()) {
+            testCollection1Itr.next();
+            testCollection1Itr.remove();
+        }
+
+        assertEquals(0, testCollection1.size());
+        assertFalse(testCollection1Itr.hasNext());
+        assertTrue(testCollection1.isEmpty());
+
+        // Re-add
+        AddNObjects(testCollection1, 10);
+        testCollection1Itr = testCollection1.iterator();
+
+        assertEquals(10, testCollection1.size());
+        assertTrue("test0".equals(testCollection1Itr.next()));
+        assertTrue(testCollection1Itr.hasNext());
+        assertFalse(testCollection1.isEmpty());
+
+        // Compare behavior with LinkedList object
+        LinkedList<String> testCollection2 = new LinkedList<>();
+
+        AddNObjectsLL(testCollection2, 10);
+
+        Iterator<String> testCollection2Itr = testCollection2.iterator();
+
+        testString = "";
+
+        while (testCollection2Itr.hasNext()) {
+            testString += testCollection2Itr.next();
+        }
+
+        assertEquals("test0test1test2test3test4test5test6test7test8test9", testString);
+        assertEquals(10, testCollection2.size());
+
+        testCollection2Itr = testCollection2.iterator();
+
+        while(testCollection2Itr.hasNext()) {
+            testCollection2Itr.next();
+            testCollection2Itr.remove();
+        }
+
+        assertEquals(0, testCollection2.size());
+        assertFalse(testCollection2Itr.hasNext());
+        assertTrue(testCollection2.isEmpty());
+
+        // Re-add
+        AddNObjectsLL(testCollection2, 10);
+        testCollection2Itr = testCollection2.iterator();
+
+        assertEquals(10, testCollection2.size());
+        assertTrue("test0".equals(testCollection2Itr.next()));
+        assertTrue(testCollection2Itr.hasNext());
+        assertFalse(testCollection2.isEmpty());
+    }
+}