diff --git a/CourseExamples/src/TcpExamples/TcpExample4Client.java b/CourseExamples/src/TcpExamples/TcpExample4Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..29b996c84214dcc0463c88214dfa7bede9c463b5
--- /dev/null
+++ b/CourseExamples/src/TcpExamples/TcpExample4Client.java
@@ -0,0 +1,61 @@
+package TcpExamples;
+
+import java.io.*;
+import java.net.*;
+//import java.time.LocalTime; // conversion?
+
+/**
+ * This is a slightly different client. It establishes a connection
+ * to the server, then checks how long it takes to read the single
+ * line it expects.
+ * 
+ * @author mcgredo
+ */
+public class TcpExample4Client 
+{
+    public static void main(String[] args) 
+    {
+        try
+        {
+			System.out.println("TcpExample4Client start");
+			System.out.println("==================================================");
+			for (int loopCount=1; loopCount <= 4; loopCount++) // loop 4 times
+			{
+				System.out.println("TcpExample4Client creating socket #" + loopCount + "...");
+
+				// We request an IP to connect to ("localhost") and
+				// port number at that IP (2317). This establishes
+				// a connection to that IP in the form of the Socket
+				// object; the server uses a ServerSocket to wait for
+				// connections.This particualar example is interacting
+				// with what it expects is a server that writes a single text
+				// line after 10 sec.
+				long startTime = System.currentTimeMillis();
+
+				Socket socket = new Socket("localhost", 2317); 
+
+				// Read the single line written by the server. We'd
+				// do things a bit differently if many lines to be read
+				// from the server, instead of one only.
+				InputStream       is  = socket.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader     br = new BufferedReader(isr);
+
+				String serverMessage = br.readLine();
+				long   readTime = System.currentTimeMillis();
+				long timeLength = readTime - startTime;
+
+				System.out.println("TcpExample4Client: message received from server=" + serverMessage);
+				System.out.println("TcpExample4Client: time msec required for read=" + timeLength);
+				System.out.println("==================================================");
+				// To push this further, launch multiple copies of TcpExample4Client simultaneously
+			}
+			System.out.println("TcpExample4Client complete");
+        }
+        catch(IOException e)
+        {
+            System.out.println("Problem with TcpExample4Client, see exception trace:");
+            System.out.println(e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/CourseExamples/src/TcpExamples/TcpExample4HandlerThread.java b/CourseExamples/src/TcpExamples/TcpExample4HandlerThread.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a14d484f4064c2ec5a8b23bf61f4eb4958bcaca
--- /dev/null
+++ b/CourseExamples/src/TcpExamples/TcpExample4HandlerThread.java
@@ -0,0 +1,63 @@
+
+
+package TcpExamples;
+
+import java.io.*;
+import java.net.*;
+
+/**
+ * Handles all the logic associated with one connection
+ * by running in a thread of its own. This is the server
+ * portion as well, so we artifically invent what happens
+ * if the server can't respond to a connection for 10 sec.
+ * 
+ * @author Don McGregor
+ */
+
+public class TcpExample4HandlerThread extends Thread
+{
+    /** The socket connection to a client */
+    Socket socket;
+    
+    /** The thread constructor creates the socket from
+     * a ServerSocket, and passes one to the thread
+     * responsible for handling the connection.
+     * 
+     * @param socket The socket connection handled by this thread
+     */
+    public TcpExample4HandlerThread(Socket socket)
+    {
+        this.socket = socket;
+    }
+    
+    /** Handles one connection. We add an artificial slowness
+     * to handling the connection with a sleep(). This means
+     * the client won't see a server connection response for ten seconds (default).
+     */
+	// @overriding run() method in Java Thread class is deliberate
+	@Override 
+    public void run()
+    {
+        try
+        {
+            System.out.println("TcpExample4HandlerThread starting to handle a thread...");
+            // get the connection output stream, then wait a period of time. 
+             OutputStream os = socket.getOutputStream();
+              PrintStream ps = new PrintStream(os);
+
+			 final long TIMEOUT = 10000; // 10000 milliseconds = 10 seconds
+			 System.out.println("TcpExample4HandlerThread pausing for TIMEOUT=" + TIMEOUT + "ms"); // debug
+             Thread.sleep(TIMEOUT); // 10 seconds
+                
+            ps.println("This was written by the server TcpExample4HandlerThread");
+            ps.flush();
+            socket.close();
+            System.out.println("TcpExample4HandlerThread finished handling a thread, now exit.");
+        }
+        catch(IOException | InterruptedException e) // either a networking or a threading problem
+        {
+            System.out.println("Problem with TcpExample4HandlerThread, see exception trace:");
+            System.out.println(e);
+        }
+    }
+}
diff --git a/CourseExamples/src/TcpExamples/TcpExample4TerminalLog.txt b/CourseExamples/src/TcpExamples/TcpExample4TerminalLog.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3ea4cf200c613644dbae662b5aa3e9350aa92081
--- /dev/null
+++ b/CourseExamples/src/TcpExamples/TcpExample4TerminalLog.txt
@@ -0,0 +1,58 @@
+Invocation instructions:
+* run/debug TcpExample4ThreadServer.java
+* don't run TcpExample4HandlerThread since it is launched as needed
+* run/debug TcpExample4Client.java
+
+Program responses:
+
+===================================================
+run:
+TcpExample4ThreadServer ready to accept socket connections...
+=============================================================
+TcpExample4ThreadServer.handlerThread invocation for connection #1...
+TcpExample4ThreadServer.handlerThread is launched, awaiting another connection...
+TcpExample4HandlerThread starting to handle a thread...
+TcpExample4HandlerThread pausing for TIMEOUT=10000ms
+TcpExample4HandlerThread finished handling a thread, now exit.
+=============================================================
+TcpExample4ThreadServer.handlerThread invocation for connection #2...
+TcpExample4ThreadServer.handlerThread is launched, awaiting another connection...
+TcpExample4HandlerThread starting to handle a thread...
+TcpExample4HandlerThread pausing for TIMEOUT=10000ms
+TcpExample4HandlerThread finished handling a thread, now exit.
+=============================================================
+TcpExample4ThreadServer.handlerThread invocation for connection #3...
+TcpExample4ThreadServer.handlerThread is launched, awaiting another connection...
+TcpExample4HandlerThread starting to handle a thread...
+TcpExample4HandlerThread pausing for TIMEOUT=10000ms
+TcpExample4HandlerThread finished handling a thread, now exit.
+=============================================================
+TcpExample4ThreadServer.handlerThread invocation for connection #4...
+TcpExample4ThreadServer.handlerThread is launched, awaiting another connection...
+TcpExample4HandlerThread starting to handle a thread...
+TcpExample4HandlerThread pausing for TIMEOUT=10000ms
+TcpExample4HandlerThread finished handling a thread, now exit.
+BUILD STOPPED (total time: 1 minute 7 seconds)
+
+===================================================
+run:
+TcpExample4Client start
+==================================================
+TcpExample4Client creating socket #1...
+TcpExample4Client: message received from server=This was written by the server TcpExample4HandlerThread
+TcpExample4Client: time msec required for read=10021
+==================================================
+TcpExample4Client creating socket #2...
+TcpExample4Client: message received from server=This was written by the server TcpExample4HandlerThread
+TcpExample4Client: time msec required for read=10002
+==================================================
+TcpExample4Client creating socket #3...
+TcpExample4Client: message received from server=This was written by the server TcpExample4HandlerThread
+TcpExample4Client: time msec required for read=10001
+==================================================
+TcpExample4Client creating socket #4...
+TcpExample4Client: message received from server=This was written by the server TcpExample4HandlerThread
+TcpExample4Client: time msec required for read=10003
+==================================================
+TcpExample4Client complete
+BUILD SUCCESSFUL (total time: 40 seconds)
diff --git a/CourseExamples/src/TcpExamples/TcpExample4ThreadServer.java b/CourseExamples/src/TcpExamples/TcpExample4ThreadServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d2c90eae22b0e08239f65e503877cd39614103c
--- /dev/null
+++ b/CourseExamples/src/TcpExamples/TcpExample4ThreadServer.java
@@ -0,0 +1,42 @@
+package TcpExamples;
+
+import java.io.IOException;
+import java.net.*;
+
+/**
+ * An example of using threads to handle multiple connections
+ * at the same time. 
+ * 
+ * @author mcgredo
+ */
+public class TcpExample4ThreadServer {
+    
+    public static void main(String[] args) // execution starts here
+    {
+      try
+        {
+            ServerSocket serverSocket = new ServerSocket(2317);
+			
+			int connectionCount = 0; // state variable
+            
+			System.out.println("TcpExample4ThreadServer ready to accept socket connections...");
+            while(true) // infinite loop
+            {
+                Socket clientConnection = serverSocket.accept(); // block until connected
+
+				connectionCount++; // unblocked, got another connection
+				System.out.println("=============================================================");
+            	System.out.println("TcpExample4ThreadServer.handlerThread invocation for connection #" + connectionCount + "...");
+                TcpExample4HandlerThread handlerThread = new TcpExample4HandlerThread(clientConnection);
+                handlerThread.start(); // invokes the run() method in that object
+				System.out.println("TcpExample4ThreadServer.handlerThread is launched, awaiting another connection...");
+			}          
+        }
+        catch(IOException e)
+        {
+            System.out.println("Problem with TcpExample4ThreadServer, see exception trace:");
+            System.out.println("Error: " + e);
+        }
+		System.out.println("=============================================================");
+    }
+}