diff --git a/build.xml b/build.xml
index 69b2030c8900cbdda3bcce2d0cae3776b532e036..87507d6998c87b422709e3fc3623402b5c04f184 100644
--- a/build.xml
+++ b/build.xml
@@ -78,6 +78,15 @@
     test.  Running in other ways, such as individually, doesn't seem to work.
     https://blogs.apache.org/netbeans/entry/junit-5-apache-ant-and
     -->
+
+    <target name="pduRecord" depends="compile-test,-pre-test-run">
+        <echo message="$work.dir=${work.dir}"/>
+        <java dir="." 
+              classpath="${run.classpath}"  
+              classname="edu.nps.moves.dis7.util.playerrecorder.Recorder">
+        <!--  <arg line="*insert filename*"/> TODO in Recorder -->
+        </java>
+    </target>
     
     <target name="test" depends="compile-test,-pre-test-run">
         <echo message="$work.dir=${work.dir}"/>
diff --git a/src/edu/nps/moves/dis7/examples/EntityUse.java b/src/edu/nps/moves/dis7/examples/EntityUse.java
index d89154f98ada7ac03b73de5cf32373e18b8eaae8..351f5fc673c8ab707619e4753c76ebec7cd11ac8 100644
--- a/src/edu/nps/moves/dis7/examples/EntityUse.java
+++ b/src/edu/nps/moves/dis7/examples/EntityUse.java
@@ -7,8 +7,8 @@ package edu.nps.moves.dis7.examples;
 
 import edu.nps.moves.dis7.EntityStatePdu;
 import edu.nps.moves.dis7.EntityType;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import edu.nps.moves.dis7.entities.EntityTypeFactory;
 import edu.nps.moves.dis7.enumerations.DISPDUType;
 import java.io.IOException;
diff --git a/src/edu/nps/moves/dis7/examples/EspduReceiver.java b/src/edu/nps/moves/dis7/examples/EspduReceiver.java
index e5ecdcde295b2032b25132f77b63987cf5bc77b3..e1dabd6d1613ce66783c9f357880cea99046b867 100644
--- a/src/edu/nps/moves/dis7/examples/EspduReceiver.java
+++ b/src/edu/nps/moves/dis7/examples/EspduReceiver.java
@@ -9,7 +9,7 @@ import edu.nps.moves.dis7.EntityID;
 import edu.nps.moves.dis7.EntityStatePdu;
 import edu.nps.moves.dis7.Pdu;
 import edu.nps.moves.dis7.Vector3Double;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.net.DatagramPacket;
 import java.net.MulticastSocket;
 import java.util.Iterator;
diff --git a/src/edu/nps/moves/dis7/examples/EspduReceiverNIO.java b/src/edu/nps/moves/dis7/examples/EspduReceiverNIO.java
index c5853bfe0765c5f886fc1cedec1487592db2bd32..f8cb0f51d56137da94c9a4552f375565d33e6a1a 100644
--- a/src/edu/nps/moves/dis7/examples/EspduReceiverNIO.java
+++ b/src/edu/nps/moves/dis7/examples/EspduReceiverNIO.java
@@ -5,7 +5,7 @@
 package edu.nps.moves.dis7.examples;
 
 import edu.nps.moves.dis7.Pdu;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.net.DatagramPacket;
 import java.net.InetAddress;
 import java.net.MulticastSocket;
@@ -38,6 +38,7 @@ public class EspduReceiverNIO
       // Specify the socket to receive data
       socket = new MulticastSocket(EspduSender.DIS_DESTINATION_PORT);
       address = InetAddress.getByName(EspduSender.DEFAULT_MULTICAST_GROUP);
+      // TODO fix deprecation by adding NetworkInterface (hopefully DisThreadedNetworkInterface)
       socket.joinGroup(address);
 
       // Loop infinitely, receiving datagrams
diff --git a/src/edu/nps/moves/dis7/examples/EspduSender.java b/src/edu/nps/moves/dis7/examples/EspduSender.java
index 16cf91783766318c5ad5cd0f17fdeae20a2a0f24..45c73ae96f0c026edbc1b72ead8af0f763940588 100644
--- a/src/edu/nps/moves/dis7/examples/EspduSender.java
+++ b/src/edu/nps/moves/dis7/examples/EspduSender.java
@@ -6,7 +6,7 @@
 package edu.nps.moves.dis7.examples;
 
 import edu.nps.moves.dis7.*;
-import edu.nps.moves.dis7.util.CoordinateConversions;
+import edu.nps.moves.dis7.utilities.CoordinateConversions;
 import java.io.*;
 import java.net.*;
 import java.util.*;
