diff --git a/src/edu/nps/moves/dis7/utilities/DisThreadedNetworkInterface.java b/src/edu/nps/moves/dis7/utilities/DisThreadedNetworkInterface.java
index 8250f51b884397e0248505cff7dd7f3ce15c910d..465947f59ac79482536cb1a7bae8e6c05a22caca 100644
--- a/src/edu/nps/moves/dis7/utilities/DisThreadedNetworkInterface.java
+++ b/src/edu/nps/moves/dis7/utilities/DisThreadedNetworkInterface.java
@@ -309,25 +309,25 @@ public class DisThreadedNetworkInterface
     {
         if (receiveThread == null)
         {
-//          System.out.println("DisThreadedNetworkInterface createThreads() start receiveThread...");
+//          System.out.println(TRACE_PREFIX + "createThreads() start receiveThread...");
             receiveThread = new Thread(receiveThreadRunnable, "receiveThread");
             // https://stackoverflow.com/questions/2213340/what-is-a-daemon-thread-in-java
             receiveThread.setDaemon(false); // user thread, not system thread
             receiveThread.setPriority(Thread.NORM_PRIORITY);
             receiveThread.start();
         }
-        System.out.println("DisThreadedNetworkInterface createThreads() receiveThread.isAlive()=" + receiveThread.isAlive());
+        System.out.println(TRACE_PREFIX + "createThreads() receiveThread.isAlive()=" + receiveThread.isAlive());
 
         if (sendingThread == null)
         {
-//          System.out.println("DisThreadedNetworkInterface createThreads() start sendingThread...");
+//          System.out.println(TRACE_PREFIX + "createThreads() start sendingThread...");
             sendingThread = new Thread(sendingThreadRunnable, "sendingThread");
             // https://stackoverflow.com/questions/2213340/what-is-a-daemon-thread-in-java
             sendingThread.setDaemon(false); // user thread, not system thread
             sendingThread.setPriority(Thread.NORM_PRIORITY);
             sendingThread.start();
         }
-        System.out.println("DisThreadedNetworkInterface createThreads() sendingThread.isAlive()=" + receiveThread.isAlive());
+        System.out.println(TRACE_PREFIX + "createThreads() sendingThread.isAlive()=" + receiveThread.isAlive());
     }
     /**
      * Can be used to restart DisThreadedNetworkInterface if closed.
@@ -570,7 +570,7 @@ public class DisThreadedNetworkInterface
              dos.flush();      // immediately force pdu write, if any remain
             baos.close();
              dos.close();
-            System.out.println ("*** DisThreadedNetworkInterface close():" + 
+            System.out.println (TRACE_PREFIX + "close():" + 
                     " pdus2send.size()=" + pdus2send.size() +
                     " baos.size()=" + baos.size() + " dos.size()=" + dos.size());
              
@@ -603,7 +603,7 @@ public class DisThreadedNetworkInterface
         }
         catch (Exception e)
         {
-            System.err.println ("*** DisThreadedNetworkInterface close()() unexpected exception!");
+            System.err.println (TRACE_PREFIX + "close()() unexpected exception!");
         }
     }
     public void killThread(Thread threadToKill)
@@ -618,7 +618,7 @@ public class DisThreadedNetworkInterface
             }
             catch (InterruptedException ie)
             {
-                System.err.println ("*** DisThreadedNetworkInterface threadToKill join() failed to wait for threadToKill to die");
+                System.err.println (TRACE_PREFIX + "threadToKill join() failed to wait for threadToKill to die");
                 System.err.flush();
                 ie.printStackTrace(System.err);
             }
@@ -822,31 +822,14 @@ public class DisThreadedNetworkInterface
         TRACE_PREFIX = "[" + (DisThreadedNetworkInterface.class.getSimpleName() + " " + descriptor).trim() + "] ";
     }
     
-    /**
-     * Main method for testing.
-     * @see <a href="https://docs.oracle.com/javase/tutorial/getStarted/application/index.html">Java Tutorials: A Closer Look at the "Hello World!" Application</a>
-     * @param args [address, port, descriptor] command-line arguments are an array of optional String parameters that are passed from execution environment during invocation
-     */
-    public static void main(String[] args)
+    private void selfTest()
     {
-        DisThreadedNetworkInterface disThreadedNetworkInterface;
-          
-        System.out.println("*** DisThreadedNetworkInterface main() self test started...");
-        
-        String selfTestDescriptor = "main() self test";
-        if ((args != null) && args.length == 3)
-             selfTestDescriptor = args[2];
-        if ((args == null) || (args.length == 0))
-             disThreadedNetworkInterface = new DisThreadedNetworkInterface( /* default address, port */ selfTestDescriptor);
-        else disThreadedNetworkInterface = new DisThreadedNetworkInterface(args[0], Integer.parseInt(args[1]), selfTestDescriptor);
-        
-        System.out.println("*** DisThreadedNetworkInterface main() self test initialized...");
-        
+        System.out.println(TRACE_PREFIX + "main() self test initialized...");
         try
         {
             EntityStatePdu espdu = new EntityStatePdu();
             espdu.setMarking("self test");
-            disThreadedNetworkInterface.setVerbose(true);
+            setVerbose(true);
             DisThreadedNetworkInterface.PduListener pduListener;
             pduListener = new DisThreadedNetworkInterface.PduListener()
             {
@@ -854,32 +837,52 @@ public class DisThreadedNetworkInterface
                 @Override
                 public void incomingPdu(Pdu newPdu)
                 {
-                    System.out.println( "*** DisThreadedNetworkInterface main() pduListener.incomingPdu() received newPdu " + newPdu.getPduType().toString());
+                    System.out.println(TRACE_PREFIX + "main() pduListener.incomingPdu() received newPdu " + newPdu.getPduType().toString());
                     System.out.flush();
                 }
             };
-            disThreadedNetworkInterface.addListener(pduListener);
+            addListener(pduListener);
 
-            System.out.println("*** DisThreadedNetworkInterface main() self test sending espdu...");
-            disThreadedNetworkInterface.send(espdu);
+            System.out.println(TRACE_PREFIX + "self test sending espdu...");
+            send(espdu);
             // briefly wait get response from threaded receiver
-            Thread.sleep(500L);
+            Thread.sleep(100L);
             System.out.flush();
             System.err.flush();
             // all done, close() in finally block
         }
         catch(InterruptedException ex)
         {
-            System.out.println("*** DisThreadedNetworkInterface main() self test InterruptedException " + ex.getMessage());
+            System.out.println("[DisThreadedNetworkInterface] main() self test InterruptedException " + ex.getMessage());
         }
         finally // carefully clean up following regular completion and any interruptions  
         {
-            if (disThreadedNetworkInterface != null)
-                disThreadedNetworkInterface.close();
+            close();
 
             System.out.flush();
             System.err.flush();
-            System.out.println("*** DisThreadedNetworkInterface main() self test complete.");
+            System.out.println("[DisThreadedNetworkInterface] main() self test complete.");
         }
     }
