diff --git a/examples/src/OpenDis7Examples/ExampleSimulationProgram.java b/examples/src/OpenDis7Examples/ExampleSimulationProgram.java
index ea8eb795cc36fee8d47c3be4b1734f6cf90e9aa9..0854bf65de783e8211a1c47476662cee47b9ab93 100644
--- a/examples/src/OpenDis7Examples/ExampleSimulationProgram.java
+++ b/examples/src/OpenDis7Examples/ExampleSimulationProgram.java
@@ -24,8 +24,15 @@ import java.util.logging.Logger;
  */
 public class ExampleSimulationProgram
 {
+    private      boolean verboseComments         = true;
+    static final String  NETWORK_ADDRESS_DEFAULT  = "239.1.2.3";
+    static final int     NETWORK_PORT_DEFAULT     = 3000;
+    static       String  networkAddress           = NETWORK_ADDRESS_DEFAULT;
+    static       int     networkPort              = NETWORK_PORT_DEFAULT;
+                 String  DEFAULT_OUTPUT_DIRECTORY = "./pduLog";
+                 
     /**
-     * This runSimulation() method is for you, a
+     * This runSimulationLoops() method is for you, a
      * programmer-modifiable method for defining and running a new simulation of interest.
      * Welcome! Other parts of this program handle bookkeeping and plumbing tasks so that
      * you can focus on your model entities and activities.
@@ -37,7 +44,7 @@ public class ExampleSimulationProgram
      * interesting, even helpful, but don't really have to worry about.
      */
     @SuppressWarnings("SleepWhileInLoop") // yes we do that
-    public void runSimulation ()
+    public void runSimulationLoops ()
     {
       try
       {
@@ -134,8 +141,7 @@ public class ExampleSimulationProgram
       }
     }
     /* **************************** infrastructure code, modification is seldom needed ************************* */
-        
-    private boolean verboseComments = true;
+                 
     String narrativeMessage1 = new String();
     String narrativeMessage2 = new String();
     String narrativeMessage3 = new String();
@@ -154,15 +160,11 @@ public class ExampleSimulationProgram
     private final static String TRACE_PREFIX = "[" + ExampleSimulationProgram.class.getName() + "] ";
     
     // class variables
-    PduFactory pduFactory = new PduFactory();
-    DisThreadedNetworkInterface disNetworkInterface;
+    PduFactory                              pduFactory = new PduFactory();
+    DisThreadedNetworkInterface             disNetworkInterface;
     DisThreadedNetworkInterface.PduListener pduListener;
-    Pdu receivedPdu;
-    
-    static final String NETWORK_ADDRESS_DEFAULT = "239.1.2.3";
-    static final int    NETWORK_PORT_DEFAULT    = 3000;
-    static       String networkAddress         = NETWORK_ADDRESS_DEFAULT;
-    static       int    networkPort            = NETWORK_PORT_DEFAULT;
+    Pdu                                     receivedPdu;
+    PduRecorder                             pduRecorder;
     
     /**
      * Constructor design goal: additional built-in initialization conveniences can go here
@@ -223,6 +225,7 @@ public class ExampleSimulationProgram
     public void setUpNetworkInterface()
     {
         disNetworkInterface = new DisThreadedNetworkInterface(getNetworkAddress(), getNetworkPort());
+        disNetworkInterface.setDescriptor ("ExampleSimulationProgram pdu looping");
         
         System.out.println("Network confirmation:" +
                " address=" + disNetworkInterface.getAddress()+ //  disNetworkInterface.getMulticastGroup() + 
@@ -237,11 +240,19 @@ public class ExampleSimulationProgram
             }
         };
         disNetworkInterface.addListener(pduListener);
+        
+        String outputDirectory = DEFAULT_OUTPUT_DIRECTORY;
+        System.out.println("Beginning pdu save to directory " + outputDirectory);
+        pduRecorder = new PduRecorder(outputDirectory, getNetworkAddress(), getNetworkPort()); // assumes save
+        pduRecorder.setDescriptor ("ExampleSimulationProgram pduRecorder");
+        pduRecorder.start(); // begin running
     }
 
     /** All done, release network resources */
     public void tearDownNetworkInterface()
     {
+        pduRecorder.stop();
+
         disNetworkInterface.removeListener(pduListener);
         
         disNetworkInterface.close();
@@ -351,16 +362,9 @@ public class ExampleSimulationProgram
         // OK here we go...
 
         thisProgram.setUpNetworkInterface();
-        
-        String DEFAULT_OUTPUT_DIRECTORY = "./pduLog";
-        String outputDirectory = DEFAULT_OUTPUT_DIRECTORY;
-        System.out.println("Beginning pdu save to directory " + outputDirectory);
-        PduRecorder pduRecorder = new PduRecorder(outputDirectory, networkAddress, networkPort); // assumes save
 
-        thisProgram.runSimulation (); // ... your simulation execution code goes in there ...
+        thisProgram.runSimulationLoops (); // ... your simulation execution code goes in there ...
         
-        pduRecorder.end();
-
         thisProgram.tearDownNetworkInterface(); // make sure no processes are left lingering
         
         System.out.println(TRACE_PREFIX + "complete."); // report successful completion
diff --git a/examples/src/OpenDis7Examples/ExampleSimulationProgramLog.txt b/examples/src/OpenDis7Examples/ExampleSimulationProgramLog.txt
index 9f23859baa7a45bf3d81e8a313b070337ed52511..696e044db49d32c1a9d2128e949f1228f7f8b3f4 100644
--- a/examples/src/OpenDis7Examples/ExampleSimulationProgramLog.txt
+++ b/examples/src/OpenDis7Examples/ExampleSimulationProgramLog.txt
@@ -7,94 +7,92 @@ Compiling 1 source file to C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\buil
 compile-single:
 run-single:
 [OpenDis7Examples.ExampleSimulationProgram] started...
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] Using network interface Intel(R) Centrino(R) Ultimate-N 6300 AGN
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] datagramSocket.joinGroup address=239.1.2.3 port=3000
+[DisThreadedNetworkInterface] using network interface Intel(R) Centrino(R) Ultimate-N 6300 AGN
+[DisThreadedNetworkInterface] datagramSocket.joinGroup  address=239.1.2.3 port=3000 start() complete
 Network confirmation: address=239.1.2.3 port=3000
 Beginning pdu save to directory ./pduLog