diff --git a/src/edu/nps/moves/dis7/examples/PduListenerSaver.java b/src/edu/nps/moves/dis7/examples/PduListenerSaver.java
index eba90c07b80953283df2c395fb9cd38dda4225a6..a4a0fe31fc7861c07b31ac08c75157af48590372 100644
--- a/src/edu/nps/moves/dis7/examples/PduListenerSaver.java
+++ b/src/edu/nps/moves/dis7/examples/PduListenerSaver.java
@@ -4,7 +4,7 @@
  */
 package edu.nps.moves.dis7.examples;
 
-import edu.nps.moves.dis7.util.playerrecorder.Recorder;
+import edu.nps.moves.dis7.utilities.stream.PduRecorder;
 import java.io.IOException;
 import java.util.Scanner;
 
@@ -51,7 +51,7 @@ public class PduListenerSaver
 
     System.out.println("Beginning pdu save to directory " + outDir);
     try {
-      Recorder recorder = new Recorder(outDir, mcast, port);
+      PduRecorder recorder = new PduRecorder(outDir, mcast, port);
 
       recorder.startResume();
       mystate state = mystate.RUNNING;
diff --git a/src/edu/nps/moves/dis7/examples/PduReaderPlayer.java b/src/edu/nps/moves/dis7/examples/PduReaderPlayer.java
index f8f860d130b63c6a7d8d52f506b6669f076ccbfb..db25342793f56fc99f29b3580279ade0035ac5de 100644
--- a/src/edu/nps/moves/dis7/examples/PduReaderPlayer.java
+++ b/src/edu/nps/moves/dis7/examples/PduReaderPlayer.java
@@ -4,7 +4,7 @@
  */
 package edu.nps.moves.dis7.examples;
 
-import edu.nps.moves.dis7.util.playerrecorder.Player;
+import edu.nps.moves.dis7.utilities.stream.PduPlayer;
 import java.io.File;
 import java.io.IOException;
 import java.util.Scanner;
@@ -52,7 +52,7 @@ public class PduReaderPlayer
 
     System.out.println("Beginning pdu playback from directory " + outDir);
     try {
-      Player player = new Player(mcast, port, new File(outDir).toPath());
+      PduPlayer player = new PduPlayer(mcast, port, new File(outDir).toPath());
       player.startResume();
       mystate state = mystate.RUNNING;
       Scanner scan = new Scanner(System.in);
diff --git a/src/edu/nps/moves/dis7/examples/ThreadedNetExample.java b/src/edu/nps/moves/dis7/examples/ThreadedNetExample.java
index a4be300e49f8a2bdf68dbfb1917c92b929027b48..c9a46394f28fce7ae9bc082895b2b8ebb6a6336b 100644
--- a/src/edu/nps/moves/dis7/examples/ThreadedNetExample.java
+++ b/src/edu/nps/moves/dis7/examples/ThreadedNetExample.java
@@ -6,8 +6,8 @@ package edu.nps.moves.dis7.examples;
 
 import edu.nps.moves.dis7.Pdu;
 import edu.nps.moves.dis7.enumerations.Country;
-import edu.nps.moves.dis7.util.DisThreadedNetIF;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisThreadedNetIF;
+import edu.nps.moves.dis7.utilities.PduFactory;
 
 /**
  * ThreadedNetExample.java created on Sep 9, 2019
diff --git a/src/edu/nps/moves/dis7/util/CoordinateConversions.java b/src/edu/nps/moves/dis7/utilities/CoordinateConversions.java
similarity index 99%
rename from src/edu/nps/moves/dis7/util/CoordinateConversions.java
rename to src/edu/nps/moves/dis7/utilities/CoordinateConversions.java
index bd70102cc58ec308c6fee5d38901c75115360cbd..4ed7996cb63bfe7ce0b0676832856d86e6f82663 100644
--- a/src/edu/nps/moves/dis7/util/CoordinateConversions.java
+++ b/src/edu/nps/moves/dis7/utilities/CoordinateConversions.java
@@ -3,7 +3,7 @@
  * This work is provided under a BSD open-source license, see project license.html and license.txt
  */
 
-package edu.nps.moves.dis7.util;
+package edu.nps.moves.dis7.utilities;
 
 /**
  * Converts DIS (x,y,z) rectilinear coordinates (earth-centered RH coordinate system)
diff --git a/src/edu/nps/moves/dis7/util/DisNetworking.java b/src/edu/nps/moves/dis7/utilities/DisNetworking.java
similarity index 99%
rename from src/edu/nps/moves/dis7/util/DisNetworking.java
rename to src/edu/nps/moves/dis7/utilities/DisNetworking.java
index b91f740dab45d880fe8d2c0552abd7c9a6ccf4b8..4250a07d1ac4ebf2deda266a9fe31e9fa6f7cc67 100644
--- a/src/edu/nps/moves/dis7/util/DisNetworking.java
+++ b/src/edu/nps/moves/dis7/utilities/DisNetworking.java
@@ -2,7 +2,7 @@
  * Copyright (c) 2008-2020, MOVES Institute, Naval Postgraduate School (NPS). All rights reserved.
  * This work is provided under a BSD open-source license, see project license.html and license.txt
  */
-package edu.nps.moves.dis7.util;
+package edu.nps.moves.dis7.utilities;
 
 import edu.nps.moves.dis7.Pdu;
 import java.io.ByteArrayOutputStream;
diff --git a/src/edu/nps/moves/dis7/util/DisThreadedNetIF.java b/src/edu/nps/moves/dis7/utilities/DisThreadedNetIF.java
similarity index 99%
rename from src/edu/nps/moves/dis7/util/DisThreadedNetIF.java
rename to src/edu/nps/moves/dis7/utilities/DisThreadedNetIF.java
index b150ce02c8774fcd23106239b49d735f9187a61b..6fa1553398c4b9f8b8a86ca307d36ef947e0c6f1 100644
--- a/src/edu/nps/moves/dis7/util/DisThreadedNetIF.java
+++ b/src/edu/nps/moves/dis7/utilities/DisThreadedNetIF.java
@@ -2,7 +2,7 @@
  * Copyright (c) 2008-2020, MOVES Institute, Naval Postgraduate School (NPS). All rights reserved.
  * This work is provided under a BSD open-source license, see project license.html and license.txt
  */
-package edu.nps.moves.dis7.util;
+package edu.nps.moves.dis7.utilities;
 
 import edu.nps.moves.dis7.Pdu;
 import edu.nps.moves.dis7.enumerations.DISPDUType;
diff --git a/src/edu/nps/moves/dis7/util/PduFactory.java b/src/edu/nps/moves/dis7/utilities/PduFactory.java
similarity index 99%
rename from src/edu/nps/moves/dis7/util/PduFactory.java
rename to src/edu/nps/moves/dis7/utilities/PduFactory.java
index b9853aae2e5bff7ff0af9701b218500cc9075c78..9c3bd6e2a91a842a8a7f3f6cab9e8b989570e234 100644
--- a/src/edu/nps/moves/dis7/util/PduFactory.java
+++ b/src/edu/nps/moves/dis7/utilities/PduFactory.java
@@ -3,7 +3,7 @@
  * This work is provided under a BSD open-source license, see project license.html and license.txt
  */
 
-package edu.nps.moves.dis7.util;
+package edu.nps.moves.dis7.utilities;
 
 import edu.nps.moves.dis7.*;
 import edu.nps.moves.dis7.enumerations.*;
diff --git a/src/edu/nps/moves/dis7/util/playerrecorder/LogCompare.java b/src/edu/nps/moves/dis7/utilities/stream/LogCompare.java
similarity index 87%
rename from src/edu/nps/moves/dis7/util/playerrecorder/LogCompare.java
rename to src/edu/nps/moves/dis7/utilities/stream/LogCompare.java
index 29b38668728cc988f034f71bee614ad3fa204682..bd191e9019833b73be115015fa3461a49c239884 100644
--- a/src/edu/nps/moves/dis7/util/playerrecorder/LogCompare.java
+++ b/src/edu/nps/moves/dis7/utilities/stream/LogCompare.java
@@ -1,8 +1,8 @@
-package edu.nps.moves.dis7.util.playerrecorder;
+package edu.nps.moves.dis7.utilities.stream;
 
 import edu.nps.moves.dis7.Pdu;
-import edu.nps.moves.dis7.util.PduFactory;
-import static edu.nps.moves.dis7.util.playerrecorder.Recorder.COMMENT_MARKER;
+import edu.nps.moves.dis7.utilities.PduFactory;
+import static edu.nps.moves.dis7.utilities.stream.PduRecorder.COMMENT_MARKER;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
@@ -17,16 +17,24 @@ import java.util.Base64;
  */
 public class LogCompare
 {
+    /**
+     * filepath1 and filepath2
+     */
   private static String[] paths = {
-    "/Users/mike/NetbeansProjects/open-dis7-java/examples/pdulog/Pdusave.dislog",
-    "/Users/mike/NetbeansProjects/open-dis7-java/examples/pdulog/Pdusave1.dislog"};
-
+    "Pdusave.dislog", // TODO 1
+    "Pdusave1.dislog" // TODO 2
+  };
+
+  
+  /** Invocation
+    * @param args filepath1 filepath2
+   */
   public static void main(String[] args)
   {
     if (args.length > 0)
-      paths[0] = args[0];
+      paths[0] = args[0]; // filepath1
     if (args.length > 1)
-      paths[1] = args[1];
+      paths[1] = args[1]; // filepath1
     main2(paths);
   }
 
@@ -35,7 +43,7 @@ public class LogCompare
   // Not same sequence of Pdus
   // Not same number of Pdus
   // Pdu content difference
-  public static void main2(String[] args)
+  public static void main2(String[] args) // TODO rename or remove middlemen
   {
     if (args.length < 2) {
       System.out.println("Usage: java LogCompare filepath1 filepath2");
diff --git a/src/edu/nps/moves/dis7/util/playerrecorder/Player.java b/src/edu/nps/moves/dis7/utilities/stream/PduPlayer.java
similarity index 91%
rename from src/edu/nps/moves/dis7/util/playerrecorder/Player.java
rename to src/edu/nps/moves/dis7/utilities/stream/PduPlayer.java
index b5302ff9e5b1ca94c5d056800113724db423f69f..d8c7e401efb4e08ad1536c0628023199c159c299 100644
--- a/src/edu/nps/moves/dis7/util/playerrecorder/Player.java
+++ b/src/edu/nps/moves/dis7/utilities/stream/PduPlayer.java
@@ -3,7 +3,7 @@
  * This work is provided under a BSD open-source license, see project license.html and license.txt
  */
 
-package edu.nps.moves.dis7.util.playerrecorder;
+package edu.nps.moves.dis7.utilities.stream;
 
 import com.google.common.primitives.Longs;
 
@@ -15,9 +15,9 @@ import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Base64;
 
-import static edu.nps.moves.dis7.util.playerrecorder.Recorder.*;
+import static edu.nps.moves.dis7.utilities.stream.PduRecorder.*;
 
-public class Player
+public class PduPlayer
 {
   public interface RawListener {
     void receiveBytes(byte[] ba);
@@ -27,7 +27,7 @@ public class Player
   private int port;
   private Thread thrd;
   
-  public Player(String ip, int port, Path disLogDirectory) throws IOException
+  public PduPlayer(String ip, int port, Path disLogDirectory) throws IOException
   {
     this.disLogDirectory = disLogDirectory;
     this.ip = ip;
@@ -65,7 +65,7 @@ public class Player
       System.out.println("Replaying DIS logs.");
       InetAddress addr = InetAddress.getByName(ip);
       
-      FilenameFilter filter = (dir, name) -> name.endsWith(Recorder.DISLOG_FILE_TAIL) && !name.startsWith(".");
+      FilenameFilter filter = (dir, name) -> name.endsWith(PduRecorder.DISLOG_FILE_EXTENSION) && !name.startsWith(".");
       
       File[] fs = disLogDirectory.toFile().listFiles(filter);
       if (fs == null)
@@ -146,7 +146,7 @@ public class Player
       if(rawListener != null)
         rawListener.receiveBytes(null); // indicate the end
     }
-    catch (Exception ex) {
+    catch (IOException ex) {
       System.err.println("Exception reading/writing pdus: "+ex.getClass().getSimpleName()+": "+ex.getLocalizedMessage());
       thrd = null;
       closer();
@@ -192,7 +192,7 @@ public class Player
         brdr = null;
       }
     }
-    catch (Exception ioex) {
+    catch (IOException ioex) {
       System.err.println("IOException closing reader in Player");
     }
   }
@@ -206,12 +206,12 @@ public class Player
       System.out.println(s + "  ");
       showPduCountsOneTime = true;  // get the first one in there
     }
-    else if (s.startsWith(STOP_COMMENT_MARKER)) {
+    else if (s.startsWith(FINISH_COMMENT_MARKER)) {
       System.out.print("Total PDUs: ");
       showCounts();
       System.out.println();
       System.out.println("End of replay from " + f.getName());
-      System.out.println(s.substring(STOP_COMMENT_MARKER.length()));
+      System.out.println(s.substring(FINISH_COMMENT_MARKER.length()));
       
       scenarioPduCount = 0;
       startNanoTime = null;
@@ -236,13 +236,16 @@ public class Player
     closer();
   }
   
+  /** Invocation
+    * @param args none supported
+   */
   public static void main(String[] args)
   {
     try {
       //new Player("230.0.0.0", 3000, new File("./pdulog").toPath()).startResume();
-      new Player("230.0.0.0", 3000, new File("/Users/mike/NetbeansProjects/open-dis7-java/examples/pdulog").toPath());
+      new PduPlayer("230.0.0.0", 3000, new File("./pdulog").toPath());
     }
-    catch (Exception ex) {
+    catch (IOException ex) {
       ex.printStackTrace();
     }
   }
diff --git a/src/edu/nps/moves/dis7/util/playerrecorder/PduReceiver.java b/src/edu/nps/moves/dis7/utilities/stream/PduReceiver.java
similarity index 60%
rename from src/edu/nps/moves/dis7/util/playerrecorder/PduReceiver.java
rename to src/edu/nps/moves/dis7/utilities/stream/PduReceiver.java
index 9a1e276921a2e7b745414c970cfc6e29bf648538..1752027355226b83f4fced3f2dba8e689f85c096 100644
--- a/src/edu/nps/moves/dis7/util/playerrecorder/PduReceiver.java
+++ b/src/edu/nps/moves/dis7/utilities/stream/PduReceiver.java
@@ -1,4 +1,4 @@
-package edu.nps.moves.dis7.util.playerrecorder;
+package edu.nps.moves.dis7.utilities.stream;
 
 public interface PduReceiver
 {
diff --git a/src/edu/nps/moves/dis7/util/playerrecorder/Recorder.java b/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java
similarity index 60%
rename from src/edu/nps/moves/dis7/util/playerrecorder/Recorder.java
rename to src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java
index 9710cf189b9ff25af52c250faf61e3dc2ddd2fff..e6549828ba1e4c0d1bdcb815c62c8c1d5d3ad513 100644
--- a/src/edu/nps/moves/dis7/util/playerrecorder/Recorder.java
+++ b/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java
@@ -1,11 +1,9 @@
-package edu.nps.moves.dis7.util.playerrecorder;
+package edu.nps.moves.dis7.utilities.stream;
 
 import com.google.common.primitives.Longs;
-import edu.nps.moves.dis7.Pdu;
-import edu.nps.moves.dis7.enumerations.DISPDUType;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.DisThreadedNetIF;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.DisThreadedNetIF;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import org.apache.commons.io.FilenameUtils;
 
 import java.io.BufferedWriter;
@@ -13,35 +11,37 @@ import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.nio.file.Path;
+import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Base64;
+import java.util.Calendar;
 
-public class Recorder implements PduReceiver
+public class PduRecorder implements PduReceiver
 {
   static String DEFAULT_OUTDIR = "./pdulog";
-  static String DEFAULT_FILEPREFIX = "Pdusave";
+  static String DEFAULT_FILEPREFIX = "Pdusave"; // TODO better name
+  static String DISLOG_FILE_EXTENSION = ".dislog";
+  
   static String DEFAULT_MCAST = "230.0.0.0";
   static int    DEFAULT_PORT = 3000;
-  
-  static String DISLOG_FILE_TAIL = ".dislog";
-
-  public static String COMMENT_MARKER = "!";
-  static String START_COMMENT_MARKER = COMMENT_MARKER + "Begin" + COMMENT_MARKER;
-  static String STOP_COMMENT_MARKER  = COMMENT_MARKER + "End"   + COMMENT_MARKER;
+ 
+  public static final String COMMENT_MARKER = "#";
+  static String  START_COMMENT_MARKER = COMMENT_MARKER + " Start,  ";
+  static String FINISH_COMMENT_MARKER = COMMENT_MARKER + " Finish, ";
 
   private BufferedWriter bufferedWriter;
   private File           logFile;
   
   private DisThreadedNetIF disnetworking;
   
-  public Recorder() throws IOException
+  public PduRecorder() throws IOException
   {
     this(DEFAULT_OUTDIR,DEFAULT_MCAST,DEFAULT_PORT);
   }
   
-  public Recorder(String outputDir, String mcastaddr, int port) throws IOException
+  public PduRecorder(String outputDir, String mcastaddr, int port) throws IOException
   {
-    logFile = makeFile(new File(outputDir).toPath(), DEFAULT_FILEPREFIX+DISLOG_FILE_TAIL );
+    logFile = makeFile(new File(outputDir).toPath(), DEFAULT_FILEPREFIX+DISLOG_FILE_EXTENSION );
     bufferedWriter = new BufferedWriter(new FileWriter(logFile));
     
     disnetworking = new DisThreadedNetIF(port, mcastaddr);
@@ -73,7 +73,7 @@ public class Recorder implements PduReceiver
     bufferedWriter.flush();
     bufferedWriter.close();
     System.out.println();
-    System.out.println("Recorder log file closed");
+    System.out.println("Recorder log file closed: " + logFile.getPath());
     return logFile;
   }
  
@@ -126,17 +126,25 @@ public class Recorder implements PduReceiver
   
   private void writeHeader() throws IOException
   {
-    String template = "Beginning of DIS capture file, %s.";
-    String startComment = String.format(template, logFile.getName() + " (show transient progressing PDU count, then final total)");
-    bufferedWriter.write(START_COMMENT_MARKER + startComment);
+//    String template = ", DIS capture file %s.";
+//    String startComment = String.format(template, logFile.getName() + " (show transient progressing PDU count, then final total)");
+      
+    // https://stackoverflow.com/questions/5175728/how-to-get-the-current-date-time-in-java
+    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
+    
+    bufferedWriter.write( START_COMMENT_MARKER + timeStamp + ", DIS capture file, " + logFile.getPath());
     bufferedWriter.newLine();
   }
 
   private void writeFooter() throws IOException
   {
-    String template = "End of DIS capture file, %s.";
-    String endComment = String.format(template, logFile.getName());
-    bufferedWriter.write(STOP_COMMENT_MARKER + endComment);
+//    String template = ", DIS capture file, %s.";
+//    String endComment = String.format(template, logFile.getPath());
+      
+    // https://stackoverflow.com/questions/5175728/how-to-get-the-current-date-time-in-java
+    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
+    
+    bufferedWriter.write(FINISH_COMMENT_MARKER + timeStamp + ", DIS capture file, " + logFile.getPath());
     bufferedWriter.newLine();
   }
 
@@ -165,7 +173,9 @@ public class Recorder implements PduReceiver
     return f;
   }
   
-  /* Example test usage */
+  /** Invocation
+    * @param args none supported, TODO offer path/filename
+   */
   public static void main(String[] args)
   {
     PduFactory factory = new PduFactory(); //default appid, country, etc.
@@ -174,37 +184,44 @@ public class Recorder implements PduReceiver
     Path path = new File("./pdulog").toPath();
     String filename = "Pdusave";
     
-    Recorder recorder;
-    try{recorder = new Recorder();} catch(IOException ex) {
+    PduRecorder recorder;
+    try{recorder = new PduRecorder();} catch(IOException ex) {
       System.err.println("Exception creating recorder: "+ex.getLocalizedMessage());
       return;
     }
      
-    DISPDUType all[] = DISPDUType.values();
-    Arrays.stream(all).forEach(typ-> {
-      if(typ != DISPDUType.OTHER) {
-        try {
-          Pdu pdu = factory.createPdu(typ);
-          disnet.sendPdu(pdu);
-          sleep(100);
-        }
-        catch(Exception ex) {
-          System.err.println("Exception sending Pdu: "+ex.getLocalizedMessage());
-        }
-      }
-      });
-    sleep(2000);
+//    // self test
+//    DISPDUType all[] = DISPDUType.values();
+//    Arrays.stream(all).forEach(typ-> {
+//      if(typ != DISPDUType.OTHER) {
+//        try {
+//          Pdu pdu = factory.createPdu(typ);
+//          disnet.sendPdu(pdu);
+//          sleep(100);
+//        }
+//        catch(Exception ex) {
+//          System.err.println("Exception sending Pdu: "+ex.getLocalizedMessage());
+//        }
+//      }
+//      });
+
+    System.out.println("Record for 10 seconds..."); // TODO arrrrgh this is awful
+    sleep(10000);
+    System.out.println("Recording complete."); 
     
     try {
       recorder.end();
     }
-    catch(Exception ex) {
+    catch(IOException ex) {
       System.err.println("Exception closing recorder: "+ex.getClass().getSimpleName()+": "+ex.getLocalizedMessage());
     }
   }
   
   private static void sleep(long ms)
   {
-    try{Thread.sleep(ms);}catch(InterruptedException ex) {}
+    try{
+        Thread.sleep(ms);}
+    catch(InterruptedException ex) {
+    }
   }
 }
diff --git a/src/edu/nps/moves/dis7/util/playerrecorder/ValidationPdusMakerV1.java b/src/edu/nps/moves/dis7/utilities/stream/ValidationPdusMakerV1.java
similarity index 98%
rename from src/edu/nps/moves/dis7/util/playerrecorder/ValidationPdusMakerV1.java
rename to src/edu/nps/moves/dis7/utilities/stream/ValidationPdusMakerV1.java
index 75291cf74c61c19a20aadb643d884a643dab06df..b6070e3815868adc48a5c91007315892d5834abc 100644
--- a/src/edu/nps/moves/dis7/util/playerrecorder/ValidationPdusMakerV1.java
+++ b/src/edu/nps/moves/dis7/utilities/stream/ValidationPdusMakerV1.java
@@ -3,11 +3,11 @@
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
-package edu.nps.moves.dis7.util.playerrecorder;
+package edu.nps.moves.dis7.utilities.stream;
 
 import edu.nps.moves.dis7.enumerations.Country;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import edu.nps.moves.dis7.*;
 import java.io.File;
 import java.io.IOException;
@@ -46,7 +46,7 @@ public class ValidationPdusMakerV1
   
   PduFactory factory;
   DisNetworking disnet;
-  Recorder recorder;
+  PduRecorder recorder;
   /**
    *
    * @param dir directory to save pdu log file
@@ -69,7 +69,7 @@ public class ValidationPdusMakerV1
      */
     factory = new PduFactory(COUNTRY_V1, EXERCISEID_V1, SITEID_V1, APPLICATIONID_V1, USEABSOLUTETIME_V1);
     disnet = new DisNetworking();
-    recorder = new Recorder(); //dirpath,fn);
+    recorder = new PduRecorder(); //dirpath,fn);
     
      // Start a thread to receive and record pdus; this is a datagram socket and is non-interruptible; thread will go away on Sys exit
     /*Thread receiverThrd = new Thread(() -> {
diff --git a/test/edu/nps/moves/dis7/AllPduRoundTripTest.java b/test/edu/nps/moves/dis7/AllPduRoundTripTest.java
index 8ebe66285e0c0003ca6bfabb21971ca1c73985a1..1dc9d8a8e470cdbe1a252564365f74fe1b2faca6 100644
--- a/test/edu/nps/moves/dis7/AllPduRoundTripTest.java
+++ b/test/edu/nps/moves/dis7/AllPduRoundTripTest.java
@@ -19,10 +19,10 @@ package edu.nps.moves.dis7;
 import com.google.common.io.Files;
 import edu.nps.moves.dis7.enumerations.Country;
 import edu.nps.moves.dis7.enumerations.DISPDUType;
-import edu.nps.moves.dis7.util.DisThreadedNetIF;
-import edu.nps.moves.dis7.util.PduFactory;
-import edu.nps.moves.dis7.util.playerrecorder.Player;
-import edu.nps.moves.dis7.util.playerrecorder.Recorder;
+import edu.nps.moves.dis7.utilities.DisThreadedNetIF;
+import edu.nps.moves.dis7.utilities.PduFactory;
+import edu.nps.moves.dis7.utilities.stream.PduPlayer;
+import edu.nps.moves.dis7.utilities.stream.PduRecorder;
 import java.io.File;
 import java.util.HashMap;
 import java.util.concurrent.Semaphore;
@@ -185,7 +185,7 @@ public class AllPduRoundTripTest
   private HashMap<DISPDUType, Pdu> pduReadMap = new HashMap<>();
 
   DisThreadedNetIF disnetworking;
-  Recorder recorder;
+  PduRecorder recorder;
 
   private void setupReceiver()
   {
@@ -212,7 +212,7 @@ public class AllPduRoundTripTest
   private void setupRecorder() throws Exception
   {
     recorderDirectory = Files.createTempDir();
-    recorder = new Recorder(recorderDirectory.getAbsolutePath(), disnetworking.getMcastGroup(), disnetworking.getDisPort());
+    recorder = new PduRecorder(recorderDirectory.getAbsolutePath(), disnetworking.getMcastGroup(), disnetworking.getDisPort());
     System.out.println("Recorder log at " + recorderDirectory.getAbsolutePath());
   }
 
@@ -233,7 +233,7 @@ public class AllPduRoundTripTest
   private void getAllFromRecorder(Semaphore sem) throws Exception
   {
     sem.acquire();
-    Player player = new Player(disnetworking.getMcastGroup(), disnetworking.getDisPort(), recorderDirectory.toPath());
+    PduPlayer player = new PduPlayer(disnetworking.getMcastGroup(), disnetworking.getDisPort(), recorderDirectory.toPath());
     player.sendToNet(false);
     player.addRawListener(ba -> {
       if (ba != null) {
diff --git a/test/edu/nps/moves/dis7/BitFieldRoundTripTest.java b/test/edu/nps/moves/dis7/BitFieldRoundTripTest.java
index 8392c56e000834193923d3c944f20a8e2176b0ed..fc0ec2264d910f6e3e2f4a3f79e014f214ddd051 100644
--- a/test/edu/nps/moves/dis7/BitFieldRoundTripTest.java
+++ b/test/edu/nps/moves/dis7/BitFieldRoundTripTest.java
@@ -7,8 +7,8 @@ package edu.nps.moves.dis7;
 import edu.nps.moves.dis7.enumerations.AppearanceCamouflageType;
 import edu.nps.moves.dis7.enumerations.ForceID;
 import edu.nps.moves.dis7.enumerations.LandPlatformAppearance;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.io.IOException;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/test/edu/nps/moves/dis7/CommentPdusTest.java b/test/edu/nps/moves/dis7/CommentPdusTest.java
index 8d697cfac0235fc5a15a3a09c62dbeba19436505..6d5fc7dd76f4a50d1c1360a85d837fd627604e43 100644
--- a/test/edu/nps/moves/dis7/CommentPdusTest.java
+++ b/test/edu/nps/moves/dis7/CommentPdusTest.java
@@ -5,8 +5,8 @@
 package edu.nps.moves.dis7;
 
 import edu.nps.moves.dis7.enumerations.VariableRecordType;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.io.IOException;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.*;
diff --git a/test/edu/nps/moves/dis7/DataQueryPduRoundTripTest.java b/test/edu/nps/moves/dis7/DataQueryPduRoundTripTest.java
index 2417e5f4bd0e660cac4238dd3ab6b3087455f7fa..f7e845a3da5486a731c9b113629b09485e7fe36e 100644
--- a/test/edu/nps/moves/dis7/DataQueryPduRoundTripTest.java
+++ b/test/edu/nps/moves/dis7/DataQueryPduRoundTripTest.java
@@ -5,8 +5,8 @@
 package edu.nps.moves.dis7;
 
 import edu.nps.moves.dis7.enumerations.VariableRecordType;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.io.IOException;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/test/edu/nps/moves/dis7/FixedAndVariableDatumRoundTripTest.java b/test/edu/nps/moves/dis7/FixedAndVariableDatumRoundTripTest.java
index 1471a781fa98f973feeb60f8f6d11413ddc6ac09..8bd6b2faefc36155b90cc00a51fcf6bade63af13 100644
--- a/test/edu/nps/moves/dis7/FixedAndVariableDatumRoundTripTest.java
+++ b/test/edu/nps/moves/dis7/FixedAndVariableDatumRoundTripTest.java
@@ -6,8 +6,8 @@ package edu.nps.moves.dis7;
 
 import edu.nps.moves.dis7.enumerations.ActionResponseRequestStatus;
 import edu.nps.moves.dis7.enumerations.VariableRecordType;
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.io.IOException;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/test/edu/nps/moves/dis7/PduFactoryTest.java b/test/edu/nps/moves/dis7/PduFactoryTest.java
index feb5cbf070ca8c67cca854b3a8f194e20cce0320..e99ad4383d5c1e44b2e13e8d5410ddc9724ae0a8 100644
--- a/test/edu/nps/moves/dis7/PduFactoryTest.java
+++ b/test/edu/nps/moves/dis7/PduFactoryTest.java
@@ -11,7 +11,7 @@ package edu.nps.moves.dis7;
  */
 
 import edu.nps.moves.dis7.enumerations.Country;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
diff --git a/test/edu/nps/moves/dis7/SignalPdusTest.java b/test/edu/nps/moves/dis7/SignalPdusTest.java
index e9589edb861871809cfa6d5f8dd0e0814523a24e..7f8f81599844f861cbaa2faadbe1a02a38676733 100644
--- a/test/edu/nps/moves/dis7/SignalPdusTest.java
+++ b/test/edu/nps/moves/dis7/SignalPdusTest.java
@@ -4,8 +4,8 @@
  */
 package edu.nps.moves.dis7;
 
-import edu.nps.moves.dis7.util.DisNetworking;
-import edu.nps.moves.dis7.util.PduFactory;
+import edu.nps.moves.dis7.utilities.DisNetworking;
+import edu.nps.moves.dis7.utilities.PduFactory;
 import java.io.IOException;
 import org.junit.jupiter.api.*;
 import static org.junit.jupiter.api.Assertions.*;