diff --git a/tests/edu/caltech/cs2/datastructures/LinkedDequeTests.java b/tests/edu/caltech/cs2/datastructures/LinkedDequeTests.java
index ad7d4ee4507161c0cd533de63e035c82621c0e1d..c6ba96114723da7a2d84c23eb1403663c438d832 100644
--- a/tests/edu/caltech/cs2/datastructures/LinkedDequeTests.java
+++ b/tests/edu/caltech/cs2/datastructures/LinkedDequeTests.java
@@ -1,6 +1,7 @@
 package edu.caltech.cs2.datastructures;
 
 import edu.caltech.cs2.helpers.Inspection;
+import edu.caltech.cs2.helpers.NodeChecker;
 import edu.caltech.cs2.helpers.Reflection;
 import edu.caltech.cs2.helpers.RuntimeInstrumentation;
 import edu.caltech.cs2.interfaces.ICollection;
@@ -12,14 +13,18 @@ import org.junit.jupiter.api.*;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.CsvSource;
 import org.junit.jupiter.params.provider.ValueSource;
+import org.junit.platform.engine.support.hierarchical.Node;
 
 import java.lang.reflect.Constructor;
+import java.sql.Ref;
 import java.util.*;
+import java.util.ArrayDeque;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
 import static edu.caltech.cs2.project03.Project03TestOrdering.*;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 @Tag("C")
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@@ -80,6 +85,13 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
     Reflection.assertNoPublicFields(LinkedDeque.class);
   }
 
+  @Order(classSpecificTestLevel)
+  @DisplayName("There are no protected fields")
+  @Test
+  public void testNoProtectedFields() {
+    Reflection.assertNoProtectedFields(LinkedDeque.class);
+  }
+
   @Order(classSpecificTestLevel)
   @DisplayName("The public interface is correct")
   @Test
@@ -109,6 +121,19 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
     Inspection.assertConstructorHygiene(LINKED_DEQUE_SOURCE);
   }
 
+  @Order(classSpecificTestLevel)
+  @DisplayName("Check for linked node class")
+  @Test
+  public void testLinkedNode() {
+    Class[] classes = LinkedDeque.class.getDeclaredClasses();
+    for (Class clazz : classes) {
+      if (Iterator.class.isAssignableFrom(clazz)) {
+        continue;
+      }
+      NodeChecker.isNode(clazz, true);
+    }
+  }
+
 
   // TOSTRING TESTS ---------------------------------------------------
 
@@ -257,4 +282,62 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
     RuntimeInstrumentation.assertAtMost("peekBack", RuntimeInstrumentation.ComplexityType.CONSTANT, provide, peekBack, 8);
   }
 
-}
\ No newline at end of file
+  @Order(dequeTestLevel)
+  @DisplayName("Cycle detection for addFront(...) and addBack(...)")
+  @ParameterizedTest(name = "Test cycles {1} random numbers with seed = {0}")
+  @CsvSource({
+          "69, 200", "20, 300"
+  })
+  public void checkForCycles(int seed, int size) {
+    Random r = new Random(seed);
+    Deque<Object> reference = new ArrayDeque<>();
+    IDeque<Object> impl = new LinkedDeque<>();
+    // Test that first peek is null
+    assertNull(impl.peekFront(), "empty peek should return null");
+    // Test adding values updates size and displays contained correctly
+    for (int i = 0; i < size; i++) {
+      int num = r.nextInt();
+      if (num % 2 == 0) {
+        reference.addLast(num);
+        impl.addBack(num);
+      }
+      else {
+        reference.addFirst(num);
+        impl.addFront(num);
+      }
+      NodeChecker.cycleDetection(impl, true);
+      assertEquals(reference.size(), impl.size(), "size()s are not equal");
+      assertEquals(reference.toString(), impl.toString(), "toStrings()s are not equal");
+    }
+  }
+
+  @Order(dequeTestLevel)
+  @DisplayName("Check reverses for addFront(...) and addBack(...)")
+  @ParameterizedTest(name = "Test reverse {1} random numbers with seed = {0}")
+  @CsvSource({
+          "31, 200", "64, 300"
+  })
+  public void checkReverses(int seed, int size) {
+    Random r = new Random(seed);
+    Deque<Object> reference = new ArrayDeque<>();
+    IDeque<Object> impl = new LinkedDeque<>();
+    // Test that first peek is null
+    assertNull(impl.peekFront(), "empty peek should return null");
+    // Test adding values updates size and displays contained correctly
+    for (int i = 0; i < size; i++) {
+      int num = r.nextInt();
+      if (num % 2 == 0) {
+        reference.addLast(num);
+        impl.addBack(num);
+      }
+      else {
+        reference.addFirst(num);
+        impl.addFront(num);
+      }
+      NodeChecker.checkReverse(impl);
+      assertEquals(reference.size(), impl.size(), "size()s are not equal");
+      assertEquals(reference.toString(), impl.toString(), "toStrings()s are not equal");
+    }
+  }
+
+}