diff --git a/examples/src/OpenDis7Examples/ExampleSimulationProgram.java b/examples/src/OpenDis7Examples/ExampleSimulationProgram.java
index 4991e134768a23684c55c50e56fe5a3235034790..959428cbf1897e2d0ec21cfaeee152e9c7a0895d 100644
--- a/examples/src/OpenDis7Examples/ExampleSimulationProgram.java
+++ b/examples/src/OpenDis7Examples/ExampleSimulationProgram.java
@@ -12,6 +12,7 @@ import edu.nps.moves.dis7.pdus.FirePdu;
 import edu.nps.moves.dis7.pdus.Pdu;
 import edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface;
 import edu.nps.moves.dis7.utilities.PduFactory;
+import edu.nps.moves.dis7.utilities.stream.PduRecorder;
 import java.util.ArrayList;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -49,7 +50,7 @@ public class ExampleSimulationProgram
         FirePdu               firePdu = pduFactory.makeFirePdu();
         // should we customize this munition?  what is it for your simulation?
         
-        // TODO simulation management PDUs
+        // TODO simulation management PDUs for startup
         
         // loop the simulation while allowed, programmer can set additional conditions to break out and finish
         while (loopCount < MAX_LOOP_COUNT) 
@@ -140,8 +141,10 @@ public class ExampleSimulationProgram
     DisThreadedNetworkInterface.PduListener pduListener;
     Pdu receivedPdu;
     
-    private String networkAddress = "239.1.2.3";
-    private int    networkPort    = 3000;
+    static final String networkAddress_DEFAULT = "239.1.2.3";
+    static final int    networkPort_DEFAULT    = 3000;
+    static       String networkAddress         = networkAddress_DEFAULT;
+    static       int    networkPort            = networkPort_DEFAULT;
     
     /**
      * Constructor design goal: additional built-in initialization conveniences can go here
@@ -173,11 +176,11 @@ public class ExampleSimulationProgram
     }
 
     /**
-     * @param networkAddress the networkAddress to set
+     * @param newNetworkAddress the networkAddress to set
      */
-    public final void setNetworkAddress(String networkAddress)
+    public final void setNetworkAddress(String newNetworkAddress)
     {
-        this.networkAddress = networkAddress;
+        this.networkAddress = newNetworkAddress;
     }
 
     /**
@@ -189,11 +192,11 @@ public class ExampleSimulationProgram
     }
 
     /**
-     * @param networkPort the networkPort to set
+     * @param newNetworkPort the networkPort to set
      */
