diff --git a/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduReceiver.java b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduReceiver.java
new file mode 100644
index 0000000000000000000000000000000000000000..c080c6ede0f654ffe8d166a920baba7b25f8d453
--- /dev/null
+++ b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduReceiver.java
@@ -0,0 +1,66 @@
+package MV3500Cohort2019JulySeptember.homework4.Fetterolf;
+
+// originally edu.nps.moves.examples.ReceiverPerformance
+import java.net.*;
+
+import edu.nps.moves.dis.*;
+import edu.nps.moves.disutil.PduFactory;
+import java.io.IOException;
+
+public class PduReceiver {
+
+    public static final int MULTICAST_PORT = 3000;
+    public static final String MULTICAST_GROUP = "239.1.2.3";
+    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("DisExamples.PduReceiver started...");
+            socket = new MulticastSocket(MULTICAST_PORT);
+            address = InetAddress.getByName(MULTICAST_GROUP);
+            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) {
+                    short currentPduType = pdu.getPduType();
+                    String currentPduTypeName = pdu.getClass().getName();
+                    short currentProtocolFamilyID = pdu.getProtocolFamily();
+                    String currentPduFamilyName = pdu.getClass().getSuperclass().getSimpleName();
+
+                    StringBuilder message = new StringBuilder();
+                    message.append("received DIS PDU: ");
+                    message.append("pduType ");
+                    if (currentPduType < 10) {
+                        message.append(" ");
+                    }
+                    message.append(currentPduType).append(" ").append(currentPduTypeName);
+                    message.append(", protocolFamily ").append(currentProtocolFamilyID);
+                    message.append(" ").append(currentPduFamilyName);
+                    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 DisExamples.PduReceiver, see exception trace:");
+            System.out.println(e);
+        } finally {
+            System.out.println("DisExamples.PduReceiver complete.");
+        }
+    }
+}
diff --git a/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduSender.java b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduSender.java
new file mode 100644
index 0000000000000000000000000000000000000000..f6c24eeec07f333f0e94b03422ba977580407934
--- /dev/null
+++ b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduSender.java
@@ -0,0 +1,192 @@
+package MV3500Cohort2019JulySeptember.homework4.Fetterolf;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+import edu.nps.moves.dis.*;
+import edu.nps.moves.disenum.*;
+import edu.nps.moves.examples.ClassNameComparator;
+
+/**
+ * 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 PduSender {
+
+    /**
+     * 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 PduSender(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("DisExamples.PduSender started...");
+        try {
+            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 (PduType pdu : PduType.values()) {
+                Pdu aPdu = null; // edu.​nps .​moves.​dis,PDU superclass for all PDUs, 
+
+                switch (pdu) // using enumeration values from edu.nps.moves.disenum.*
+                {
+                    case ENTITY_STATE:
+                        aPdu = new EntityStatePdu();
+                        EntityStatePdu espdu = (EntityStatePdu) aPdu;
+                        Marking marking = new Marking();
+                        marking.setCharactersString("PduSender"); // 11 characters max
+                        espdu.setMarking(marking);
+                        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 COMMENT:
+                        aPdu = new CommentPdu();
+                        CommentPdu newCommentPdu = (CommentPdu) aPdu;
+                        VariableDatum newVariableDatum = new VariableDatum();
+                        // etc. see Garrett and Pete's code
+                        break;
+
+                    case FIRE:
+                        aPdu = new FirePdu();
+                        break;
+
+                    case DETONATION:
+                        aPdu = new DetonationPdu();
+                        break;
+
+                    case COLLISION:
+                        aPdu = new CollisionPdu();
+                        break;
+
+                    case SERVICE_REQUEST:
+                        aPdu = new ServiceRequestPdu();
+                        break;
+
+                    case RESUPPLY_OFFER:
+                        aPdu = new ResupplyOfferPdu();
+                        break;
+
+                    case RESUPPLY_RECEIVED:
+                        aPdu = new ResupplyReceivedPdu();
+                        break;
+
+                    case RESUPPLY_CANCEL:
+                        aPdu = new ResupplyCancelPdu();
+                        break;
+
+                    case REPAIR_COMPLETE:
+                        aPdu = new RepairCompletePdu();
+                        break;
+
+                    case REPAIR_RESPONSE:
+                        aPdu = new RepairResponsePdu();
+                        break;
+
+                    case CREATE_ENTITY:
+                        aPdu = new CreateEntityPdu();
+                        break;
+
+                    case REMOVE_ENTITY:
+                        aPdu = new RemoveEntityPdu();
+                        break;
+
+                    case START_RESUME:
+                        aPdu = new StartResumePdu();
+                        break;
+
+                    case STOP_FREEZE:
+                        aPdu = new StopFreezePdu();
+                        break;
+
+                    case ACKNOWLEDGE:
+                        aPdu = new AcknowledgePdu();
+                        break;
+
+                    case ACTION_REQUEST:
+                        aPdu = new ActionRequestPdu();
+                        break;
+
+                    default:
+                        System.out.print("PDU of type " + pdu + " not supported, created or sent ");
+                        System.out.println();
+                }
+                if (aPdu != null) {
+                    generatedPdusList.add(aPdu);
+                }
+            }
+
+            // Sort the created PDUs by class name, if desired
+//            Collections.sort(generatedPdusList, new ClassNameComparator());
+            System.out.println("Send the " + generatedPdusList.size() + " PDUs we created...");
+
+            // Send the 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);
+                System.out.println("Sent PDU 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) {
+            PduSender sender = new PduSender(Integer.parseInt(args[0]), args[1]);
+            sender.run();
+        } else {
+            System.out.println("Usage:   PduSender <port> <multicast group>");
+            System.out.println("Default: PduSender  " + DEFAULT_MULTICAST_PORT + "   " + DEFAULT_MULTICAST_ADDRESS);
+            PduSender sender = new PduSender(DEFAULT_MULTICAST_PORT, DEFAULT_MULTICAST_ADDRESS);
+            sender.run();
+        }
+    }
+}