-Recorder log file open: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog2.dislog
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] Using network interface Intel(R) Centrino(R) Ultimate-N 6300 AGN
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] datagramSocket.joinGroup address=239.1.2.3 port=3000
-class edu.nps.moves.dis7.utilities.stream.PduRecorder listening to IP address 239.1.2.3 on port 3000
+Recorder log file open: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog42.dislog
+[DisThreadedNetworkInterface] using network interface Intel(R) Centrino(R) Ultimate-N 6300 AGN
+[DisThreadedNetworkInterface] datagramSocket.joinGroup  address=239.1.2.3 port=3000 start() complete
+[PduRecorder ExampleSimulationProgram pduRecorder] listening to IP address 239.1.2.3 on port 3000
 ... My simulation just did something, no really...
 ... [Pausing for 1.0 seconds]
 sending PDUs for simulation step 1, monitor loopback to confirm sent
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 1] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 1] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 1] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 2] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 2] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 2] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 3] DisPduType 22 COMMENT, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 3] DisPduType 22 COMMENT, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 3] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending  1] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt  1] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt  1] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending  2] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt  2] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt  2] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending  3] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt  3] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt  3] DisPduType 22 COMMENT, size 104 bytes)
 *** [Narrative comment sent: APPLICATION_TIMESTEP] [MV3500 ExampleSimulationProgram, runSimulation() loop 1]
 ... [PDUs successfully sent for this loop]
 ... My simulation just did something, no really...
 ... [Pausing for 1.0 seconds]
 sending PDUs for simulation step 2, monitor loopback to confirm sent
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 4] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 4] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 4] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 5] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 5] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 5] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 6] DisPduType 22 COMMENT, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 6] DisPduType 22 COMMENT, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 6] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending  4] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt  4] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt  4] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending  5] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt  5] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt  5] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending  6] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt  6] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt  6] DisPduType 22 COMMENT, size 104 bytes)
 *** [Narrative comment sent: APPLICATION_TIMESTEP] [MV3500 ExampleSimulationProgram, runSimulation() loop 2]
 ... [PDUs successfully sent for this loop]
 ... My simulation just did something, no really...
 ... [Pausing for 1.0 seconds]
 sending PDUs for simulation step 3, monitor loopback to confirm sent
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 7] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 7] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 7] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 8] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 8] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 8] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 9] DisPduType 22 COMMENT, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 9] DisPduType 22 COMMENT, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 9] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending  7] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt  7] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt  7] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending  8] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt  8] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt  8] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt  9] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending  9] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt  9] DisPduType 22 COMMENT, size 104 bytes)
 *** [Narrative comment sent: APPLICATION_TIMESTEP] [MV3500 ExampleSimulationProgram, runSimulation() loop 3]
 ... [PDUs successfully sent for this loop]
 ... My simulation just did something, no really...
 ... [Pausing for 1.0 seconds]
 sending PDUs for simulation step 4, monitor loopback to confirm sent
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 10] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 10] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 10] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 11] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 11] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 11] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 12] DisPduType 22 COMMENT, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 12] DisPduType 22 COMMENT, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 12] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending 10] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt 10] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt 10] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending 11] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt 11] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt 11] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending 12] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt 12] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt 12] DisPduType 22 COMMENT, size 104 bytes)
 *** [Narrative comment sent: APPLICATION_TIMESTEP] [MV3500 ExampleSimulationProgram, runSimulation() loop 4]
 ... [PDUs successfully sent for this loop]
 ... My simulation just did something, no really...
 ... [Pausing for 1.0 seconds]
 sending PDUs for simulation step 5, monitor loopback to confirm sent
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 13] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 13] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 13] DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 14] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 14] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 14] DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 15] DisPduType 22 COMMENT, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 15] DisPduType 22 COMMENT, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 15] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending 13] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt 13] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt 13] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending 14] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt 14] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt 14] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt 15] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending 15] DisPduType 22 COMMENT, size 104 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt 15] DisPduType 22 COMMENT, size 104 bytes)
 *** [Narrative comment sent: APPLICATION_TIMESTEP] [MV3500 ExampleSimulationProgram, runSimulation() loop 5]
 ... [PDUs successfully sent for this loop]
 ... [Termination condition met, simulationComplete=true]
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [sending 16] DisPduType 22 COMMENT, size 120 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 16] DisPduType 22 COMMENT, size 120 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] [receipt 16] DisPduType 22 COMMENT, size 120 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [sending 16] DisPduType 22 COMMENT, size 120 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] [receipt 16] DisPduType 22 COMMENT, size 120 bytes)
+[DisThreadedNetworkInterface ExampleSimulationProgram pduRecorder] [receipt 16] DisPduType 22 COMMENT, size 120 bytes)
 *** [Narrative comment sent: COMPLETE_EVENT_REPORT] [MV3500 ExampleSimulationProgram, runSimulation() completed successfully]
 ... [final CommentPdu successfully sent for simulation]
 