+    
+    /**
+     * Main method provides support for testing.
+     * @see <a href="https://docs.oracle.com/javase/tutorial/getStarted/application/index.html">Java Tutorials: A Closer Look at the "Hello World!" Application</a>
+     * @param args [address, port, descriptor] command-line arguments are an array of optional String parameters that are passed from execution environment during invocation
+     */
+    public static void main(String[] args)
+    {
+        System.out.println("[DisThreadedNetworkInterface] main() started...");
+
+        DisThreadedNetworkInterface disThreadedNetworkInterface;
+        
+        String selfTestDescriptor = "main() self test";
+        if ((args != null) && args.length == 3)
+             selfTestDescriptor = args[2];
+        if ((args == null) || (args.length == 0))
+             disThreadedNetworkInterface = new DisThreadedNetworkInterface( /* default address, port */ selfTestDescriptor);
+        else disThreadedNetworkInterface = new DisThreadedNetworkInterface(args[0], Integer.parseInt(args[1]), selfTestDescriptor);
+        
+        disThreadedNetworkInterface.selfTest();
+    }
 }
diff --git a/src/edu/nps/moves/dis7/utilities/DisThreadedNetworkInterfaceSelfTestLog.txt b/src/edu/nps/moves/dis7/utilities/DisThreadedNetworkInterfaceSelfTestLog.txt
index e920d43be552cedb53dd88f46626a0e43cdd42f5..520fbfaa692a7a52f1db1a30b9c5c042664d25e9 100644
--- a/src/edu/nps/moves/dis7/utilities/DisThreadedNetworkInterfaceSelfTestLog.txt
+++ b/src/edu/nps/moves/dis7/utilities/DisThreadedNetworkInterfaceSelfTestLog.txt
@@ -8,21 +8,21 @@ warning: [options] bootstrap class path not set in conjunction with -source 8
 1 warning
 compile-single:
 run-single:
