diff --git a/java/2-1-JavaBasic/Animals1.java b/java/2-1-JavaBasic/Animals1.java
new file mode 100644
index 0000000000000000000000000000000000000000..db059bd77bde9b3fabba954b193064babc75af6a
--- /dev/null
+++ b/java/2-1-JavaBasic/Animals1.java
@@ -0,0 +1,36 @@
+// Simple class hierarchy
+// Demonstrates abstract classes, containment
+
+public class Animals1 {
+
+    // inner classes
+    // base class
+    abstract class Animal {
+        abstract String talk();
+    }
+
+    // derived classes
+    class Cat extends Animal {
+        String talk() { return "Meow!"; }
+    }
+
+    class Dog extends Animal {
+        String talk() { return "Woof!"; }
+    }
+
+    // container class methods
+    Animals1() {
+        speak(new Cat());
+        speak(new Dog()); 
+    }
+
+    void speak(Animal a) {
+        System.out.println( a.talk() );
+    }
+
+    // static main methods -- entry point
+    public static void main(String[] args) {
+        Animals1 a = new Animals1();
+    }
+}
+
diff --git a/java/2-1-JavaBasic/Animals2.java b/java/2-1-JavaBasic/Animals2.java
new file mode 100644
index 0000000000000000000000000000000000000000..fb2cd4fcd154478ad908f0186028b890024b1442
--- /dev/null
+++ b/java/2-1-JavaBasic/Animals2.java
@@ -0,0 +1,35 @@
+// Simple class hierarchy
+// Contrasts interface and abstract class implementations
+
+public class Animals2 {
+
+    // interface
+    interface Pet { 
+        String talk();
+    }
+
+    // inner classes
+    class Cat implements Pet {
+        public String talk() { return "Meow!"; }
+    }
+
+    class Dog implements Pet {
+        public String talk() { return "Woof!"; }
+    }
+
+    // container class methods
+    Animals2() {
+        speak(new Cat());
+        speak(new Dog()); 
+    }
+
+    void speak(Pet a) {
+        System.out.println( a.talk() );
+    }
+
+    // static main methods -- entry point
+    public static void main(String[] args) {
+        Animals2 a = new Animals2();
+    }
+}
+
diff --git a/java/2-1-JavaBasic/Bicycle.java b/java/2-1-JavaBasic/Bicycle.java
new file mode 100644
index 0000000000000000000000000000000000000000..88edc06683ea41faa342103ed5fbe953dc3208e8
--- /dev/null
+++ b/java/2-1-JavaBasic/Bicycle.java
@@ -0,0 +1,30 @@
+
+class Bicycle { 
+    String owner = null;
+    int speed = 0;
+    int gear = 1;
+
+    // constructor
+    Bicycle() { }
+    Bicycle(String name) { owner = name; }
+
+    // methods
+    void changeSpeed(int newValue) { speed = newValue; }
+    void changeGear(int newValue) { gear = newValue; }
+    int  getSpeed() { return speed; }
+    int  getGear() { return gear; }
+    
+    // static entry point - main method
+    public static void main(String[] args) {
+
+        Bicycle adultBike = new Bicycle("Jeff");
+        adultBike.changeSpeed(20);
+        System.out.println("speed=" + adultBike.getSpeed());
+
+        Bicycle kidsBike = new Bicycle("Austin");
+        kidsBike.changeSpeed(15);
+        System.out.println("speed=" + kidsBike.getSpeed());
+    }    
+}
+
+
diff --git a/java/2-1-JavaBasic/Bikes1.java b/java/2-1-JavaBasic/Bikes1.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb4f11c2e739b609cb52396c6bb6987fc925a635
--- /dev/null
+++ b/java/2-1-JavaBasic/Bikes1.java
@@ -0,0 +1,46 @@
+// Simple class hierarchy
+// Demonstrates abstract classes and containment.
+
+// Bike container class
+class Bikes1 {
+
+	// base class
+	abstract class Bike {
+		int wheels = 0;
+		int speed = 0;
+
+		void setWheels(int val) { wheels = val; }
+		void setSpeed(int val) { speed = val; }
+		void show() {
+			System.out.println("wheels  = " + wheels);
+		}
+	}
+
+	// derived two-wheel bike
+	class Bicycle extends Bike {
+		Bicycle() { 
+			setWheels(2); 
+		}
+	}
+
+	// derived two-wheel bike
+	class Tricycle extends Bike {
+		Tricycle() { 
+			setWheels(3); 
+		}
+	}
+	
+	// container class
+	Bikes1() {
+		Bicycle b = new Bicycle();
+		b.show();
+
+		Tricycle t = new Tricycle();
+		t.show();
+	}
+
+	// entry point
+	public static void main(String[] args) {
+		Bikes1 b = new Bikes1();
+	}
+}
\ No newline at end of file
diff --git a/java/2-1-JavaBasic/Bikes2.java b/java/2-1-JavaBasic/Bikes2.java
new file mode 100644
index 0000000000000000000000000000000000000000..e10422d7d1c478681406f0f65b78e4f1b0b2b85d
--- /dev/null
+++ b/java/2-1-JavaBasic/Bikes2.java
@@ -0,0 +1,63 @@
+// Simple class hierarchy + interface
+// Demonstrates abstract classes, containment, interfaces.
+
+// Bike container class
+class Bikes2 {
+
+	// base class
+	abstract class Bike {
+		int wheels = 0;
+		int speed = 0;
+
+		void setWheels(int val) { wheels = val; }
+		void setSpeed(int val) { speed = val; }
+		void show() { 
+			System.out.println("wheels  = " + wheels);
+			System.out.println("speed  = " + speed);
+		}
+	}
+
+	// interface for ANYTHING driveable
+	// could be applied to car, scooter etc.
+	interface Driveable {
+		void accelerate();
+		void brake();
+	}
+
+	// derived two-wheel bike
+	class Bicycle extends Bike implements Driveable {
+
+		Bicycle() { setWheels(2); }
+
+		// interface methods
+		// need to make public to match access level for interface (above)
+		public void accelerate() { setSpeed(speed += 5); }
+		public void brake() { setSpeed(speed -= 5); }
+	}
+
+	// derived two-wheel bike
+	class Tricycle extends Bike implements Driveable {
+		Tricycle() { setWheels(3); }
+
+		// interface methods
+		// need to make public to match access level for interface (above)
+		public void accelerate() { setSpeed(speed += 1); }
+		public void brake() { setSpeed(speed -= 1); }		
+	}
+	
+	// container class
+	Bikes2() {
+		Bicycle b = new Bicycle();
+		b.accelerate();
+		b.show();
+
+		Tricycle t = new Tricycle();
+		t.accelerate();
+		t.show();
+	}
+
+	// entry point
+	public static void main(String[] args) {
+		Bikes2 b = new Bikes2();
+	}
+}
\ No newline at end of file
diff --git a/java/2-1-JavaBasic/Hello.java b/java/2-1-JavaBasic/Hello.java
new file mode 100644
index 0000000000000000000000000000000000000000..b99cbffdc30cd373fc080b5f806d06ed681bb2b3
--- /dev/null
+++ b/java/2-1-JavaBasic/Hello.java
@@ -0,0 +1,18 @@
+import javax.swing.*;
+import java.awt.Font;
+
+public class Hello extends JFrame {
+
+	public static void main(String args[]) {
+		new Hello();
+	}
+	
+	Hello() {
+		JLabel l = new JLabel("Hello Java");
+		l.setFont(new Font("Serif", Font.PLAIN, 24));
+		add(l);
+		setSize(200, 100);
+		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		setVisible(true);
+	}
+}
\ No newline at end of file
diff --git a/java/2-1-JavaBasic/makefile b/java/2-1-JavaBasic/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..71f98a178cc866af423780679563f790fc9e6b85
--- /dev/null
+++ b/java/2-1-JavaBasic/makefile
@@ -0,0 +1,15 @@
+# super simple makefile
+# call it using 'make NAME=name_of_code_file_without_extension'
+# (assumes a .java extension)
+NAME = "Hello"
+
+all:
+	@echo "Compiling..."
+	javac $(NAME).java
+
+run: all
+	@echo "Running..."
+	java $(NAME)
+
+clean:
+	rm -rf $(NAME).class