diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/AutoBoxing.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/AutoBoxing.java
new file mode 100644
index 0000000000000000000000000000000000000000..e654213a9775793613b9cf0e65aa6284860e8c78
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/AutoBoxing.java
@@ -0,0 +1,29 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture8;
+
+public class AutoBoxing {
+
+  private static void takesPrimitive(int i) {
+    int j = i+1;
+    System.out.println(j);
+  }
+
+  private static void takesObject(Integer i) {
+    int j = i+1;
+    System.out.println(j);
+  }
+
+  public static void main(String[] args) {
+    int i =1;
+    takesPrimitive(i); // just pass int by value
+    takesObject(i); // autobox int to Integer
+
+    Integer j = new Integer(2);
+    takesPrimitive(j); // autounbox Integer to int
+    takesObject(j); // just pass reference to j by value
+
+    Integer k = null;
+    takesPrimitive(k); // attempt to unbox null to an int
+    takesObject(k);
+
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/Collections.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/Collections.java
new file mode 100644
index 0000000000000000000000000000000000000000..b71333d4b4354ad03c6c6d269bb77ed64f5e98d4
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/Collections.java
@@ -0,0 +1,112 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture8;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.PriorityQueue;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+public class Collections {
+
+  private static void sets() {
+    HashSet<String> set1 = new HashSet<>();
+    set1.add("a1");
+    set1.add("c2");
+    set1.add("c2");
+    set1.add("c2");
+    set1.add("b3");
+    set1.add("d4");
+    set1.add("e5");
+    System.out.println(set1);
+  }
+
+  private static void sets2() {
+    TreeSet<String> set1 = new TreeSet<>();
+    set1.add("a1");
+    set1.add("c2");
+    set1.add("c2");
+    set1.add("c2");
+    set1.add("b3");
+    set1.add("d4");
+    set1.add("e5");
+    System.out.println(set1);
+    System.out.println(set1.contains("b3"));
+    System.out.println(set1.contains("b4"));
+  }
+
+  private static void sets3() {
+    LinkedHashSet<String> set1 = new LinkedHashSet<>();
+    set1.add("a1");
+    set1.add("c2");
+    set1.add("c2");
+    set1.add("c2");
+    set1.add("b3");
+    set1.add("d4");
+    set1.add("e5");
+    System.out.println(set1);
+    System.out.println(set1.contains("b3"));
+    System.out.println(set1.contains("b4"));
+  }
+
+  private static void list() {
+    ArrayList<String> list = new ArrayList<>();
+    list.add("a1");
+    list.add("c2");
+    list.add("c2");
+    list.add("c2");
+    list.add("b3");
+    list.add("d4");
+    list.add("e5");
+    System.out.println(list);
+    list.get(2);
+    list.remove(0);
+  }
+
+  private static void queue() {
+    PriorityQueue<String> queue = new PriorityQueue<>();
+    queue.offer("b");
+    queue.offer("a");
+    System.out.println(queue.poll());
+    System.out.println(queue.poll());
+  }
+
+  private static void map() {
+    HashMap<String, Integer> map = new HashMap<>();
+    map.put("a1sadsaklm", 1);
+    map.put("b2skslm23", 2);
+    map.put("c3caWS", 2);
+    map.put("c3caWS", 1);
+    map.put("d4BGHTSS", 1);
+    map.put("e5as122", 1);
+    System.out.println(map);
+  }
+
+  private static void map2() {
+    TreeMap<String, Integer> map = new TreeMap<>();
+    map.put("c3caWS", 1);
+    map.put("d4BGHTSS", 1);
+    map.put("a1sadsaklm", 1);
+    map.put("b2skslm23", 2);
+    map.put("c3caWS", 2);
+    map.put("e5as122", 1);
+    map.put("not null", null);
+    System.out.println(map);
+    map.get("c3caWS"); // 2
+    map.get("not here"); // null
+    if (map.containsKey("not here")) {
+      System.out.println("The key was there");
+    }
+  }
+
+  public static void main(String[] args) {
+    sets();
+    sets2();
+    sets3();
+    list();
+    queue();
+    map();
+    map2();
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/FailFast.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/FailFast.java
new file mode 100644
index 0000000000000000000000000000000000000000..487d8f82f906e6e0d2819a528233abc33a868eb7
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/FailFast.java
@@ -0,0 +1,47 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture8;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class FailFast {
+
+  public static void main(String[] args) {
+    List<Integer> l = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6));
+    List<String> s = new ArrayList<>(List.of("a", "b", "c", "d", "e", "f"));
+
+    for (int i = 0; i < l.size(); i++) {
+      Integer v1 = l.get(i);
+      String v2 = s.get(i);
+      System.out.println(v1 + " " + v2);
+    }
+
+    for (Integer v1 : l) {
+      System.out.println(v1);
+    }
+
+    Iterator<Integer> step1 = l.iterator();
+    Iterator<String> step2 = s.iterator();
+    while (step1.hasNext() && step2.hasNext()) {
+      Integer v1 = step1.next();
+      String v2 = step2.next();
+      System.out.println(v1 + " " + v2);
+    }
+
+    int i = 0;
+    for (Integer v : l) {
+      if (i++ == 1) {
+        l.remove(i);
+      }
+    }
+
+    Iterator<Integer> step3 = l.iterator();
+    int j = 0;
+    while (step3.hasNext()) {
+      Integer v = step3.next();
+      if (j++ == 1) {
+        step3.remove();
+      }
+    }
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/ReturnType.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/ReturnType.java
new file mode 100644
index 0000000000000000000000000000000000000000..f44686415de87fed4a528989a4d8ab6083e1ade6
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture8/ReturnType.java
@@ -0,0 +1,30 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture8;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+public class ReturnType {
+
+  private static SortedSet<Integer> collect(Iterable<Integer> i) {
+    TreeSet<Integer> treeSet = new TreeSet<>();
+    for (Integer value : i) {
+      treeSet.add(value);
+    }
+    return treeSet;
+  }
+
+  public static void main(String[] args) {
+
+    ArrayList<Integer> list = new ArrayList(List.of(4, 2, 1, 1, 1, 6));
+    System.out.println(collect(list));
+
+    Set<Integer> integerSet = new HashSet<>();
+    integerSet.add(1);
+    integerSet.add(3);
+    System.out.println(collect(integerSet));
+  }
+}