-*** DisThreadedNetworkInterface main() self test started...
+[DisThreadedNetworkInterface] main() started...
 [DisThreadedNetworkInterface] using network interface Intel(R) Wi-Fi 6E AX210 160MHz
 [DisThreadedNetworkInterface main() self test] datagramSocket.joinGroup  address=239.1.2.3 port=3000 isConnected()=false createDatagramSocket() complete.
-DisThreadedNetworkInterface createThreads() receiveThread.isAlive()=true
-DisThreadedNetworkInterface createThreads() sendingThread.isAlive()=true
-*** DisThreadedNetworkInterface main() self test initialized...
-*** DisThreadedNetworkInterface main() self test sending espdu...
+[DisThreadedNetworkInterface main() self test] createThreads() receiveThread.isAlive()=true
+[DisThreadedNetworkInterface main() self test] createThreads() sendingThread.isAlive()=true
+[DisThreadedNetworkInterface main() self test] main() self test initialized...
+[DisThreadedNetworkInterface main() self test] self test sending espdu...
 [DisThreadedNetworkInterface main() self test] [sending  1] DisPduType 01 ENTITY_STATE   self test, size 144 bytes)
 [DisThreadedNetworkInterface main() self test] [receipt  1] DisPduType 01 ENTITY_STATE   self test, size 144 bytes)
-received newPdu DisPduType 01 ENTITY_STATE
-*** setKillSentinelAndInterrupts() killed=true sendingThread.isInterrupted()=false receiveThread.isInterrupted()=true
-*** DisThreadedNetworkInterface close(): pdus2send.size()=0 baos.size()=0 dos.size()=144
+[DisThreadedNetworkInterface main() self test] main() pduListener.incomingPdu() received newPdu DisPduType 01 ENTITY_STATE
+*** setKillSentinelAndInterrupts() killed=true sendingThread.isInterrupted()=true receiveThread.isInterrupted()=true
+[DisThreadedNetworkInterface main() self test] close(): pdus2send.size()=0 baos.size()=0 dos.size()=144
 [DisThreadedNetworkInterface main() self test] datagramSocket.leaveGroup address=239.1.2.3 port=3000 isClosed()=true close() complete.
 *** killThread() status: sendingThread.isAlive()=false sendingThread.isInterrupted()=true
 *** killThread() status: receiveThread.isAlive()=false receiveThread.isInterrupted()=true
 *** Thread close status: sendingThread.isAlive()=false receiveThread.isAlive()=false
-*** DisThreadedNetworkInterface main() self test complete.
-BUILD SUCCESSFUL (total time: 3 seconds)
+[DisThreadedNetworkInterface] main() self test complete.
+BUILD SUCCESSFUL (total time: 2 seconds)