diff --git a/src/test/java/net/onrc/onos/core/matchaction/MatchActionModuleTest.java b/src/test/java/net/onrc/onos/core/matchaction/MatchActionModuleTest.java
new file mode 100644
index 0000000..0a4e8d3
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/matchaction/MatchActionModuleTest.java
@@ -0,0 +1,137 @@
+package net.onrc.onos.core.matchaction;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Set;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit tests for the MatchActionModule.
+ */
+public class MatchActionModuleTest {
+
+    /**
+     * Tests that MatchAction objects added by the executeOperations()
+     * method are properly returned by the getMatchActions() method.
+     */
+    @Test
+    public void testMatchActionModuleGlobalEntriesSet() {
+
+        final int iterations = 5;
+        final MatchActionModule module = new MatchActionModule();
+        final ArrayList<MatchAction> generatedMatchActions = new ArrayList<>();
+
+        // Add some test MatchAction objects. 25 will be added, in 5 blocks
+        // of 5.
+        for (int operationsIteration = 1;
+             operationsIteration <= iterations;
+             operationsIteration++) {
+            final MatchActionOperationsId id =
+                    MatchActionOperationsId.createNewOperationsId();
+            assertThat(id, is(notNullValue()));
+            final MatchActionOperations operations =
+                    MatchActionOperations.createMatchActionsOperations(id);
+            assertThat(operations, is(notNullValue()));
+
+            for (int entriesIteration = 1;
+                 entriesIteration <= iterations;
+                 entriesIteration++) {
+
+                final String entryId = "MA" +
+                        Integer.toString(operationsIteration) +
+                        Integer.toString(entriesIteration);
+                final MatchAction matchAction =
+                        new MatchAction(entryId, null, null, null);
+                final MatchActionOperationEntry entry =
+                        new MatchActionOperationEntry(MatchActionOperations.Operator.ADD,
+                                                      matchAction);
+                operations.addOperation(entry);
+                generatedMatchActions.add(matchAction);
+            }
+
+            // Add the MatchActions generated by this iteration
+            final boolean result = module.executeOperations(operations);
+            assertThat(result, is(true));
+        }
+
+        // Get the list of generated MatchAction objects and make sure its
+        // length is correct.
+        final int generatedCount = generatedMatchActions.size();
+        final Set<MatchAction> matchActions = module.getMatchActions();
+        assertThat(matchActions, hasSize(generatedCount));
+
+        // Make sure that all the created items are in the list
+        final MatchAction[] generatedArray =
+                generatedMatchActions.toArray(new MatchAction[generatedCount]);
+        assertThat(matchActions, containsInAnyOrder(generatedArray));
+
+        //  Make sure that the returned list cannot be modified
+        Throwable errorThrown = null;
+        try {
+            matchActions.add(new MatchAction("", null, null, null));
+        } catch (UnsupportedOperationException e) {
+            errorThrown = e;
+        }
+        assertThat(errorThrown, is(notNullValue()));
+    }
+
+    /**
+     * Tests that adding a duplicate MatchAction via executeOperations()
+     * returns an error.
+     */
+    @Test
+    public void testAddingDuplicateMatchAction() {
+
+        // Create two MatchAction objects using the same ID
+        final MatchAction matchAction =
+                new MatchAction("ID", null, null, null);
+        final MatchAction duplicateMatchAction =
+                new MatchAction("ID", null, null, null);
+
+        // create Operation Entries for the two MatchAction objects
+        final MatchActionOperationEntry entry =
+                new MatchActionOperationEntry(MatchActionOperations.Operator.ADD,
+                        matchAction);
+        final MatchActionOperationEntry duplicateEntry =
+                new MatchActionOperationEntry(MatchActionOperations.Operator.ADD,
+                        duplicateMatchAction);
+
+        // Create an Operations object to execute the first MatchAction
+        final MatchActionOperationsId id =
+                MatchActionOperationsId.createNewOperationsId();
+        assertThat(id, is(notNullValue()));
+        final MatchActionOperations operations =
+                MatchActionOperations.createMatchActionsOperations(id);
+        operations.addOperation(entry);
+
+        // Create a module to use to execute the Operations.
+        final MatchActionModule module = new MatchActionModule();
+
+        // Execute the first set of Operations.  This
+        // should succeed.
+        final boolean result = module.executeOperations(operations);
+        assertThat(result, is(true));
+
+        // Now add the duplicate entry.  This should fail.
+        final MatchActionOperationsId idForDuplicate =
+                MatchActionOperationsId.createNewOperationsId();
+        assertThat(idForDuplicate, is(notNullValue()));
+        final MatchActionOperations operationsForDuplicate =
+                MatchActionOperations.createMatchActionsOperations(idForDuplicate);
+        operationsForDuplicate.addOperation(duplicateEntry);
+
+        final boolean resultForDuplicate =
+                module.executeOperations(operationsForDuplicate);
+        assertThat(resultForDuplicate, is(false));
+
+        // Now add the original entry again.  This should fail.
+        final boolean resultForAddAgain = module.executeOperations(operations);
+        assertThat(resultForAddAgain, is(false));
+    }
+}
diff --git a/src/test/java/net/onrc/onos/core/matchaction/MatchActionOperationsTest.java b/src/test/java/net/onrc/onos/core/matchaction/MatchActionOperationsTest.java
new file mode 100644
index 0000000..fd96de4
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/matchaction/MatchActionOperationsTest.java
@@ -0,0 +1,79 @@
+package net.onrc.onos.core.matchaction;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+import net.onrc.onos.core.util.TestUtils;
+import org.junit.Test;
+
+/**
+ * Unit tests for Match Action Operations.
+ */
+public class MatchActionOperationsTest {
+
+    /**
+     * Test that creation of MatchActionOperations objects is correct and that
+     * the objects have unique identifiers.
+     */
+    @Test
+    public void testMatchActionoperationsCreate() {
+        final MatchActionOperationsId id1 =
+            MatchActionOperationsId.createNewOperationsId();
+        final MatchActionOperations operations1 =
+            MatchActionOperations.createMatchActionsOperations(id1);
+        assertThat(id1, is(notNullValue()));
+        assertThat(id1, is(equalTo(operations1.getOperationsId())));
+
+        final MatchActionOperationsId id2 =
+            MatchActionOperationsId.createNewOperationsId();
+        final MatchActionOperations operations2 =
+            MatchActionOperations.createMatchActionsOperations(id2);
+        assertThat(id2, is(notNullValue()));
+        assertThat(id2, is(equalTo(operations2.getOperationsId())));
+
+        assertThat(id1.getId(), is(not(equalTo(id2.getId()))));
+    }
+
+    /**
+     * Test the correctness of the equals() operation for
+     * MatchActionOperationsId objects.
+     * objects.
+     */
+    @Test
+    public void testMatchActionOperationsIdEquals() {
+        final MatchActionOperationsId id1 =
+                MatchActionOperationsId.createNewOperationsId();
+        final MatchActionOperationsId id2 =
+                MatchActionOperationsId.createNewOperationsId();
+        final MatchActionOperationsId id1Copy =
+                MatchActionOperationsId.createNewOperationsId();
+
+
+        // Check that null does not match
+        assertThat(id1, is(not(equalTo(null))));
+
+        // Check that different objects do not match
+        assertThat(id1, is(not(equalTo(id2))));
+
+        // Check that copies match
+        TestUtils.setField(id1Copy, "id", id1.getId());
+        assertThat(id1, is(equalTo(id1Copy)));
+
+        // Check that the same object matches
+        assertThat(id1, is(equalTo(id1Copy)));
+    }
+
+    /**
+     * Test the correctness of the hashCode() operation for
+     * MatchActionOperationsId objects.
+     */
+    @Test
+    public void testMatchActionOperationsIdHashCode() {
+        final MatchActionOperationsId id1 =
+                MatchActionOperationsId.createNewOperationsId();
+        assertThat(id1.hashCode(), is(equalTo(id1.getId().hashCode())));
+    }
+}
diff --git a/src/test/java/net/onrc/onos/core/matchaction/TestImmutableClasses.java b/src/test/java/net/onrc/onos/core/matchaction/TestImmutableClasses.java
index f1e0857..bd7364b 100644
--- a/src/test/java/net/onrc/onos/core/matchaction/TestImmutableClasses.java
+++ b/src/test/java/net/onrc/onos/core/matchaction/TestImmutableClasses.java
@@ -8,23 +8,43 @@
  */
 public class TestImmutableClasses {
 
+    /**
+     * MatchAction objects should be immutable.
+     */
     @Test
     public void checkMatchActionImmutable() {
         ImmutableClassChecker.assertThatClassIsImmutable(MatchAction.class);
     }
 
+    /**
+     * MatchActionOperationEntry objects should be immutable.
+     */
     @Test
     public void checkMatchActionOperationEntryImmutable() {
         ImmutableClassChecker.assertThatClassIsImmutable(MatchActionOperationEntry.class);
     }
 
+    /**
+     * MatchActionId objects should be immutable.
+     */
     @Test
     public void checkMatchActionId() {
         ImmutableClassChecker.assertThatClassIsImmutable(MatchActionId.class);
     }
 
+    /**
+     * MatchActionOperations objects should be immutable.
+     */
     @Test
     public void checkMatchActionOperations() {
         ImmutableClassChecker.assertThatClassIsImmutable(MatchActionOperations.class);
     }
+
+    /**
+     * MatchActionOperationsId objects should be immutable.
+     */
+    @Test
+    public void checkMatchActionOperationsId() {
+        ImmutableClassChecker.assertThatClassIsImmutable(MatchActionOperationsId.class);
+    }
 }
