diff --git a/examples/src/OpenDis7Examples/AllPduSender.java b/examples/src/OpenDis7Examples/AllPduSender.java
index b1d267682915bf22b98775c3a59588d62f20e32f..af4a2a55a136f271f7081cbcec09fe3bd201f087 100755
--- a/examples/src/OpenDis7Examples/AllPduSender.java
+++ b/examples/src/OpenDis7Examples/AllPduSender.java
@@ -8,7 +8,7 @@ import edu.nps.moves.dis7.*;
 import edu.nps.moves.dis7.enumerations.*;
 
 /**
- * This is an example that sends many/most types of PDUs. Useful for testing standards
+ * This is an application example that sends all types of PDUs. Useful for testing standards
  * compliance or getting a full set of PDUs. It also writes the generated PDUs to an XML file.
  * Adapted from OpenDIS library example package edu.nps.moves.examples
  *
@@ -18,15 +18,22 @@ import edu.nps.moves.dis7.enumerations.*;
 public class AllPduSender
 {
     /** Default multicast group address we send on. */
-    public static final String DEFAULT_MULTICAST_ADDRESS = "239.1.2.3";
+    public static final String DEFAULT_MULTICAST_ADDRESS = "225.4.5.6"; // "239.1.2.3"; // PduRecorder "225.4.5.6"; //
 	
     /** Default multicast port used, matches Wireshark DIS capture default */
     public static final int    DEFAULT_MULTICAST_PORT    = 3000;
 	