-Closing recorder log file: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog2.dislog
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] Exception in DisThreadedNetworkInterface receive thread: Socket closed
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] Retrying new socket...
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] datagramSocket.leaveGroup address=239.1.2.3 port=3000
+Closing recorder log file: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog42.dislog
+[DisThreadedNetworkInterface ExampleSimulationProgram pdu looping] datagramSocket.leaveGroup address=239.1.2.3 port=3000  stop() complete
 [OpenDis7Examples.ExampleSimulationProgram] complete.
 BUILD SUCCESSFUL (total time: 11 seconds)
diff --git a/examples/src/OpenDis7Examples/PduListenerSaver.java b/examples/src/OpenDis7Examples/PduListenerSaver.java
index a3a80ef7d1b2d46fa3ae48ef023024187a6c45d7..1bde47c9ff6bdda1a16bf403ed044202d03752e4 100644
--- a/examples/src/OpenDis7Examples/PduListenerSaver.java
+++ b/examples/src/OpenDis7Examples/PduListenerSaver.java
@@ -4,8 +4,8 @@
  */
 package OpenDis7Examples;
 
+import edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface;
 import edu.nps.moves.dis7.utilities.stream.PduRecorder;
-import java.io.IOException;
 import java.util.Scanner;
 
 /** Class to leverage the {@link edu.nps.moves.dis7.utilities.stream.PduRecorder} 
@@ -20,82 +20,117 @@ import java.util.Scanner;
  */
 public class PduListenerSaver
 {
-    private final static String DEFAULT_OUTPUT_DIRECTORY  = "pduLog";
-    /**
-       * Default multicast group address we send on.
-       * @see <a href="https://en.wikipedia.org/wiki/Multicast_address">https://en.wikipedia.org/wiki/Multicast_address</a> */
-    public static final String  DEFAULT_MULTICAST_ADDRESS = AllPduSender.DEFAULT_MULTICAST_ADDRESS;
-    /** @see <a href="https://en.wikipedia.org/wiki/Port_(computer_networking)">https://en.wikipedia.org/wiki/Port_(computer_networking)</a> */
-    public static final int     DEFAULT_MULTICAST_PORT    = AllPduSender.DEFAULT_MULTICAST_PORT;
+    private final static String DEFAULT_OUTPUT_DIRECTORY = "pduLog";
+    
+    /** Default multicast group address <code>229.1.2.3</code> for send and receive connections.
+     * @see <a href="https://en.wikipedia.org/wiki/Multicast_address">https://en.wikipedia.org/wiki/Multicast_address</a>  */
+    public static String DEFAULT_DIS_ADDRESS = DisThreadedNetworkInterface.DEFAULT_DIS_ADDRESS;
+
+    /** Default socket port  <code>3000</code>, matches Wireshark DIS capture default
+     * @see <a href="https://en.wikipedia.org/wiki/Port_(computer_networking)">https://en.wikipedia.org/wiki/Port_(computer_networking)</a> */
+    public static int DEFAULT_DIS_PORT = DisThreadedNetworkInterface.DEFAULT_DIS_PORT;
 
     private enum mystate
     {
         RUNNING,
         PAUSED;
     }
+    private String  disAddress; 
+    private int     disPort;
 
     /**
-     * Program invocation, execution starts here
+     * Object constructor using default multicast address and port
+     */
+    public PduListenerSaver()
+    {
+        this(DEFAULT_DIS_ADDRESS, DEFAULT_DIS_PORT);
+    }
+    
+    /**
+     * Object constructor using specified multicast address and port 
+     * @param address the multicast group or unicast address to utilize
+     * @param port the multicast port to utilize
+     */
+    public PduListenerSaver(String address, int port)
+    {
+        disAddress = address;
+        disPort    = port;
+    }
+    
+    /**
+     * Command-line invocation (CLI), execution starts here
      * @param args command-line arguments
      */
     public static void main(String[] args)
     {
-        String outputDirectory  = DEFAULT_OUTPUT_DIRECTORY;
-        String multicastAddress = DEFAULT_MULTICAST_ADDRESS;
-        int       multicastPort = DEFAULT_MULTICAST_PORT;
+        String  outputDirectory = DEFAULT_OUTPUT_DIRECTORY;
+        String multicastAddress = DEFAULT_DIS_ADDRESS;
+        int                port = DEFAULT_DIS_PORT;
 
         System.out.println("OpenDis7Examples.PduListenerSaver started...");
 
         switch (args.length)
         {
             case 0:
+            // use default values
                 break;
             case 1:
                 outputDirectory = args[0];
                 break;
             case 3:
-                outputDirectory  = args[0];
+                 outputDirectory = args[0];
                 multicastAddress = args[1];
-                multicastPort    = Integer.parseInt(args[2]);
+                            port = Integer.parseInt(args[2]);
                 break;
             default:
                 // Common-sense practice is to print help message if invocation is problematic
-                System.err.println("Usage: PduListenerSaver() or PduListenerSaver(\"outputdir\") or PduListenerSaver(\"outputDirectory\",\"multicastAddress\", multicastPort");
+                System.err.println("Usage: PduListenerSaver() or PduListenerSaver(\"outputdir\") or PduListenerSaver(\"outputDirectory\",\"multicastAddress\", port");
                 System.exit(1);
         }
-        System.out.println("Beginning PduListenerSaver (" + multicastAddress + ":" + multicastPort + ") to directory " + outputDirectory);
+    System.out.println("Beginning PduListenerSaver (" + multicastAddress + ":" + port + ") to directory " + outputDirectory);
 
         mystate state = mystate.RUNNING;
-        Scanner terminalKeyboardScanner = new Scanner(System.in);
-        PduRecorder pduRecorder = new PduRecorder(outputDirectory, multicastAddress, multicastPort); // assumes save on quit
+        Scanner terminalKeyboardScanner  = new Scanner(System.in);
+        PduRecorder pduRecorder = new PduRecorder(outputDirectory, multicastAddress, port); // assumes save
+        pduRecorder.setDescriptor("PduListenerSaver");
+        pduRecorder.start(); // begin running
 
         while (true) // monitor user input via keyboard
         {
             System.out.println("Type p/enter to pause, r/enter to resume, q/enter to quit");
             String line = terminalKeyboardScanner.nextLine();
-            if (line.equalsIgnoreCase("p") && state == mystate.RUNNING) {
-                pduRecorder.stopPause();
+            if (line.equalsIgnoreCase("p") && state == mystate.RUNNING) 
+            {
+                pduRecorder.pause();
                 state = mystate.PAUSED;
-                System.out.println("... now PAUSED");
+                System.out.println("... state is now PAUSED");
             }
-            else if (line.equalsIgnoreCase("p")) {
-                System.out.println("... still PAUSED");
+            else if (line.equalsIgnoreCase("p")) 
+            {
+                pduRecorder.pause();
+                state = mystate.PAUSED;
+                System.out.println("... state is still PAUSED");
             }
-            else if (line.equalsIgnoreCase("r") && state == mystate.PAUSED) {
-                pduRecorder.startResume();
+            else if (line.equalsIgnoreCase("r") && state == mystate.PAUSED) 
+            {
+                pduRecorder.resume();
                 state = mystate.RUNNING;
-                System.out.println("... now RUNNING");
+                System.out.println("... state is now RUNNING");
             }
-            else if (line.equalsIgnoreCase("r")) {
-                System.out.println("... still RUNNING");
+            else if (line.equalsIgnoreCase("r")) 
+            {
+                pduRecorder.resume();
+                state = mystate.RUNNING;
+                System.out.println("... state is still RUNNING");
             }
-            else if (line.equalsIgnoreCase("q")) {
+            else if (line.equalsIgnoreCase("q")) 
+            {
+                pduRecorder.stop();
                 System.out.println("... QUIT");
-                pduRecorder.end();
                 break;
             }
         }
-        System.out.println("Ending PduListenerSaver pdu recording, saved to file:");
+        System.out.println("Finished PduListenerSaver pdu recording, saved to file:");
         System.out.println(pduRecorder.getLogFilePath());
     }
 }
diff --git a/examples/src/OpenDis7Examples/PduListenerSaverLog.txt b/examples/src/OpenDis7Examples/PduListenerSaverLog.txt
index e36724bfd12768e55e47e3d5f4dfbae71e24247e..72e7c1bb0afb88419591b52bb8f125203a7cb9d8 100644
--- a/examples/src/OpenDis7Examples/PduListenerSaverLog.txt
+++ b/examples/src/OpenDis7Examples/PduListenerSaverLog.txt
@@ -23,88 +23,87 @@ compile-single:
 run-single:
 OpenDis7Examples.PduListenerSaver started...
 Beginning PduListenerSaver (239.1.2.3:3000) to directory pduLog
-Recorder log file open: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog21.dislog
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] Using network interface Intel(R) Centrino(R) Ultimate-N 6300 AGN
-class edu.nps.moves.dis7.utilities.stream.PduRecorder listening to IP address 239.1.2.3 on port 3000
-Type p/enter to pause, r/enter to resume, q/enter to quit
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 1. received DisPduType 01 ENTITY_STATE, size 144 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 2. received DisPduType 02 FIRE, size 96 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 3. received DisPduType 03 DETONATION, size 104 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 4. received DisPduType 04 COLLISION, size 60 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 5. received DisPduType 05 SERVICE_REQUEST, size 28 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 6. received DisPduType 06 RESUPPLY_OFFER, size 28 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 7. received DisPduType 07 RESUPPLY_RECEIVED, size 28 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 8. received DisPduType 08 RESUPPLY_CANCEL, size 24 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 9. received DisPduType 09 REPAIR_COMPLETE, size 28 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 10. received DisPduType 10 REPAIR_RESPONSE, size 28 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 11. received DisPduType 11 CREATE_ENTITY, size 28 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 12. received DisPduType 12 REMOVE_ENTITY, size 28 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 13. received DisPduType 13 START_RESUME, size 44 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 14. received DisPduType 14 STOP_FREEZE, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 15. received DisPduType 15 ACKNOWLEDGE, size 32 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 16. received DisPduType 16 ACTION_REQUEST, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 17. received DisPduType 17 ACTION_RESPONSE, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 18. received DisPduType 18 DATA_QUERY, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 19. received DisPduType 19 SET_DATA, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 20. received DisPduType 20 DATA, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 21. received DisPduType 21 EVENT_REPORT, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 22. received DisPduType 22 COMMENT, size 112 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 23. received DisPduType 23 ELECTROMAGNETIC_EMISSION, size 28 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 24. received DisPduType 24 DESIGNATOR, size 88 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 25. received DisPduType 25 TRANSMITTER, size 107 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 26. received DisPduType 26 SIGNAL, size 32 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 27. received DisPduType 27 RECEIVER, size 36 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 28. received DisPduType 28 IDENTIFICATION_FRIEND_OR_FOE, size 60 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 29. received DisPduType 29 UNDERWATER_ACOUSTIC, size 32 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 30. received DisPduType 30 SUPPLEMENTAL_EMISSION_ENTITY_STATE, size 28 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 31. received DisPduType 31 INTERCOM_SIGNAL, size 32 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 32. received DisPduType 32 INTERCOM_CONTROL, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 33. received DisPduType 33 AGGREGATE_STATE, size 136 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 34. received DisPduType 34 ISGROUPOF, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 35. received DisPduType 35 TRANSFER_OWNERSHIP, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 36. received DisPduType 36 ISPARTOF, size 52 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 37. received DisPduType 37 MINEFIELD_STATE, size 72 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 38. received DisPduType 38 MINEFIELD_QUERY, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 39. received DisPduType 39 MINEFIELD_DATA, size 44 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 40. received DisPduType 40 MINEFIELD_RESPONSE_NACK, size 26 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 41. received DisPduType 41 ENVIRONMENTAL_PROCESS, size 32 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 42. received DisPduType 42 GRIDDED_DATA, size 64 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 43. received DisPduType 43 POINT_OBJECT_STATE, size 91 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 44. received DisPduType 44 LINEAR_OBJECT_STATE, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 45. received DisPduType 45 AREAL_OBJECT_STATE, size 49 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 46. received DisPduType 46 TIME_SPACE_POSITION_INFORMATION, size 54 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 47. received DisPduType 47 APPEARANCE, size 67 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 48. received DisPduType 48 ARTICULATED_PARTS, size 17 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 49. received DisPduType 49 LIVE_ENTITY_FIRE, size 67 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 50. received DisPduType 50 LIVE_ENTITY_DETONATION, size 79 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 51. received DisPduType 51 CREATE_ENTITY_RELIABLE, size 32 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 52. received DisPduType 52 REMOVE_ENTITY_RELIABLE, size 32 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 53. received DisPduType 53 START_RESUME_RELIABLE, size 48 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 54. received DisPduType 54 STOP_FREEZE_RELIABLE, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 55. received DisPduType 55 ACKNOWLEDGE_RELIABLE, size 32 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 56. received DisPduType 56 ACTION_REQUEST_RELIABLE, size 44 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 57. received DisPduType 57 ACTION_RESPONSE_RELIABLE, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 58. received DisPduType 58 DATA_QUERY_RELIABLE, size 44 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 59. received DisPduType 59 SET_DATA_RELIABLE, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 60. received DisPduType 60 DATA_RELIABLE, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 61. received DisPduType 61 EVENT_REPORT_RELIABLE, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 62. received DisPduType 62 COMMENT_RELIABLE, size 32 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 63. received DisPduType 63 RECORD_RELIABLE, size 36 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 64. received DisPduType 64 SET_RECORD_RELIABLE, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 65. received DisPduType 65 RECORD_QUERY_RELIABLE, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 66. received DisPduType 66 COLLISION_ELASTIC, size 100 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 67. received DisPduType 67 ENTITY_STATE_UPDATE, size 72 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 68. received DisPduType 68 DIRECTED_ENERGY_FIRE, size 88 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 69. received DisPduType 69 ENTITY_DAMAGE_STATUS, size 24 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 70. received DisPduType 70 INFORMATION_OPERATIONS_ACTION, size 56 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 71. received DisPduType 71 INFORMATION_OPERATIONS_REPORT, size 40 bytes)
-[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 72. received DisPduType 72 ATTRIBUTE, size 32 bytes)
-quit
+Recorder log file open: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog40.dislog
+[DisThreadedNetworkInterface] using network interface Intel(R) Centrino(R) Ultimate-N 6300 AGN
+[DisThreadedNetworkInterface] datagramSocket.joinGroup  address=239.1.2.3 port=3000 start() complete
+[PduRecorder PduListenerSaver] listening to IP address 239.1.2.3 on port 3000
 Type p/enter to pause, r/enter to resume, q/enter to quit
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 1] DisPduType 01 ENTITY_STATE, size 144 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 2] DisPduType 02 FIRE, size 96 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 3] DisPduType 03 DETONATION, size 104 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 4] DisPduType 04 COLLISION, size 60 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 5] DisPduType 05 SERVICE_REQUEST, size 28 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 6] DisPduType 06 RESUPPLY_OFFER, size 28 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 7] DisPduType 07 RESUPPLY_RECEIVED, size 28 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 8] DisPduType 08 RESUPPLY_CANCEL, size 24 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 9] DisPduType 09 REPAIR_COMPLETE, size 28 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 10] DisPduType 10 REPAIR_RESPONSE, size 28 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 11] DisPduType 11 CREATE_ENTITY, size 28 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 12] DisPduType 12 REMOVE_ENTITY, size 28 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 13] DisPduType 13 START_RESUME, size 44 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 14] DisPduType 14 STOP_FREEZE, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 15] DisPduType 15 ACKNOWLEDGE, size 32 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 16] DisPduType 16 ACTION_REQUEST, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 17] DisPduType 17 ACTION_RESPONSE, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 18] DisPduType 18 DATA_QUERY, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 19] DisPduType 19 SET_DATA, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 20] DisPduType 20 DATA, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 21] DisPduType 21 EVENT_REPORT, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 22] DisPduType 22 COMMENT, size 112 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 23] DisPduType 23 ELECTROMAGNETIC_EMISSION, size 28 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 24] DisPduType 24 DESIGNATOR, size 88 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 25] DisPduType 25 TRANSMITTER, size 107 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 26] DisPduType 26 SIGNAL, size 32 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 27] DisPduType 27 RECEIVER, size 36 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 28] DisPduType 28 IDENTIFICATION_FRIEND_OR_FOE, size 60 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 29] DisPduType 29 UNDERWATER_ACOUSTIC, size 32 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 30] DisPduType 30 SUPPLEMENTAL_EMISSION_ENTITY_STATE, size 28 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 31] DisPduType 31 INTERCOM_SIGNAL, size 32 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 32] DisPduType 32 INTERCOM_CONTROL, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 33] DisPduType 33 AGGREGATE_STATE, size 136 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 34] DisPduType 34 ISGROUPOF, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 35] DisPduType 35 TRANSFER_OWNERSHIP, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 36] DisPduType 36 ISPARTOF, size 52 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 37] DisPduType 37 MINEFIELD_STATE, size 72 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 38] DisPduType 38 MINEFIELD_QUERY, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 39] DisPduType 39 MINEFIELD_DATA, size 44 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 40] DisPduType 40 MINEFIELD_RESPONSE_NACK, size 26 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 41] DisPduType 41 ENVIRONMENTAL_PROCESS, size 32 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 42] DisPduType 42 GRIDDED_DATA, size 64 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 43] DisPduType 43 POINT_OBJECT_STATE, size 91 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 44] DisPduType 44 LINEAR_OBJECT_STATE, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 45] DisPduType 45 AREAL_OBJECT_STATE, size 49 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 46] DisPduType 46 TIME_SPACE_POSITION_INFORMATION, size 54 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 47] DisPduType 47 APPEARANCE, size 67 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 48] DisPduType 48 ARTICULATED_PARTS, size 17 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 49] DisPduType 49 LIVE_ENTITY_FIRE, size 67 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 50] DisPduType 50 LIVE_ENTITY_DETONATION, size 79 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 51] DisPduType 51 CREATE_ENTITY_RELIABLE, size 32 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 52] DisPduType 52 REMOVE_ENTITY_RELIABLE, size 32 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 53] DisPduType 53 START_RESUME_RELIABLE, size 48 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 54] DisPduType 54 STOP_FREEZE_RELIABLE, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 55] DisPduType 55 ACKNOWLEDGE_RELIABLE, size 32 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 56] DisPduType 56 ACTION_REQUEST_RELIABLE, size 44 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 57] DisPduType 57 ACTION_RESPONSE_RELIABLE, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 58] DisPduType 58 DATA_QUERY_RELIABLE, size 44 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 59] DisPduType 59 SET_DATA_RELIABLE, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 60] DisPduType 60 DATA_RELIABLE, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 61] DisPduType 61 EVENT_REPORT_RELIABLE, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 62] DisPduType 62 COMMENT_RELIABLE, size 32 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 63] DisPduType 63 RECORD_RELIABLE, size 36 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 64] DisPduType 64 SET_RECORD_RELIABLE, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 65] DisPduType 65 RECORD_QUERY_RELIABLE, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 66] DisPduType 66 COLLISION_ELASTIC, size 100 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 67] DisPduType 67 ENTITY_STATE_UPDATE, size 72 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 68] DisPduType 68 DIRECTED_ENERGY_FIRE, size 88 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 69] DisPduType 69 ENTITY_DAMAGE_STATUS, size 24 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 70] DisPduType 70 INFORMATION_OPERATIONS_ACTION, size 56 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 71] DisPduType 71 INFORMATION_OPERATIONS_REPORT, size 40 bytes)
+[DisThreadedNetworkInterface PduListenerSaver] [receipt 72] DisPduType 72 ATTRIBUTE, size 32 bytes)
 q
