diff --git a/assignments/nbproject/genfiles.properties b/assignments/nbproject/genfiles.properties
index 4e1474c0eb7dc2e262cc31bf46c72fec0534b4dc..8db6e92d16272035af6f8a5e7dfdeadb03984180 100644
--- a/assignments/nbproject/genfiles.properties
+++ b/assignments/nbproject/genfiles.properties
@@ -1,5 +1,5 @@
-# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
-# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=4354eb7d
-nbproject/build-impl.xml.script.CRC32=de4433b1
-nbproject/build-impl.xml.stylesheet.CRC32=3a2fa800@1.91.1.48
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=5eaf4250
+nbproject/build-impl.xml.script.CRC32=013963da
+nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48
diff --git a/assignments/src/MV3500Cohort2019JulySeptember/homework4/Boron/BoronEntityStatePduCreator.java b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Boron/BoronEntityStatePduCreator.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d8e42a6e2f33f8249e50402cf3d46ce18df1de9
--- /dev/null
+++ b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Boron/BoronEntityStatePduCreator.java
@@ -0,0 +1,51 @@
+package MV3500Cohort2019JulySeptember.homework4.Boron;
+
+import edu.nps.moves.dis7.*;
+import edu.nps.moves.dis7.enumerations.DISPDUType;
+import edu.nps.moves.dis7.enumerations.ForceID;
+
+/**
+ * Creates structure of an entity PDU and transfers it to BoronPduSender to be sent out
+ * @author jonathanboron
+ */
+public class BoronEntityStatePduCreator {
+        
+    /**
+     * Zero-argument constructor
+     */
+    public BoronEntityStatePduCreator(){}
+    
+    public void newPDU(short s, ForceID fid, double [] l, float[] v, float[] o)
+    {
+        //Create new entity state PDU and set ID and Force ID
+        EntityStatePdu newPdu = new EntityStatePdu();
+        EntityID id = new EntityID();
+        id.setSiteID(s);
+ 
+        newPdu.setEntityID(id);
+        newPdu.setForceId(fid);
+        
+        //Set physical parameters (location, velocity, orientation)
+        
+        Vector3Double location = new Vector3Double();
+        location.setX(l[0]);
+        location.setY(l[1]);
+        location.setZ(l[2]);
+        newPdu.setEntityLocation(location);
+        
+        Vector3Float velocity = new Vector3Float();
+        velocity.setX(v[0]);
+        velocity.setY(v[1]);
+        velocity.setZ(v[2]);
+        newPdu.setEntityLinearVelocity(velocity);
+        
+        EulerAngles orientation = new EulerAngles();
+        orientation.setPhi(o[0]);
+        orientation.setPsi(o[1]);
+        orientation.setTheta(o[2]);
+        newPdu.setEntityOrientation(orientation);
+        
+
+    }
+    
+}
diff --git a/assignments/src/MV3500Cohort2019JulySeptember/homework4/Boron/BoronPduReceiver.java b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Boron/BoronPduReceiver.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f78bf5cfc33233a16f394063cd92ca97e30ef4f
--- /dev/null
+++ b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Boron/BoronPduReceiver.java
@@ -0,0 +1,80 @@
+package MV3500Cohort2019JulySeptember.homework4.Boron;
+
+import java.net.*;
+import java.io.*;
+
+import edu.nps.moves.dis7.*;
+import edu.nps.moves.dis7.enumerations.*;
+import edu.nps.moves.dis7.util.*;
+
+public class BoronPduReceiver
+{
+  public static final int DEFAULT_MULTICAST_PORT = BoronPduSender.DEFAULT_MULTICAST_PORT;
+  public static final String DEFAULT_MULTICAST_ADDRESS = BoronPduSender.DEFAULT_MULTICAST_ADDRESS;
+  public static final boolean USE_FAST_ESPDU = false;
+
+  public static void main(String args[])
+  {
+    PduFactory factory;
+    MulticastSocket socket;
+    InetAddress address;
+    DatagramPacket packet;
+
+    try {
+      System.out.println("DisExamplesOpenDis7.AllPduReceiver started...");
+      if (args.length == 2) {
+        socket = new MulticastSocket(Integer.parseInt(args[0]));
+        address = InetAddress.getByName(args[1]);
+      }
+      else {
+        System.out.println("Usage:   AllPduReceiver <port> <multicast group>");
+        System.out.println("Default: AllPduReceiver " + DEFAULT_MULTICAST_PORT + "   " + DEFAULT_MULTICAST_ADDRESS);
+        socket = new MulticastSocket(DEFAULT_MULTICAST_PORT);
+        address = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
+      }
+      socket.joinGroup(address);
+
+      factory = new PduFactory();
+
+      while (true) // Loop infinitely, receiving datagrams
+      {
+        byte buffer[] = new byte[1500]; // typical MTU size
+
+        packet = new DatagramPacket(buffer, buffer.length); // reset
+
+        socket.receive(packet);
+
+        Pdu pdu = factory.createPdu(packet.getData());
+        if (pdu != null) {
+          DISPDUType currentPduType = pdu.getPduType(); //short  currentPduType = pdu.getPduType();
+          String currentPduTypeName = pdu.getClass().getName();
+          DISProtocolFamily currentProtocolFamilyID = pdu.getProtocolFamily(); //short  currentProtocolFamilyID = pdu.getProtocolFamily();
+          String currentPduFamilyName = pdu.getClass().getSuperclass().getSimpleName();
+
+          StringBuilder message = new StringBuilder();
+          message.append("received DIS PDU ");
+          if (currentPduType.getValue() < 10)
+            message.append(" ");
+          message.append(currentPduType.getValue());
+          String currentPduTypePadded     = String.format("%-34s", currentPduType); // - indicates right padding of whitespace
+          message.append(" " ).append(currentPduTypePadded);
+          String currentPduTypeNamePadded = String.format("%-49s", currentPduTypeName); // - indicates right padding of whitespace
+          message.append(" of type ").append(currentPduTypeNamePadded); // package.class name
+          message.append(" (protocolFamily ").append(currentProtocolFamilyID);
+//        message.append(" ").append(currentPduFamilyName); // class name is also available
+         message.append(")");
+          System.out.println(message.toString());
+        }
+        else
+          System.out.println("received packet but pdu is null, packet.getData().length=" + packet.getData().length + ", error...");
+      }
+    }
+    catch (IOException e) {
+      System.out.println("Problem with DisExamplesOpenDis7.AllPduReceiver, see exception trace:");
+      System.out.println(e);
+    }
+    finally {
+      System.out.println("DisExamplesOpenDis7.AllPduReceiver complete.");
+    }
+  }
+}
diff --git a/assignments/src/MV3500Cohort2019JulySeptember/homework4/Boron/BoronPduSender.java b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Boron/BoronPduSender.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f8179fdb897c8bf960ab18293d64499fc7e6e65
--- /dev/null
+++ b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Boron/BoronPduSender.java
@@ -0,0 +1,449 @@
+package MV3500Cohort2019JulySeptember.homework4.Boron;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+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
+ * 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
+ *
+ * @author DMcG
+ * @version $Id:$
+ */
+public class BoronPduSender
+{
+    /** Default multicast group address we send on. */
+    public static final String DEFAULT_MULTICAST_ADDRESS = "239.1.2.3";
+	
+    /** Default multicast port used, matches Wireshark DIS capture default */
+    public static final int    DEFAULT_MULTICAST_PORT    = 3000;
+	
+    private int port;
+    InetAddress multicastAddress;
+
+    public BoronPduSender(int port, String multicast) {
+        try
+		{
+            this.port = port;
+            multicastAddress = InetAddress.getByName(multicast);
+            if (!multicastAddress.isMulticastAddress())
+			{
+                System.out.println("Not a multicast address: " + multicast);
+            }
+        } 
+		catch (UnknownHostException e) {
+            System.out.println("Unable to open socket: " + e);
+        }
+    }
+
+    public void run()
+	{
+		System.out.println("DisExamplesOpenDis7.AllPduSender started...");
+        try
+        {
+            System.out.println("Generate PDUs and note issues, if any...");
+            List<Pdu> generatedPdusList = new ArrayList<>();
+
+            // 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
+
+                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
+                    {
+                        case OTHER: // 0
+                            System.out.println ("*** Note: DISPDUType." + pdu.name() + " not supported"); // TODO why was this received?
+                            // nothing to send
+                            break;
+
+                        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 RECEIVER: // 27
+                            aPdu = new ReceiverPdu();
+                            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 INTERCOM_CONTROL: // 32
+                            aPdu = new IntercomControlPdu();
+                            break;
+
+                        case AGGREGATE_STATE: // 33
+                            aPdu = new AggregateStatePdu();
+                            break;
+
+                        case ISGROUPOF: // 34
+                            aPdu = new IsGroupOfPdu();
+                            break;
+
+                        case TRANSFER_OWNERSHIP: // 35
+                            aPdu = new TransferOwnershipPdu();
+                            break;
+
+                        case ISPARTOF: // 36
+                            aPdu = new IsPartOfPdu();
+                            break;
+
+                        case MINEFIELD_STATE: // 37
+                            aPdu = new MinefieldStatePdu();
+                            break;
+
+                        case MINEFIELD_QUERY: // 38
+                            aPdu = new MinefieldQueryPdu();
+                            break;
+
+                        case MINEFIELD_DATA: // 39
+                            aPdu = new MinefieldDataPdu();
+                            break;
+
+                        case MINEFIELD_RESPONSE_NACK: // 40
+                            aPdu = new MinefieldResponseNACKPdu();
+                            break;
+
+                        case ENVIRONMENTAL_PROCESS: // 41
+                            aPdu = new EnvironmentalProcessPdu();
+                            break;
+
+                        case GRIDDED_DATA: // 42
+                            aPdu = new GriddedDataPdu();
+                            break;
+
+                        case POINT_OBJECT_STATE: // 43
+                            aPdu = new PointObjectStatePdu();
+                            break;
+
+                        case LINEAR_OBJECT_STATE: // 44
+                            aPdu = new LinearObjectStatePdu();
+                            break;
+
+                        case AREAL_OBJECT_STATE: // 45
+                            aPdu = new ArealObjectStatePdu();
+                            break;
+
+                        case TIME_SPACE_POSITION_INFORMATION: // 46
+                            aPdu = new TimeSpacePositionInformationPdu();
+                            break;
+
+                        case APPEARANCE: // 47
+                            aPdu = new AppearancePdu();
+                            break;
+
+                        case ARTICULATED_PARTS: // 48
+                            aPdu = new ArticulatedPartsPdu();
+                            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();
+                            CommentPdu    newCommentPdu = (CommentPdu)aPdu;
+                            VariableDatum newVariableDatum = new VariableDatum();
+                            // etc. see Garrett and Pete's code
+                            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);
+                    }   
+                }
+                catch (Exception e)
+                {
+                    System.out.print("Exception thrown for PDU " + pdu.getValue() + " " + pdu);
+                    System.out.print(Arrays.toString(e.getStackTrace()));
+                    // continue looping
+                }
+            }
+            // Send the PDUs we created
+            System.out.println("Send the " + generatedPdusList.size() + " PDUs we created...");
+
+            InetAddress localMulticastAddress = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
+            MulticastSocket socket = new MulticastSocket(DEFAULT_MULTICAST_PORT);
+            socket.joinGroup(localMulticastAddress);
+
+            for (int idx = 0; idx < generatedPdusList.size(); idx++)
+			{
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                DataOutputStream dos = new DataOutputStream(baos);
+                byte[] buffer;
+
+                Pdu aPdu = generatedPdusList.get(idx);
+                aPdu.marshal(dos);
+
+                buffer = baos.toByteArray();
+                DatagramPacket packet = new DatagramPacket(buffer, buffer.length, localMulticastAddress, DEFAULT_MULTICAST_PORT);
+                socket.send(packet);
+                try {
+                    Thread.sleep(100L);
+                } catch (InterruptedException ex) {
+                }
+                String currentPduTypeValuePadded = String.format("%2s", aPdu.getPduType().getValue());
+                String currentPduTypePadded = String.format("%-34s", aPdu.getPduType()); // - indicates right padding of whitespace
+                System.out.print  ("Sent DIS PDU " + currentPduTypeValuePadded + " " + currentPduTypePadded );
+                System.out.println(" of type " + aPdu.getClass().getName());
+            }
+            // write the PDUs out to an XML file.
+            //PduContainer container = new PduContainer();
+            //container.setPdus(generatedPdus);
+            //container.marshallToXml("examplePdus.xml");
+        }
+        catch (IOException e)
+		{
+            System.out.println(e);
+        }
+    }
+
+    public static void main(String args[])
+	{
+        if (args.length == 2)
+        {
+            BoronPduSender sender = new BoronPduSender(Integer.parseInt(args[0]), args[1]);
+            sender.run();
+        } 
+        else
+        {
+            System.out.println("Usage:   AllPduSender <port> <multicast group>");
+            System.out.println("Default: AllPduSender  " + DEFAULT_MULTICAST_PORT + "   " + DEFAULT_MULTICAST_ADDRESS);
+            BoronPduSender sender = new  BoronPduSender(DEFAULT_MULTICAST_PORT, DEFAULT_MULTICAST_ADDRESS);
+            sender.run();
+        }
+        System.out.println("DisExamplesOpenDis7.AllPduSender complete.");
+    }
+}