diff --git a/exercises/client-server/TCPClient.java b/exercises/client-server/TCPClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..3177b2f8b8ebf3e27e56e1dd0102b69a2c6013d4
--- /dev/null
+++ b/exercises/client-server/TCPClient.java
@@ -0,0 +1,37 @@
+package Client;
+
+import java.io.PrintStream;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.net.Socket;
+
+public class TCPClient {
+	public static void main(String args[]) throws IOException {
+		int PORT = 12345;
+		String HOST = "127.0.0.1";
+
+		Socket socket = new Socket(HOST, PORT);
+
+		PrintStream out = new PrintStream(socket.getOutputStream());
+
+		// BufferedReader reads Keyboard Input
+		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+		BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
+
+		while (true) { // ^D will close dialogue
+			System.out.print("> ");
+			String message = keyboard.readLine();
+			if (message == null)
+				break;
+			out.println(message);
+
+			String answer = in.readLine();
+			System.out.println("echo: " + answer);
+		}
+		in.close();
+		keyboard.close();
+		out.close();
+		socket.close();
+	}
+}
diff --git a/exercises/client-server/TCPServer.java b/exercises/client-server/TCPServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..befc2481b4670c8a5043c5f43da6d3fc5aa7dc90
--- /dev/null
+++ b/exercises/client-server/TCPServer.java
@@ -0,0 +1,39 @@
+package Server;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+public class TCPServer {
+    public static void main(String args[]) throws IOException {
+        int PORT = 12345;
+        ServerSocket listen = new ServerSocket(PORT); // set port
+        System.out.printf("Listening on the port: %d\n", PORT);
+        while (true) { // non-terminating server
+
+            Socket socket = listen.accept();
+            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+
+            PrintStream out = new PrintStream(socket.getOutputStream());
+
+            while (true) { // end of input stream will close dialogue
+
+                String message = in.readLine();
+
+                if (message == null) {
+                    break;
+                }
+
+                String answer = message.replace('i', 'o');
+                out.println(answer);
+            }
+            in.close();
+            out.close();
+            socket.close(); // close connection
+            System.out.println("Socket closed.");
+        }
+    }
+}
diff --git a/exercises/monitor_java/Makefile b/exercises/monitor_java/Makefile
deleted file mode 100644
index 530fdc8af97a3f48028333d6c1973756a8d497db..0000000000000000000000000000000000000000
--- a/exercises/monitor_java/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-JFLAGS = -g
-JC = javac
-JVM= java
-
-.SUFFIXES: .java .class
-.java.class:
-	$(JC) $(JFLAGS) $*.java
-
-MAIN = SynchronizedCounter
-
-CLASSES = SynchronizedCounter.java 
-
-default: classes
-
-classes: $(CLASSES:.java=.class)
-
-.PHONY: run clean
-run: $(MAIN).class
-	$(JVM) $(MAIN)
-
-clean:
-	$(RM) *.class
diff --git a/exercises/monitor_java/SynchronizedCounter.java b/exercises/monitor_java/SynchronizedCounter.java
deleted file mode 100644
index 3417640696f4d3942e8f340de0244e021932e4bf..0000000000000000000000000000000000000000
--- a/exercises/monitor_java/SynchronizedCounter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-class Count {
-  // synchronized block
-    synchronized void displayCounting(int n, int threadId) {
-        for (int i = 1; i <= n; i++) {
-            System.out.printf("Thread %d: %d\n", threadId, i);
-            try {
-                // sleep for 500 milliseconds
-                Thread.sleep(500);
-            } catch (Exception e) {
-                System.out.println(e);
-            }
-        }
-    }
-}
-
-// Thread 1
-class Thread_A extends Thread {
-    Count c;
-    Thread_A(Count c) {
-        this.c = c;
-    }
-    public void run() {
-        c.displayCounting(5, 1);
-    }
-}
-
-// Thread 2
-class Thread_B extends Thread {
-    Count c;
-    Thread_B(Count c) {
-        this.c = c;
-    }
-    public void run() {
-        c.displayCounting(5, 2);
-    }
-}
-
-public class SynchronizedCounter {
-    public static void main(String args[]) {
-        Count obj = new Count();  
-        Thread_A t1 = new Thread_A(obj);
-        Thread_B t2 = new Thread_B(obj);
-        t1.start();
-        t2.start();
-    }
-}