-... QUIT
 
-Closing recorder log file: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog21.dislog
-Ending PduListenerSaver pdu recording, saved to file:
-C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog21.dislog
-BUILD SUCCESSFUL (total time: 44 seconds)
+Closing recorder log file: C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog40.dislog
+... QUIT
+Finished PduListenerSaver pdu recording, saved to file:
+C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog40.dislog
+BUILD SUCCESSFUL (total time: 24 seconds)
diff --git a/examples/src/OpenDis7Examples/PduReaderPlayer.java b/examples/src/OpenDis7Examples/PduReaderPlayer.java
index 606798dcdfa6504ceca60a3a7aa8412a4662758e..b380569cba7ae7e9c017623e8315d91839c9ab37 100644
--- a/examples/src/OpenDis7Examples/PduReaderPlayer.java
+++ b/examples/src/OpenDis7Examples/PduReaderPlayer.java
@@ -21,7 +21,7 @@ import java.util.Scanner;
  */
 public class PduReaderPlayer
 {
-  private final static String DEFAULT_OUTPUT_DIRECTORY  = "pduLog";
+  private final static String DEFAULT_OUTPUT_DIRECTORY = "pduLog";
   /** Default multicast group address we send on.
     * @see <a href="https://en.wikipedia.org/wiki/Multicast_address">https://en.wikipedia.org/wiki/Multicast_address</a> */
   public static final String  DEFAULT_MULTICAST_ADDRESS = AllPduSender.DEFAULT_MULTICAST_ADDRESS;
@@ -34,8 +34,7 @@ public class PduReaderPlayer
     PAUSED;
   }
 