diff --git a/src/test/java/net/onrc/onos/core/matchaction/TestOperationsCreation.java b/src/test/java/net/onrc/onos/core/matchaction/TestOperationsCreation.java
index 9536848..fc33f14 100644
--- a/src/test/java/net/onrc/onos/core/matchaction/TestOperationsCreation.java
+++ b/src/test/java/net/onrc/onos/core/matchaction/TestOperationsCreation.java
@@ -22,11 +22,14 @@
     @Test
     public void testOperationsCreation() {
         //  Create the MatchActionOperations
-        final MatchActionOperations operations = new MatchActionOperations();
+        final MatchActionOperationsId operationsId =
+            MatchActionOperationsId.createNewOperationsId();
+        final MatchActionOperations operations =
+                MatchActionOperations.createMatchActionsOperations(operationsId);
 
         //  Create one MatchActionEntry and add it to the Operations
-        final String id1 = "MA1";
-        final MatchAction action1 = new MatchAction(id1, null, null, null);
+        final String matchActionId1 = "MA1";
+        final MatchAction action1 = new MatchAction(matchActionId1, null, null, null);
 
         final MatchActionOperationEntry entry1 =
                 new MatchActionOperationEntry(MatchActionOperations.Operator.ADD, action1);
@@ -44,7 +47,7 @@
         assertThat(loadedEntry1, is(notNullValue()));
 
         final MatchAction loadedAction1 = loadedEntry1.getTarget();
-        assertThat(loadedAction1.getId().toString(), is(equalTo(id1)));
+        assertThat(loadedAction1.getId().toString(), is(equalTo(matchActionId1)));
 
         final MatchActionOperations.Operator loadedOperator1 = loadedEntry1.getOperator();
         assertThat(loadedOperator1, is(equalTo(MatchActionOperations.Operator.ADD)));
