diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/AnonymousDemo.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/AnonymousDemo.java
new file mode 100644
index 0000000000000000000000000000000000000000..47f37efbdf49158ffccf578a3cc70303b936c027
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/AnonymousDemo.java
@@ -0,0 +1,18 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture10;
+
+public class AnonymousDemo {
+
+  public static void main(String[] args) {
+
+    Object o = new Object();
+    Object o2 =
+        new Object() {
+          @Override
+          public String toString() {
+            return "Not An Object";
+          }
+        };
+    System.out.println(o.getClass());
+    System.out.println(o2.getClass());
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/AnonymousRepeater.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/AnonymousRepeater.java
new file mode 100644
index 0000000000000000000000000000000000000000..775ecc526bcfae8adb2fe1372d17f2cddc008164
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/AnonymousRepeater.java
@@ -0,0 +1,34 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture10;
+
+abstract class AnonymousRepeater {
+
+  abstract void doWork(int i);
+
+  void run(int count) {
+    for (int i = 0; i < count; i++) {
+      doWork(i);
+    }
+  }
+
+  public static void main(String[] args) {
+
+    int y = 3;
+    AnonymousRepeater r =
+        new AnonymousRepeater() {
+          @Override
+          void doWork(int i) {
+            System.out.println(i + y);
+          }
+        };
+    r.run(10);
+
+    AnonymousRepeater r2 =
+        new AnonymousRepeater() {
+          @Override
+          void doWork(int i) {
+            System.out.println("Not counting");
+          }
+        };
+    r2.run(10);
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/LambdaRepeater.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/LambdaRepeater.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c9d705b045c53ecadf7cc882029d0c118c218ba
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/LambdaRepeater.java
@@ -0,0 +1,25 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture10;
+
+interface Repeatable {
+  void doWork(int i);
+}
+
+public class LambdaRepeater {
+
+  private final Repeatable repeatable;
+
+  public LambdaRepeater(Repeatable repeatable) {
+    this.repeatable = repeatable;
+  }
+
+  void run(int c) {
+    for (int i = 0; i < c; i++) {
+      repeatable.doWork(i);
+    }
+  }
+
+  public static void main(String[] args) {
+    LambdaRepeater r = new LambdaRepeater(System.out::println);
+    r.run(10);
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/Outer.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/Outer.java
new file mode 100644
index 0000000000000000000000000000000000000000..dac09f96a2c6687464f184fa68ab5368d408b786
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/Outer.java
@@ -0,0 +1,55 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture10;
+
+public class Outer {
+  private static int y;
+  private int x;
+
+  static class StaticInner {
+    private int z;
+
+    void doStuff() {
+      z++;
+      Outer.y++;
+    }
+  }
+
+  class InstanceInner {
+    private int z;
+
+    void doStuff() {
+      z++;
+      x++;
+    }
+  }
+
+  InstanceInner doMoreStuff() {
+    StaticInner staticInner = new StaticInner();
+    staticInner.z++;
+
+    class MethodLocal {
+      void doThings() {
+        System.out.println(staticInner + " " + x);
+      }
+    }
+
+    MethodLocal m = new MethodLocal();
+    m.doThings();
+
+
+    return new InstanceInner();
+  }
+
+  public static void main(String[] args) {
+    Outer o = new Outer();
+    Outer.y = 5;
+    o.x = 4;
+
+    StaticInner i = new StaticInner();
+    i.doStuff();
+
+    InstanceInner i2 = o.doMoreStuff();
+    System.out.println(o.x);
+    i2.doStuff();
+    System.out.println(o.x);
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/Variance.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/Variance.java
new file mode 100644
index 0000000000000000000000000000000000000000..19277b888c2092ced89f28a97f4f3689b76ba6f2
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture10/Variance.java
@@ -0,0 +1,67 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture10;
+
+import java.util.List;
+
+class Polygon {}
+
+class Triangle extends Polygon {}
+
+class A {
+
+  void setShape(Triangle t) {
+    System.out.println("A.setShape()");
+  }
+
+  Polygon getShape() {
+    System.out.println("A.getShape()");
+    return new Polygon();
+  }
+}
+
+class B extends A {
+
+  @Override
+  void setShape(Triangle t) {
+    // ...
+  }
+
+  void setShape(Polygon t) {
+    System.out.println("B.setShape()");
+  }
+
+  @Override
+  Triangle getShape() {
+    System.out.println("B.getShape()");
+    return new Triangle();
+  }
+}
+
+public class Variance {
+
+  static void drawShape(Polygon shape) {
+    System.out.println("It's a " + shape.getClass().getSimpleName());
+  }
+
+  static void process(A o) {
+    drawShape(o.getShape());
+    o.setShape(new Triangle());
+  }
+
+  static void array() {
+    String[] s = new String[] {"a", "b", "c"};
+    Object[] o = s;
+    Object v = o[0];
+    o[1] = new Triangle(); // causes a runtime exception
+  }
+
+  public static void main(String[] args) {
+    A a = new A();
+    B b = new B();
+    process(b);
+
+    List<String> s = List.of("a", "b", "c");
+    List<? extends Object> o = s;
+    Object v = o.get(0);
+    //    o.set(1,new Triangle()); - doesn't compile
+  }
+}