-  /**
-     * Program invocation, execution starts here
+  /** Command-line invocation (CLI) of program, execution starts here
      * @param args command-line arguments
      */
     public static void main(String[] args)
@@ -61,20 +60,21 @@ public class PduReaderPlayer
         sendToNet = Boolean.valueOf(args[3]);
         break;
       default:
-        System.err.println("Usage: PduReaderPlayer() or "
-                + "PduReaderPlayer(\"outputdir\", \"sendToNet true/false\") or "
+        System.err.println("Usage: PduReaderPlayer() or \n"
+                + "PduReaderPlayer(\"outputdir\", \"sendToNet true/false\") or \n"
+                + "PduReaderPlayer(\"outputdir\", \"ipPort\", \"sendToNet true/false\") or \n"
                 + "PduReaderPlayer(\"outputdir\", \"multicast address\", \"ipPort\", \"sendToNet true/false\"");
         System.exit(1);
     }
 
     System.out.println("Beginning PduReaderPlayer (" + multicastAddress + ":" + multicastPort + ") to directory " + outputDirectory);
-    try {
+    try 
+    {
+      mystate state = mystate.RUNNING;
+      Scanner terminalKeyboardScanner = new Scanner(System.in);
       PduPlayer pduPlayer = new PduPlayer(multicastAddress, multicastPort, Path.of(outputDirectory), sendToNet);
       pduPlayer.startResume();
       
-      mystate state = mystate.RUNNING;
-      Scanner terminalKeyboardScanner = new Scanner(System.in);
-
       while (true) // monitor user input via keyboard
       {
         System.out.println("Type p/enter to pause, r/enter to resume, q/enter to quit");
@@ -95,7 +95,7 @@ public class PduReaderPlayer
       }
       System.out.println("Ending pdu files playback for directory " + outputDirectory);
       System.out.println("OpenDis7Examples.PduReaderPlayer complete.");
-      System.exit(0); // not sure why this is necessary with Netbeans...
+      System.exit(0); // TODO not sure why this is necessary with Netbeans...
     }
     catch (IOException ex) {
       System.err.println("Exception: " + ex.getClass().getSimpleName() + ": " + ex.getLocalizedMessage());
diff --git a/examples/src/OpenDis7Examples/PduReaderPlayerLog.txt b/examples/src/OpenDis7Examples/PduReaderPlayerLog.txt
index 045d885479cdac508523277067b92ffe3836db85..20a6fa2aae951d408bcb9d478b04a343769b3a4a 100644
--- a/examples/src/OpenDis7Examples/PduReaderPlayerLog.txt
+++ b/examples/src/OpenDis7Examples/PduReaderPlayerLog.txt
@@ -8,8 +8,8 @@ compile-single:
 run-single:
 OpenDis7Examples.PduReaderPlayer started...
 Beginning PduReaderPlayer (239.1.2.3:3000) to directory pduLog
-PduPlayer begin() playing DIS logs.
 Type p/enter to pause, r/enter to resume, q/enter to quit
+PduPlayer begin() playing DIS logs.
 Replaying C:\x-nps-gitlab\NetworkedGraphicsMV3500\examples\pduLog\PduCaptureLog.dislog
 ENCODING_PLAINTEXT
 Sent PDU: DisPduType 01 ENTITY_STATE
@@ -94,4 +94,4 @@ q
 ... QUIT
 Ending pdu files playback for directory pduLog
 OpenDis7Examples.PduReaderPlayer complete.
-BUILD SUCCESSFUL (total time: 36 seconds)
+BUILD SUCCESSFUL (total time: 10 seconds)