-    private int port;
-    InetAddress multicastAddress;
+    /** Duration in milliseconds, set to 0 to avoid pausing between PDU sends */
+    private long               THREAD_SLEEP_INTERVAL = 1000;
+	
+    /** Number of complete loops to perform */
+    private int                SEND_LOOPS_TO_PERFORM = 100;
+    
+    private int         port;
+    private InetAddress multicastAddress;
 
     public AllPduSender(int port, String multicast) {
+        this.port = DEFAULT_MULTICAST_PORT;
         try
 		{
             this.port = port;
@@ -44,426 +51,434 @@ public class AllPduSender
     public int run()
 	{
 		System.out.println("OpenDis7Examples.AllPduSender started...");
-        try
-        {
-            System.out.println("Generate list of all PDU types and note issues, if any...");
-            List<Pdu> generatedPdusList = new ArrayList<>();
+        if (SEND_LOOPS_TO_PERFORM != 1)
+            System.out.print  ("... running for " + SEND_LOOPS_TO_PERFORM + " loops");
+           
+        System.out.println("Generate list of all PDU types and note issues, if any...");
+        List<Pdu> generatedPdusList = new ArrayList<>();
+            
+        for (int i = 0; i < SEND_LOOPS_TO_PERFORM; i++) {
+            
+            try {
+                
+                // Loop through all the enumerated PDU types, create a PDU for each type,
+                // add that PDU to generatedPdusList, then send each one
+                for (DISPDUType pdu : DISPDUType.values()) 
+                {
+    //                System.out.println("PDU " + pdu.getValue() + " " + pdu.name() + " " + pdu.getDescription()); // diagnostic
+
+                    Pdu aPdu = null; // edu.​nps.​moves7.​dis.PDU superclass for all PDUs, in preparation for custom assignment
+
+                    try {
+                        switch (pdu) // using enumeration values from edu.​nps.​moves.​dis7.​enumerations.​DISPDUType
+                        {
+                            // each case value is DISPDUType
+                            case OTHER: // 0
+                                System.out.println ("*** Note: DISPDUType." + pdu.name() + "=" + pdu.getValue() + " not supported"); // TODO why was this received?
+                                break; // nothing to send
+
+                            case ENTITY_STATE: // 1 
+                                aPdu = new EntityStatePdu();
+
+                                EntityStatePdu espdu = (EntityStatePdu) aPdu;
+                                EntityMarking entityMarking = new EntityMarking ();
+                                entityMarking.setCharacters("AllPduSender".getBytes());   //entityMarking.setCharacters(Byte.valueOf("0")); // 11 characters max?
+
+                                espdu.setMarking(entityMarking);
+                                Vector3Double espduLocation = new Vector3Double();
+                                espduLocation.setX(1.0);
+                                espduLocation.setY(2.0);
+                                espduLocation.setZ(3.0);
+                                espdu.setEntityLocation(espduLocation);
+                                // it is important to identify questions as you think of them
+                                // TODO how to set azimuth, i.e. course direction over ground?
+                                break;
+
+                            case FIRE: // 2
+                                aPdu = new FirePdu();
+                                break;
+
+                            case DETONATION: // 3
+                                aPdu = new DetonationPdu();
+                                break;
+
+                            case COLLISION: // 4
+                                aPdu = new CollisionPdu();
+                                break;
+
+                            case SERVICE_REQUEST: // 5
+                                aPdu = new ServiceRequestPdu();
+                                break;
+
+                            case RESUPPLY_OFFER: // 6
+                                aPdu = new ResupplyOfferPdu();
+                                break;
+
+                            case RESUPPLY_RECEIVED: // 7
+                                aPdu = new ResupplyReceivedPdu();
+                                break;
+
+                            case RESUPPLY_CANCEL: //8
+                                aPdu = new ResupplyCancelPdu();
+                                break;
+
+                            case REPAIR_COMPLETE: // 9
+                                aPdu = new RepairCompletePdu();
+                                break;
+
+                            case REPAIR_RESPONSE: // 10
+                                aPdu = new RepairResponsePdu();
+                                break;
+
+                            case CREATE_ENTITY: // 11
+                                aPdu = new CreateEntityPdu();
+                                break;
+
+                            case REMOVE_ENTITY: // 12
+                                aPdu = new RemoveEntityPdu();
+                                break;
+
+                            case START_RESUME: // 13
+                                aPdu = new StartResumePdu();
+                                break;
+
+                            case STOP_FREEZE: // 14
+                                aPdu = new StopFreezePdu();
+                                break;
+
+                            case ACKNOWLEDGE: // 15
+                                aPdu = new AcknowledgePdu();
+                                break;
+
+                            case ACTION_REQUEST: // 16
+                                aPdu = new ActionRequestPdu();
+                                break;
+
+                            case ACTION_RESPONSE: // 17
+                                aPdu = new ActionResponsePdu();
+                                break;
+
+                            case DATA_QUERY: // 18
+                                aPdu = new DataQueryPdu();
+                                break;
+
+                            case SET_DATA: // 19
+                                aPdu = new SetDataPdu();
+                                break;
+
+                            case DATA: // 20
+                                aPdu = new DataPdu();
+                                break;
+
+                            case EVENT_REPORT: // 21
+                                aPdu = new EventReportPdu();
+                                break;
+
+                            case ELECTROMAGNETIC_EMISSION: // 23
+                                aPdu = new ElectromagneticEmissionPdu();
+                                break;
+
+                            case DESIGNATOR: // 24
+                                aPdu = new DesignatorPdu();
+                                break;
+
+                            case TRANSMITTER: // 25
+                                aPdu = new TransmitterPdu();
+                                break;
+
+                            case SIGNAL: // 26
+                                aPdu = new SignalPdu();
+                                break;
 
-            // Loop through all the enumerated PDU types, create a PDU for each type,
-            // add that PDU to generatedPdusList, and send each one
-            for (DISPDUType pdu : DISPDUType.values()) 
-			{
-//                System.out.println("PDU " + pdu.getValue() + " " + pdu.name() + " " + pdu.getDescription()); // diagnostic
+                            case RECEIVER: // 27
+                                aPdu = new ReceiverPdu();
+                                break;
 
-                Pdu aPdu = null; // edu.​nps.​moves7.​dis.PDU superclass for all PDUs, in preparation for custom assignment
-                
-                try {
-                    switch (pdu) // using enumeration values from edu.​nps.​moves.​dis7.​enumerations.​DISPDUType
-                    {
-                        // each case value is DISPDUType
-                        case OTHER: // 0
-                            System.out.println ("*** Note: DISPDUType." + pdu.name() + "=" + pdu.getValue() + " not supported"); // TODO why was this received?
-                            break; // nothing to send
-
-                        case ENTITY_STATE: // 1 
-                            aPdu = new EntityStatePdu();
-                            
-                            EntityStatePdu espdu = (EntityStatePdu) aPdu;
-                            EntityMarking entityMarking = new EntityMarking ();
-                            entityMarking.setCharacters("AllPduSender".getBytes());   //entityMarking.setCharacters(Byte.valueOf("0")); // 11 characters max?
-
-                            espdu.setMarking(entityMarking);
-                            Vector3Double espduLocation = new Vector3Double();
-                            espduLocation.setX(1.0);
-                            espduLocation.setY(2.0);
-                            espduLocation.setZ(3.0);
-                            espdu.setEntityLocation(espduLocation);
-                            // it is important to identify questions as you think of them
-                            // TODO how to set azimuth, i.e. course direction over ground?
-                            break;
-
-                        case FIRE: // 2
-                            aPdu = new FirePdu();
-                            break;
-
-                        case DETONATION: // 3
-                            aPdu = new DetonationPdu();
-                            break;
-
-                        case COLLISION: // 4
-                            aPdu = new CollisionPdu();
-                            break;
-
-                        case SERVICE_REQUEST: // 5
-                            aPdu = new ServiceRequestPdu();
-                            break;
-
-                        case RESUPPLY_OFFER: // 6
-                            aPdu = new ResupplyOfferPdu();
-                            break;
-
-                        case RESUPPLY_RECEIVED: // 7
-                            aPdu = new ResupplyReceivedPdu();
-                            break;
-
-                        case RESUPPLY_CANCEL: //8
-                            aPdu = new ResupplyCancelPdu();
-                            break;
-
-                        case REPAIR_COMPLETE: // 9
-                            aPdu = new RepairCompletePdu();
-                            break;
-
-                        case REPAIR_RESPONSE: // 10
-                            aPdu = new RepairResponsePdu();
-                            break;
-
-                        case CREATE_ENTITY: // 11
-                            aPdu = new CreateEntityPdu();
-                            break;
-
-                        case REMOVE_ENTITY: // 12
-                            aPdu = new RemoveEntityPdu();
-                            break;
-
-                        case START_RESUME: // 13
-                            aPdu = new StartResumePdu();
-                            break;
-
-                        case STOP_FREEZE: // 14
-                            aPdu = new StopFreezePdu();
-                            break;
-
-                        case ACKNOWLEDGE: // 15
-                            aPdu = new AcknowledgePdu();
-                            break;
-
-                        case ACTION_REQUEST: // 16
-                            aPdu = new ActionRequestPdu();
-                            break;
-
-                        case ACTION_RESPONSE: // 17
-                            aPdu = new ActionResponsePdu();
-                            break;
-
-                        case DATA_QUERY: // 18
-                            aPdu = new DataQueryPdu();
-                            break;
-
-                        case SET_DATA: // 19
-                            aPdu = new SetDataPdu();
-                            break;
-
-                        case DATA: // 20
-                            aPdu = new DataPdu();
-                            break;
-
-                        case EVENT_REPORT: // 21
-                            aPdu = new EventReportPdu();
-                            break;
-
-                        case ELECTROMAGNETIC_EMISSION: // 23
-                            aPdu = new ElectromagneticEmissionPdu();
-                            break;
-
-                        case DESIGNATOR: // 24
-                            aPdu = new DesignatorPdu();
-                            break;
-
-                        case TRANSMITTER: // 25
-                            aPdu = new TransmitterPdu();
-                            break;
-
-                        case SIGNAL: // 26
-                            aPdu = new SignalPdu();
-                            break;
+                            case IDENTIFICATION_FRIEND_OR_FOE: // 28
+                                aPdu = new IdentificationFriendOrFoePdu();
+                                break;
+
+                            case UNDERWATER_ACOUSTIC: // 29
+                                aPdu = new UnderwaterAcousticPdu();
+                                break;
+
+                            case SUPPLEMENTAL_EMISSION_ENTITY_STATE: // 30
+                                aPdu = new SupplementalEmissionEntityStatePdu();
+                                break;
+
+                            case INTERCOM_SIGNAL: // 31
+                                aPdu = new IntercomSignalPdu();
+                                break;
 
-                        case RECEIVER: // 27
-                            aPdu = new ReceiverPdu();
-                            break;
+                            case INTERCOM_CONTROL: // 32
+                                aPdu = new IntercomControlPdu();
+                                break;
 
-                        case IDENTIFICATION_FRIEND_OR_FOE: // 28
-                            aPdu = new IdentificationFriendOrFoePdu();
-                            break;
+                            case AGGREGATE_STATE: // 33
+                                aPdu = new AggregateStatePdu();
+                                break;
 
-                        case UNDERWATER_ACOUSTIC: // 29
-                            aPdu = new UnderwaterAcousticPdu();
-                            break;
+                            case ISGROUPOF: // 34
+                                aPdu = new IsGroupOfPdu();
+                                break;
 
-                        case SUPPLEMENTAL_EMISSION_ENTITY_STATE: // 30
-                            aPdu = new SupplementalEmissionEntityStatePdu();
-                            break;
+                            case TRANSFER_OWNERSHIP: // 35
+                                aPdu = new TransferOwnershipPdu();
+                                break;
 
-                        case INTERCOM_SIGNAL: // 31
-                            aPdu = new IntercomSignalPdu();
-                            break;
+                            case ISPARTOF: // 36
+                                aPdu = new IsPartOfPdu();
+                                break;
 
-                        case INTERCOM_CONTROL: // 32
-                            aPdu = new IntercomControlPdu();
-                            break;
+                            case MINEFIELD_STATE: // 37
+                                aPdu = new MinefieldStatePdu();
+                                break;
 
-                        case AGGREGATE_STATE: // 33
-                            aPdu = new AggregateStatePdu();
-                            break;
+                            case MINEFIELD_QUERY: // 38
+                                aPdu = new MinefieldQueryPdu();
+                                break;
 
-                        case ISGROUPOF: // 34
-                            aPdu = new IsGroupOfPdu();
-                            break;
+                            case MINEFIELD_DATA: // 39
+                                aPdu = new MinefieldDataPdu();
+                                break;
 
-                        case TRANSFER_OWNERSHIP: // 35
-                            aPdu = new TransferOwnershipPdu();
-                            break;
+                            case MINEFIELD_RESPONSE_NACK: // 40
+                                aPdu = new MinefieldResponseNACKPdu();
+                                break;
 
-                        case ISPARTOF: // 36
-                            aPdu = new IsPartOfPdu();
-                            break;
+                            case ENVIRONMENTAL_PROCESS: // 41
+                                aPdu = new EnvironmentalProcessPdu();
+                                break;
 
-                        case MINEFIELD_STATE: // 37
-                            aPdu = new MinefieldStatePdu();
-                            break;
+                            case GRIDDED_DATA: // 42
+                                aPdu = new GriddedDataPdu();
+                                break;
 
-                        case MINEFIELD_QUERY: // 38
-                            aPdu = new MinefieldQueryPdu();
-                            break;
+                            case POINT_OBJECT_STATE: // 43
+                                aPdu = new PointObjectStatePdu();
+                                break;
 
-                        case MINEFIELD_DATA: // 39
-                            aPdu = new MinefieldDataPdu();
-                            break;
+                            case LINEAR_OBJECT_STATE: // 44
+                                aPdu = new LinearObjectStatePdu();
+                                break;
 
-                        case MINEFIELD_RESPONSE_NACK: // 40
-                            aPdu = new MinefieldResponseNACKPdu();
-                            break;
+                            case AREAL_OBJECT_STATE: // 45
+                                aPdu = new ArealObjectStatePdu();
+                                break;
 
-                        case ENVIRONMENTAL_PROCESS: // 41
-                            aPdu = new EnvironmentalProcessPdu();
-                            break;
+                            case TIME_SPACE_POSITION_INFORMATION: // 46
+                                aPdu = new TimeSpacePositionInformationPdu();
+                                break;
 
-                        case GRIDDED_DATA: // 42
-                            aPdu = new GriddedDataPdu();
-                            break;
+                            case APPEARANCE: // 47
+                                aPdu = new AppearancePdu();
+                                break;
 
-                        case POINT_OBJECT_STATE: // 43
-                            aPdu = new PointObjectStatePdu();
-                            break;
+                            case ARTICULATED_PARTS: // 48
+                                aPdu = new ArticulatedPartsPdu();
+                                break;
 
-                        case LINEAR_OBJECT_STATE: // 44
-                            aPdu = new LinearObjectStatePdu();
-                            break;
+                            case LIVE_ENTITY_FIRE: // 49
+                                aPdu = new LiveEntityFirePdu();
+                                break;
 
-                        case AREAL_OBJECT_STATE: // 45
-                            aPdu = new ArealObjectStatePdu();
-                            break;
+                            case LIVE_ENTITY_DETONATION: // 50
+                                aPdu = new LiveEntityDetonationPdu();
+                                break;
 
-                        case TIME_SPACE_POSITION_INFORMATION: // 46
-                            aPdu = new TimeSpacePositionInformationPdu();
-                            break;
+                            case CREATE_ENTITY_RELIABLE: // 51
+                                aPdu = new CreateEntityReliablePdu();
+                                break;
 
-                        case APPEARANCE: // 47
-                            aPdu = new AppearancePdu();
-                            break;
+                            case REMOVE_ENTITY_RELIABLE: // 52
+                                aPdu = new RemoveEntityReliablePdu();
+                                break;
 
-                        case ARTICULATED_PARTS: // 48
-                            aPdu = new ArticulatedPartsPdu();
-                            break;
+                            case START_RESUME_RELIABLE: // 53
+                                aPdu = new StartResumeReliablePdu();
+                                break;
 
-                        case LIVE_ENTITY_FIRE: // 49
-                            aPdu = new LiveEntityFirePdu();
-                            break;
-
-                        case LIVE_ENTITY_DETONATION: // 50
-                            aPdu = new LiveEntityDetonationPdu();
-                            break;
-
-                        case CREATE_ENTITY_RELIABLE: // 51
-                            aPdu = new CreateEntityReliablePdu();
-                            break;
-
-                        case REMOVE_ENTITY_RELIABLE: // 52
-                            aPdu = new RemoveEntityReliablePdu();
-                            break;
-
-                        case START_RESUME_RELIABLE: // 53
-                            aPdu = new StartResumeReliablePdu();
-                            break;
-
-                        case STOP_FREEZE_RELIABLE: // 54
-                            aPdu = new StopFreezeReliablePdu();
-                            break;
-
-                        case ACKNOWLEDGE_RELIABLE: // 55
-                            aPdu = new AcknowledgeReliablePdu();
-                            break;
-
-                        case ACTION_REQUEST_RELIABLE: // 56
-                            aPdu = new ActionRequestReliablePdu();
-                            break;
-
-                        case ACTION_RESPONSE_RELIABLE: // 57
-                            aPdu = new ActionResponseReliablePdu();
-                            break;
-
-                        case DATA_QUERY_RELIABLE: // 58
-                            aPdu = new DataQueryReliablePdu();
-                            break;
-
-                        case SET_DATA_RELIABLE: // 59
-                            aPdu = new SetDataReliablePdu();
-                            break;
-
-                        case DATA_RELIABLE: // 60
-                            aPdu = new DataReliablePdu();
-                            break;
-
-                        case EVENT_REPORT_RELIABLE: // 61
-                            aPdu = new EventReportReliablePdu();
-                            break;
-
-                        case COMMENT_RELIABLE: // 62
-                            aPdu = new CommentReliablePdu();
-                            break;
-
-                        case RECORD_RELIABLE: // 63
-                            aPdu = new RecordReliablePdu();
-                            break;
-
-                        case SET_RECORD_RELIABLE: // 64
-                            aPdu = new SetRecordReliablePdu();
-                            break;
-
-                        case RECORD_QUERY_RELIABLE: // 65
-                            aPdu = new RecordQueryReliablePdu();
-                            break;
-
-                        case COLLISION_ELASTIC: // 66
-                            aPdu = new CollisionElasticPdu();
-                            break;
-
-                        case ENTITY_STATE_UPDATE: // 67
-                            aPdu = new EntityStateUpdatePdu();
-                            break;
-
-                        case DIRECTED_ENERGY_FIRE: // 68
-                            aPdu = new DirectedEnergyFirePdu();
-                            break;
-
-                        case ENTITY_DAMAGE_STATUS: // 69
-                            aPdu = new EntityDamageStatusPdu();
-                            break;
-
-                        case INFORMATION_OPERATIONS_ACTION: // 70
-                            aPdu = new InformationOperationsActionPdu();
-                            break;
-
-                        case INFORMATION_OPERATIONS_REPORT: // 71
-                            aPdu = new InformationOperationsReportPdu();
-                            break;
-
-                        case ATTRIBUTE: // 72
-                            aPdu = new AttributePdu();
-                            break;
-
-                        case COMMENT:
-                            // aPdu = new CommentPdu(); // default for this switch logic
-                            
-                            // see Garrett Loffelman and Pete Severson's code for OpenDis version 4 example
-                            // https://gitlab.nps.edu/Savage/NetworkedGraphicsMV3500/tree/master/assignments/src/MV3500Cohort2018JulySeptember/projects/LoeffelmanSeverson
-                            
-                            CommentPdu    newCommentPdu = new CommentPdu();
-                            ArrayList<VariableDatum> payloadList = new ArrayList<>();
-                            
-                            ArrayList<String> commentsList = new ArrayList<>();
-                            commentsList.add("Hello CommentPDU");
-                            commentsList.add("Here is a second line of text in this comment.");
-                            
-                            if (!commentsList.isEmpty())
-                                System.out.println("Preparing CommentPDU:");
-
-                            for (String comment : commentsList)
-                            {
-                                VariableDatum newVariableDatum = new VariableDatum();
-                                newVariableDatum.setVariableDatumValue (comment.getBytes());               // conversion
-                                newVariableDatum.setVariableDatumLengthInBytes(comment.getBytes().length); // also available in bits, see spec and javadoc
-                                // alternatively, you do not need to set this and the marshaller will figure it out from the byte array
-                                // (see javadoc for VariableDatum.setVariableDatumLength())
-                                payloadList.add(newVariableDatum);
-                                System.out.println("   \"" + comment + "\"");
-                            }
-                            newCommentPdu.setVariableDatums(payloadList);
-                            
-                            aPdu = newCommentPdu; // hand off for sending
-                            break;
-
-                        default:
-                            System.out.println("*** Warning: PDU " + pdu.getValue() + " " + pdu + " not supported, created or sent ");
-
-                            // code generation block for this class follows:
-//                            System.out.println("                    case " + pdu + ": // " + pdu.getValue());
-//                            System.out.println("                        aPdu = new " + pdu.getDescription().replace(" ","").replace("-","").replace("/","") + 
-//                                                                                      "Pdu();");
-//                            System.out.println("                        break;");
-//                            System.out.println();
+                            case STOP_FREEZE_RELIABLE: // 54
+                                aPdu = new StopFreezeReliablePdu();
+                                break;
+
+                            case ACKNOWLEDGE_RELIABLE: // 55
+                                aPdu = new AcknowledgeReliablePdu();
+                                break;
+
+                            case ACTION_REQUEST_RELIABLE: // 56
+                                aPdu = new ActionRequestReliablePdu();
+                                break;
+
+                            case ACTION_RESPONSE_RELIABLE: // 57
+                                aPdu = new ActionResponseReliablePdu();
+                                break;
+
+                            case DATA_QUERY_RELIABLE: // 58
+                                aPdu = new DataQueryReliablePdu();
+                                break;
+
+                            case SET_DATA_RELIABLE: // 59
+                                aPdu = new SetDataReliablePdu();
+                                break;
+
+                            case DATA_RELIABLE: // 60
+                                aPdu = new DataReliablePdu();
+                                break;
+
+                            case EVENT_REPORT_RELIABLE: // 61
+                                aPdu = new EventReportReliablePdu();
+                                break;
+
+                            case COMMENT_RELIABLE: // 62
+                                aPdu = new CommentReliablePdu();
+                                break;
+
+                            case RECORD_RELIABLE: // 63
+                                aPdu = new RecordReliablePdu();
+                                break;
+
+                            case SET_RECORD_RELIABLE: // 64
+                                aPdu = new SetRecordReliablePdu();
+                                break;
+
+                            case RECORD_QUERY_RELIABLE: // 65
+                                aPdu = new RecordQueryReliablePdu();
+                                break;
+
+                            case COLLISION_ELASTIC: // 66
+                                aPdu = new CollisionElasticPdu();
+                                break;
+
+                            case ENTITY_STATE_UPDATE: // 67
+                                aPdu = new EntityStateUpdatePdu();
+                                break;
+
+                            case DIRECTED_ENERGY_FIRE: // 68
+                                aPdu = new DirectedEnergyFirePdu();
+                                break;
+
+                            case ENTITY_DAMAGE_STATUS: // 69
+                                aPdu = new EntityDamageStatusPdu();
+                                break;
+
+                            case INFORMATION_OPERATIONS_ACTION: // 70
+                                aPdu = new InformationOperationsActionPdu();
+                                break;
+
+                            case INFORMATION_OPERATIONS_REPORT: // 71
+                                aPdu = new InformationOperationsReportPdu();
+                                break;
+
+                            case ATTRIBUTE: // 72
+                                aPdu = new AttributePdu();
+                                break;
+
+                            case COMMENT:
+                                // aPdu = new CommentPdu(); // default for this switch logic
+
+                                // see Garrett Loffelman and Pete Severson's code for OpenDis version 4 example
+                                // https://gitlab.nps.edu/Savage/NetworkedGraphicsMV3500/tree/master/assignments/src/MV3500Cohort2018JulySeptember/projects/LoeffelmanSeverson
+
+                                CommentPdu    newCommentPdu = new CommentPdu();
+                                ArrayList<VariableDatum> payloadList = new ArrayList<>();
+
+                                ArrayList<String> commentsList = new ArrayList<>();
+                                commentsList.add("Hello CommentPDU");
+                                commentsList.add("Here is a second line of text in this comment.");
+
+                                if (!commentsList.isEmpty())
+                                    System.out.println("Preparing CommentPDU:");
+
+                                for (String comment : commentsList)
+                                {
+                                    VariableDatum newVariableDatum = new VariableDatum();
+                                    newVariableDatum.setVariableDatumValue (comment.getBytes());               // conversion
+                                    newVariableDatum.setVariableDatumLengthInBytes(comment.getBytes().length); // also available in bits, see spec and javadoc
+                                    // alternatively, you do not need to set this and the marshaller will figure it out from the byte array
+                                    // (see javadoc for VariableDatum.setVariableDatumLength())
+                                    payloadList.add(newVariableDatum);
+                                    System.out.println("   \"" + comment + "\"");
+                                }
+                                newCommentPdu.setVariableDatums(payloadList);
+
+                                aPdu = newCommentPdu; // hand off for sending
+                                break;
+
+                            default:
+                                System.out.println("*** Warning: PDU " + pdu.getValue() + " " + pdu + " not supported, created or sent ");
+
+                                // code generation block for this class follows:
+    //                            System.out.println("                    case " + pdu + ": // " + pdu.getValue());
+    //                            System.out.println("                        aPdu = new " + pdu.getDescription().replace(" ","").replace("-","").replace("/","") + 
+    //                                                                                      "Pdu();");
+    //                            System.out.println("                        break;");
+    //                            System.out.println();
+                        }
+                        if (aPdu != null)
+                        {
+                            generatedPdusList.add(aPdu);
+                        }   
                     }
-                    if (aPdu != null)
+                    catch (Exception e)
                     {
-                        generatedPdusList.add(aPdu);
-                    }   
-                }
-                catch (Exception e)
-                {
-                    System.out.print("Exception thrown for PDU " + pdu.getValue() + " " + pdu);
-                    System.out.print(Arrays.toString(e.getStackTrace()));
-                    // continue looping
+                        System.out.print("Exception thrown for PDU " + pdu.getValue() + " " + pdu);
+                        System.out.print(Arrays.toString(e.getStackTrace()));
+                        // continue looping
+                    }
                 }
-            }
-            if (generatedPdusList.size() != 72) // TODO create an enumeration DISType.TOTAL_PDU_TYPES
-                System.out.println("Error: " + generatedPdusList.size() + " PDUs generated but 72 PDUs expected.");
-            
-            // Send the PDUs we created
-            System.out.println("Send the " + generatedPdusList.size() + " PDUs we created...");
+                if (generatedPdusList.size() != 72) // TODO create an enumeration DISType.TOTAL_PDU_TYPES
+                    System.out.println("Error: " + generatedPdusList.size() + " PDUs generated but 72 PDUs expected.");
 
-            InetAddress localMulticastAddress = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
-            MulticastSocket multicastSocket = new MulticastSocket(DEFAULT_MULTICAST_PORT);
-            multicastSocket.joinGroup(localMulticastAddress);
-            
-            // keep object instantiations outside of loops for best performance
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            DataOutputStream dos = new DataOutputStream(baos);
-            byte[] buffer;
-            Pdu aPdu;
-            DatagramPacket packet;
-
-            for (int idx = 0; idx < generatedPdusList.size(); idx++)
-			{
-                aPdu = generatedPdusList.get(idx);
-                try 
+                // Send the PDUs we created
+                System.out.println("Send the " + generatedPdusList.size() + " PDUs we created...");
+
+                InetAddress localMulticastAddress = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
+                MulticastSocket multicastSocket = new MulticastSocket(DEFAULT_MULTICAST_PORT);
+                multicastSocket.joinGroup(localMulticastAddress);
+
+                // keep object instantiations outside of loops for best performance
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                DataOutputStream dos = new DataOutputStream(baos);
+                byte[] buffer;
+                Pdu aPdu;
+                DatagramPacket packet;
+
+                for (int idx = 0; idx < generatedPdusList.size(); idx++)
                 {
-                    aPdu.marshal(dos);
-
-                    buffer = baos.toByteArray();
-                    packet = new DatagramPacket(buffer, buffer.length, localMulticastAddress, DEFAULT_MULTICAST_PORT);
-                    multicastSocket.send(packet);
-                    String currentPduTypeValuePadded = String.format("%2s",   aPdu.getPduType().getValue());
-                    String currentPduTypePadded      = String.format("%-50s", aPdu.getPduType().toString()); // - indicates right padding of whitespace
-                    System.out.print  ("Sent DIS PDU " + currentPduTypeValuePadded + " " + currentPduTypePadded );
-                    System.out.println(" of type " + aPdu.getClass().getName());
-                    
-//                  Thread.sleep(1000); // pause for debugging
-                } 
-                catch (Exception ex) {
-                    System.out.println("Marshaling error" + ex);
+                    aPdu = generatedPdusList.get(idx);
+                    try 
+                    {
+                        aPdu.marshal(dos);
+
+                        buffer = baos.toByteArray();
+                        packet = new DatagramPacket(buffer, buffer.length, localMulticastAddress, DEFAULT_MULTICAST_PORT);
+                        multicastSocket.send(packet);
+                        String currentPduTypeValuePadded = String.format("%2s",   aPdu.getPduType().getValue());
+                        String currentPduTypePadded      = String.format("%-50s", aPdu.getPduType().toString()); // - indicates right padding of whitespace
+                        System.out.print  ("Sent DIS PDU " + currentPduTypeValuePadded + " " + currentPduTypePadded );
+                        System.out.println(" of type " + aPdu.getClass().getName());
+
+                        if (THREAD_SLEEP_INTERVAL > 0)
+                            Thread.sleep(THREAD_SLEEP_INTERVAL); // pause for debugging
+                    } 
+                    catch (Exception ex) {
+                        System.out.println("Marshaling error" + ex);
+                    }
                 }
             }
-            // write the PDUs out to an XML file.
-            //PduContainer container = new PduContainer();
-            //container.setPdus(generatedPdus);
-            //container.marshallToXml("examplePdus.xml");
-            return generatedPdusList.size();
-        }
-        catch (IOException e)
-		{
-            System.out.println(e);
-            return -1;
-        }
+            catch (IOException e)
+            {
+                System.out.println(e);
+                return -1;
+            }
+        } // end repetion loop
+            
+        // write the PDUs out to an XML file.
+        //PduContainer container = new PduContainer();
+        //container.setPdus(generatedPdus);
+        //container.marshallToXml("examplePdus.xml");
+        return generatedPdusList.size();
     }
 
     public static void main(String args[])