diff --git a/src/test/java/net/onrc/onos/core/matchaction/MatchActionIdGeneratorTest.java b/src/test/java/net/onrc/onos/core/matchaction/MatchActionIdGeneratorTest.java
new file mode 100644
index 0000000..cb4ed35
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/matchaction/MatchActionIdGeneratorTest.java
@@ -0,0 +1,47 @@
+package net.onrc.onos.core.matchaction;
+
+import net.onrc.onos.core.util.IdBlock;
+import net.onrc.onos.core.util.IdBlockAllocator;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Tests MatchActionIdGeneratorWithIdBlockAllocator.
+ */
+public class MatchActionIdGeneratorTest {
+    private IdBlockAllocator allocator;
+
+    @Before
+    public void setUp() {
+        allocator = createMock(IdBlockAllocator.class);
+
+    }
+
+    /**
+     * Tests generated MatchActionId sequences using two {@link net.onrc.onos.core.util.IdBlock blocks}.
+     */
+    @Test
+    public void testIds() {
+        expect(allocator.allocateUniqueIdBlock())
+                .andReturn(new IdBlock(0, 3))
+                .andReturn(new IdBlock(4, 3));
+
+        replay(allocator);
+        final MatchActionIdGeneratorWithIdBlockAllocator matchActionIdGenerator =
+            new MatchActionIdGeneratorWithIdBlockAllocator(allocator);
+
+        assertThat(matchActionIdGenerator.getNewId(), is(new MatchActionId(0L)));
+        assertThat(matchActionIdGenerator.getNewId(), is(new MatchActionId(1L)));
+        assertThat(matchActionIdGenerator.getNewId(), is(new MatchActionId(2L)));
+
+        assertThat(matchActionIdGenerator.getNewId(), is(new MatchActionId(4L)));
+        assertThat(matchActionIdGenerator.getNewId(), is(new MatchActionId(5L)));
+        assertThat(matchActionIdGenerator.getNewId(), is(new MatchActionId(6L)));
+    }
+}
diff --git a/src/test/java/net/onrc/onos/core/matchaction/MatchActionModuleTest.java b/src/test/java/net/onrc/onos/core/matchaction/MatchActionModuleTest.java
index 0a4e8d3..37fb579 100644
--- a/src/test/java/net/onrc/onos/core/matchaction/MatchActionModuleTest.java
+++ b/src/test/java/net/onrc/onos/core/matchaction/MatchActionModuleTest.java
@@ -33,19 +33,20 @@
              operationsIteration <= iterations;
              operationsIteration++) {
             final MatchActionOperationsId id =
-                    MatchActionOperationsId.createNewOperationsId();
+                    new MatchActionOperationsId(1L);
             assertThat(id, is(notNullValue()));
             final MatchActionOperations operations =
-                    MatchActionOperations.createMatchActionsOperations(id);
+                    new MatchActionOperations(id);
             assertThat(operations, is(notNullValue()));
 
             for (int entriesIteration = 1;
                  entriesIteration <= iterations;
                  entriesIteration++) {
 
-                final String entryId = "MA" +
-                        Integer.toString(operationsIteration) +
-                        Integer.toString(entriesIteration);
+                final MatchActionId entryId =
+                        new MatchActionId(
+                        (operationsIteration * 10) +
+                        entriesIteration);
                 final MatchAction matchAction =
                         new MatchAction(entryId, null, null, null);
                 final MatchActionOperationEntry entry =
@@ -74,7 +75,7 @@
         //  Make sure that the returned list cannot be modified
         Throwable errorThrown = null;
         try {
-            matchActions.add(new MatchAction("", null, null, null));
+            matchActions.add(new MatchAction(new MatchActionId(1L), null, null, null));
         } catch (UnsupportedOperationException e) {
             errorThrown = e;
         }
@@ -90,9 +91,9 @@
 
         // Create two MatchAction objects using the same ID
         final MatchAction matchAction =
-                new MatchAction("ID", null, null, null);
+                new MatchAction(new MatchActionId(111L), null, null, null);
         final MatchAction duplicateMatchAction =
-                new MatchAction("ID", null, null, null);
+                new MatchAction(new MatchActionId(111L), null, null, null);
 
         // create Operation Entries for the two MatchAction objects
         final MatchActionOperationEntry entry =
@@ -104,10 +105,10 @@
 
         // Create an Operations object to execute the first MatchAction
         final MatchActionOperationsId id =
-                MatchActionOperationsId.createNewOperationsId();
+                new MatchActionOperationsId(11L);
         assertThat(id, is(notNullValue()));
         final MatchActionOperations operations =
-                MatchActionOperations.createMatchActionsOperations(id);
+                new MatchActionOperations(id);
         operations.addOperation(entry);
 
         // Create a module to use to execute the Operations.
@@ -120,10 +121,10 @@
 
         // Now add the duplicate entry.  This should fail.
         final MatchActionOperationsId idForDuplicate =
-                MatchActionOperationsId.createNewOperationsId();
+                new MatchActionOperationsId(22L);
         assertThat(idForDuplicate, is(notNullValue()));
         final MatchActionOperations operationsForDuplicate =
-                MatchActionOperations.createMatchActionsOperations(idForDuplicate);
+                new MatchActionOperations(idForDuplicate);
         operationsForDuplicate.addOperation(duplicateEntry);
 
         final boolean resultForDuplicate =
diff --git a/src/test/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGeneratorTest.java b/src/test/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGeneratorTest.java
new file mode 100644
index 0000000..e95f1df
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGeneratorTest.java
@@ -0,0 +1,49 @@
+package net.onrc.onos.core.matchaction;
+
+import net.onrc.onos.core.util.IdBlock;
+import net.onrc.onos.core.util.IdBlockAllocator;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Tests MatchActionOperationsIdGeneratorWithIdBlockAllocator.
+ */
+public class MatchActionOperationsIdGeneratorTest {
+
+    private IdBlockAllocator allocator;
+
+    @Before
+    public void setUp() {
+        allocator = createMock(IdBlockAllocator.class);
+
+    }
+
+    /**
+     * Tests generated MatchActionOperationsId sequences using two {@link net.onrc.onos.core.util.IdBlock blocks}.
+     */
+    @Test
+    public void testIds() {
+        expect(allocator.allocateUniqueIdBlock())
+                .andReturn(new IdBlock(0, 3))
+                .andReturn(new IdBlock(4, 3));
+
+        replay(allocator);
+        final MatchActionOperationsIdGeneratorWithIdBlockAllocator generator =
+                new MatchActionOperationsIdGeneratorWithIdBlockAllocator(allocator);
+
+        assertThat(generator.getNewId(), is(new MatchActionOperationsId(0L)));
+        assertThat(generator.getNewId(), is(new MatchActionOperationsId(1L)));
+        assertThat(generator.getNewId(), is(new MatchActionOperationsId(2L)));
+
+        assertThat(generator.getNewId(), is(new MatchActionOperationsId(4L)));
+        assertThat(generator.getNewId(), is(new MatchActionOperationsId(5L)));
+        assertThat(generator.getNewId(), is(new MatchActionOperationsId(6L)));
+    }
+}
+
diff --git a/src/test/java/net/onrc/onos/core/matchaction/MatchActionOperationsTest.java b/src/test/java/net/onrc/onos/core/matchaction/MatchActionOperationsTest.java
index fd96de4..b01f1c8 100644
--- a/src/test/java/net/onrc/onos/core/matchaction/MatchActionOperationsTest.java
+++ b/src/test/java/net/onrc/onos/core/matchaction/MatchActionOperationsTest.java
@@ -21,16 +21,16 @@
     @Test
     public void testMatchActionoperationsCreate() {
         final MatchActionOperationsId id1 =
-            MatchActionOperationsId.createNewOperationsId();
+            new MatchActionOperationsId(1L);
         final MatchActionOperations operations1 =
-            MatchActionOperations.createMatchActionsOperations(id1);
+            new MatchActionOperations(id1);
         assertThat(id1, is(notNullValue()));
         assertThat(id1, is(equalTo(operations1.getOperationsId())));
 
         final MatchActionOperationsId id2 =
-            MatchActionOperationsId.createNewOperationsId();
+            new MatchActionOperationsId(2L);
         final MatchActionOperations operations2 =
-            MatchActionOperations.createMatchActionsOperations(id2);
+            new MatchActionOperations(id2);
         assertThat(id2, is(notNullValue()));
         assertThat(id2, is(equalTo(operations2.getOperationsId())));
 
@@ -45,11 +45,11 @@
     @Test
     public void testMatchActionOperationsIdEquals() {
         final MatchActionOperationsId id1 =
-                MatchActionOperationsId.createNewOperationsId();
+                new MatchActionOperationsId(1L);
         final MatchActionOperationsId id2 =
-                MatchActionOperationsId.createNewOperationsId();
+                new MatchActionOperationsId(2L);
         final MatchActionOperationsId id1Copy =
-                MatchActionOperationsId.createNewOperationsId();
+                new MatchActionOperationsId(1L);
 
 
         // Check that null does not match
@@ -73,7 +73,7 @@
     @Test
     public void testMatchActionOperationsIdHashCode() {
         final MatchActionOperationsId id1 =
-                MatchActionOperationsId.createNewOperationsId();
-        assertThat(id1.hashCode(), is(equalTo(id1.getId().hashCode())));
+                new MatchActionOperationsId(22L);
+        assertThat(id1.hashCode(), is(equalTo(22)));
     }
 }
diff --git a/src/test/java/net/onrc/onos/core/matchaction/MatchActionTest.java b/src/test/java/net/onrc/onos/core/matchaction/MatchActionTest.java
index cb32096..2684f19 100644
--- a/src/test/java/net/onrc/onos/core/matchaction/MatchActionTest.java
+++ b/src/test/java/net/onrc/onos/core/matchaction/MatchActionTest.java
@@ -22,7 +22,7 @@
         builder.setDstTcpPort((short) 80);
         List<Action> actions = new LinkedList<Action>();
         actions.add(new ModifyDstMacAction(MACAddress.valueOf("00:01:02:03:04:05")));
-        MatchAction ma = new MatchAction("1", port, builder.build(), actions);
+        MatchAction ma = new MatchAction(new MatchActionId(1L), port, builder.build(), actions);
 
         assertEquals(actions, ma.getActions());
         assertEquals("1", ma.getId().toString());
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 fc33f14..2278949 100644
--- a/src/test/java/net/onrc/onos/core/matchaction/TestOperationsCreation.java
+++ b/src/test/java/net/onrc/onos/core/matchaction/TestOperationsCreation.java
@@ -23,12 +23,13 @@
     public void testOperationsCreation() {
         //  Create the MatchActionOperations
         final MatchActionOperationsId operationsId =
-            MatchActionOperationsId.createNewOperationsId();
+            new MatchActionOperationsId(1L);
         final MatchActionOperations operations =
-                MatchActionOperations.createMatchActionsOperations(operationsId);
+                new MatchActionOperations(operationsId);
 
         //  Create one MatchActionEntry and add it to the Operations
-        final String matchActionId1 = "MA1";
+
+        final MatchActionId matchActionId1 = new MatchActionId(1L);
         final MatchAction action1 = new MatchAction(matchActionId1, null, null, null);
 
         final MatchActionOperationEntry entry1 =
@@ -47,7 +48,8 @@
         assertThat(loadedEntry1, is(notNullValue()));
 
         final MatchAction loadedAction1 = loadedEntry1.getTarget();
-        assertThat(loadedAction1.getId().toString(), is(equalTo(matchActionId1)));
+        assertThat(loadedAction1.getId().toString(),
+                   is(equalTo(matchActionId1.toString())));
 
         final MatchActionOperations.Operator loadedOperator1 = loadedEntry1.getOperator();
         assertThat(loadedOperator1, is(equalTo(MatchActionOperations.Operator.ADD)));
