diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/A.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/A.java
new file mode 100644
index 0000000000000000000000000000000000000000..8bcd9fceb70098c8d423fb6b328b50e153744558
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/A.java
@@ -0,0 +1,9 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture4;
+
+class A {
+  int x;
+
+  A(int x) {
+    this.x = x;
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/ArrayReferences.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/ArrayReferences.java
new file mode 100644
index 0000000000000000000000000000000000000000..c57cc56cbd3e9475a279a175cc612200eb4789e5
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/ArrayReferences.java
@@ -0,0 +1,21 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture4;
+
+import java.util.Arrays;
+
+public class ArrayReferences {
+
+  private static int a(int[] x) {
+    return x[0] + 1;
+  }
+
+  private static void b(int[] x) {
+    x[0] = x[0] + 1;
+  }
+
+  public static void main(String[] args) {
+    int[] x = new int[] {1};
+    int ax = a(x);
+    b(x);
+    System.out.printf("%d, %s%n", ax, Arrays.toString(x));
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/ClassReferences.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/ClassReferences.java
new file mode 100644
index 0000000000000000000000000000000000000000..86961243ca1d1f0116e281d8bfbcf50e52bf31b9
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/ClassReferences.java
@@ -0,0 +1,19 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture4;
+
+public class ClassReferences {
+
+  private static int a(A a) {
+    return a.x + 4;
+  }
+
+  private static void b(A a) {
+    a.x += 4;
+  }
+
+  public static void main(String[] args) {
+    A object = new A(4);
+    int x = a(object);
+    b(object);
+    System.out.printf("%d, %d%n", x, object.x);
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/ListReferences.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/ListReferences.java
new file mode 100644
index 0000000000000000000000000000000000000000..7012eeb55f5cabf6974c4650ec92c58d57f2dbd8
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/ListReferences.java
@@ -0,0 +1,24 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture4;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class ListReferences {
+
+  private static List<String> a(List<String> l) {
+    List<String> r = l;
+    r.set(0, r.get(1));
+    return r;
+  }
+
+  private static void b(List<String> l) {
+    l.set(0, l.get(0).toUpperCase());
+  }
+
+  public static void main(String[] args) {
+    List<String> strings = Arrays.asList("Java", "is", "cool");
+    List<String> next = a(strings);
+    b(strings);
+    System.out.printf("%s, %s%n", next, strings);
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/PrimitiveReferences.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/PrimitiveReferences.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc756420a0fd7b5447b66295f580a8c918ef5e6e
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture4/PrimitiveReferences.java
@@ -0,0 +1,19 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture4;
+
+public class PrimitiveReferences {
+
+  private static int a(int x) {
+    return x + 4;
+  }
+
+  private static void b(int x) {
+    x += 4;
+  }
+
+  public static void main(String[] args) {
+    int x = 1;
+    int ax = a(x);
+    b(x);
+    System.out.printf("%d, %d%n", ax, x);
+  }
+}