-    public final void setNetworkPort(int networkPort)
+    public final void setNetworkPort(int newNetworkPort)
     {
-        this.networkPort = networkPort;
+        this.networkPort = newNetworkPort;
     }
 
     /**
@@ -324,8 +327,15 @@ 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.runSimulation (); // ... your simulation execution code goes in there ...
+        
+        pduRecorder.end();
 
         thisProgram.tearDownNetworkInterface(); // make sure no processes are left lingering
         
diff --git a/examples/src/OpenDis7Examples/ExampleSimulationProgramLog.txt b/examples/src/OpenDis7Examples/ExampleSimulationProgramLog.txt
index e0456131e0d8520781db46872a83201b5b9a95bf..13c9f96360354e1d6e3a4e13e5ef558d750439d3 100644
--- a/examples/src/OpenDis7Examples/ExampleSimulationProgramLog.txt
+++ b/examples/src/OpenDis7Examples/ExampleSimulationProgramLog.txt
@@ -9,19 +9,29 @@ run-single:
 [OpenDis7Examples.ExampleSimulationProgram] started...
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface]  Using network interface Intel(R) Centrino(R) Ultimate-N 6300 AGN
 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\PduCaptureLog1.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
 ... 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] 1. received DisPduType 01 ENTITY_STATE, size 144 bytes)
+[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] 2. received DisPduType 02 FIRE, size 96 bytes)
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 3. received DisPduType 22 COMMENT, size 104 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 3. received 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] 4. received DisPduType 01 ENTITY_STATE, size 144 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 4. received DisPduType 01 ENTITY_STATE, size 144 bytes)
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 5. received DisPduType 02 FIRE, size 96 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 5. received DisPduType 02 FIRE, size 96 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 6. received DisPduType 22 COMMENT, size 104 bytes)
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 6. received DisPduType 22 COMMENT, size 104 bytes)
 *** [Narrative comment sent: APPLICATION_TIMESTEP] [MV3500 ExampleSimulationProgram, runSimulation() loop 2]
 ... [PDUs successfully sent for this loop]
@@ -29,15 +39,21 @@ sending PDUs for simulation step 2, monitor loopback to confirm sent
 ... [Pausing for 1.0 seconds]
 sending PDUs for simulation step 3, monitor loopback to confirm sent
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 7. received DisPduType 01 ENTITY_STATE, size 144 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 7. received DisPduType 01 ENTITY_STATE, size 144 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 8. received DisPduType 02 FIRE, size 96 bytes)
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 8. received DisPduType 02 FIRE, size 96 bytes)
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 9. received DisPduType 22 COMMENT, size 104 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 9. received 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] 10. received DisPduType 01 ENTITY_STATE, size 144 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 10. received DisPduType 01 ENTITY_STATE, size 144 bytes)
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 11. received DisPduType 02 FIRE, size 96 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 11. received DisPduType 02 FIRE, size 96 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 12. received DisPduType 22 COMMENT, size 104 bytes)
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 12. received DisPduType 22 COMMENT, size 104 bytes)
 *** [Narrative comment sent: APPLICATION_TIMESTEP] [MV3500 ExampleSimulationProgram, runSimulation() loop 4]
 ... [PDUs successfully sent for this loop]
@@ -45,13 +61,19 @@ sending PDUs for simulation step 4, monitor loopback to confirm sent
 ... [Pausing for 1.0 seconds]
 sending PDUs for simulation step 5, monitor loopback to confirm sent
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 13. received DisPduType 01 ENTITY_STATE, size 144 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 13. received DisPduType 01 ENTITY_STATE, size 144 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 14. received DisPduType 02 FIRE, size 96 bytes)
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 14. received DisPduType 02 FIRE, size 96 bytes)
 [edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 15. received DisPduType 22 COMMENT, size 104 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 15. received 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] 16. received DisPduType 22 COMMENT, size 120 bytes)
+[edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface] 16. received 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\PduCaptureLog1.dislog
 [OpenDis7Examples.ExampleSimulationProgram] complete.
 BUILD SUCCESSFUL (total time: 10 seconds)
diff --git a/examples/src/OpenDis7Examples/ExampleSimulationProgramPduCaptureLog.dislog b/examples/src/OpenDis7Examples/ExampleSimulationProgramPduCaptureLog.dislog
new file mode 100644
index 0000000000000000000000000000000000000000..be53e3cacf67b2bf120063c0ad168fd9a0703eb2
--- /dev/null
+++ b/examples/src/OpenDis7Examples/ExampleSimulationProgramPduCaptureLog.dislog
@@ -0,0 +1,18 @@
+# Start, ENCODING_PLAINTEXT, 20210815_133514, DIS capture file, .\pduLog\PduCaptureLog1.dislog
+[0,0,0,0,0,0,0,0],[7,1,1,1,-106,70,-6,-89,0,-112,40,0,0,1,0,2,0,3,0,0,0,0,0,-31,0,0,0,0,0,0,0,-31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,-16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DisPduType 01 ENTITY_STATE
+[0,0,0,0,6,54,78,92],[7,1,2,2,-106,71,22,-99,0,96,40,0,0,2,0,3,0,0,0,2,0,3,0,0,0,2,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DisPduType 02 FIRE
+[0,0,0,0,12,-63,-17,76],[7,1,22,5,-106,93,52,-19,0,32,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,-81,-46,0,0,0,-8,77,86,51,53,48,48,32,69,120,97,109,112,108,101,83,105,109,117,108,97,116,105,111,110,80,114,111,103,114,97,109,0,0,0,-81,-46,0,0,0,-80,114,117,110,83,105,109,117,108,97,116,105,111,110,40,41,32,108,111,111,112,32,49,0,0] # DisPduType 22 COMMENT
+[0,0,0,0,78,-4,-47,76],[7,1,1,1,-106,70,-6,-89,0,-112,40,0,0,1,0,2,0,3,0,0,0,0,0,-31,0,0,0,0,0,0,0,-31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DisPduType 01 ENTITY_STATE
+[0,0,0,0,85,4,122,-92],[7,1,2,2,-106,71,22,-99,0,96,40,0,0,2,0,3,0,0,0,2,0,3,0,0,0,2,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DisPduType 02 FIRE
+[0,0,0,0,91,-68,76,-36],[7,1,22,5,-106,117,116,127,0,32,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,-81,-46,0,0,0,-8,77,86,51,53,48,48,32,69,120,97,109,112,108,101,83,105,109,117,108,97,116,105,111,110,80,114,111,103,114,97,109,0,0,0,-81,-46,0,0,0,-80,114,117,110,83,105,109,117,108,97,116,105,111,110,40,41,32,108,111,111,112,32,50,0,0] # DisPduType 22 COMMENT
+[0,0,0,0,-99,119,-83,-40],[7,1,1,1,-106,70,-6,-89,0,-112,40,0,0,1,0,2,0,3,0,0,0,0,0,-31,0,0,0,0,0,0,0,-31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DisPduType 01 ENTITY_STATE
+[0,0,0,0,-92,71,-121,60],[7,1,2,2,-106,71,22,-99,0,96,40,0,0,2,0,3,0,0,0,2,0,3,0,0,0,2,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DisPduType 02 FIRE
+[0,0,0,0,-86,109,66,60],[7,1,22,5,-106,-115,124,35,0,32,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,-81,-46,0,0,0,-8,77,86,51,53,48,48,32,69,120,97,109,112,108,101,83,105,109,117,108,97,116,105,111,110,80,114,111,103,114,97,109,0,0,0,-81,-46,0,0,0,-80,114,117,110,83,105,109,117,108,97,116,105,111,110,40,41,32,108,111,111,112,32,51,0,0] # DisPduType 22 COMMENT
+[0,0,0,0,-20,-73,-43,8],[7,1,1,1,-106,70,-6,-89,0,-112,40,0,0,1,0,2,0,3,0,0,0,0,0,-31,0,0,0,0,0,0,0,-31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DisPduType 01 ENTITY_STATE
+[0,0,0,0,-14,-65,-44,80],[7,1,2,2,-106,71,22,-99,0,96,40,0,0,2,0,3,0,0,0,2,0,3,0,0,0,2,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DisPduType 02 FIRE
+[0,0,0,0,-7,-92,104,88],[7,1,22,5,-106,-91,-87,17,0,32,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,-81,-46,0,0,0,-8,77,86,51,53,48,48,32,69,120,97,109,112,108,101,83,105,109,117,108,97,116,105,111,110,80,114,111,103,114,97,109,0,0,0,-81,-46,0,0,0,-80,114,117,110,83,105,109,117,108,97,116,105,111,110,40,41,32,108,111,111,112,32,52,0,0] # DisPduType 22 COMMENT
+[0,0,0,1,60,85,-80,28],[7,1,1,1,-106,70,-6,-89,0,-112,40,0,0,1,0,2,0,3,0,0,0,0,0,-31,0,0,0,0,0,0,0,-31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DisPduType 01 ENTITY_STATE
+[0,0,0,1,67,46,-37,-44],[7,1,2,2,-106,71,22,-99,0,96,40,0,0,2,0,3,0,0,0,2,0,3,0,0,0,2,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DisPduType 02 FIRE
+[0,0,0,1,73,-94,-117,-36],[7,1,22,5,-106,-66,32,-111,0,32,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,-81,-46,0,0,0,-8,77,86,51,53,48,48,32,69,120,97,109,112,108,101,83,105,109,117,108,97,116,105,111,110,80,114,111,103,114,97,109,0,0,0,-81,-46,0,0,0,-80,114,117,110,83,105,109,117,108,97,116,105,111,110,40,41,32,108,111,111,112,32,53,0,0] # DisPduType 22 COMMENT
+[0,0,0,1,79,-27,-45,80],[7,1,22,5,-106,-64,14,-113,0,32,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,9,90,-90,0,0,0,-8,77,86,51,53,48,48,32,69,120,97,109,112,108,101,83,105,109,117,108,97,116,105,111,110,80,114,111,103,114,97,109,0,0,9,90,-90,0,0,1,48,114,117,110,83,105,109,117,108,97,116,105,111,110,40,41,32,99,111,109,112,108,101,116,101,100,32,115,117,99,99,101,115,115,102,117,108,108,121,0,0] # DisPduType 22 COMMENT
+# Finish, ENCODING_PLAINTEXT, 20210815_133520, DIS capture file, .\pduLog\PduCaptureLog1.dislog