diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java b/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java
index 24790b8..5f7d9fb 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java
@@ -24,8 +24,23 @@
      * @param match the Match object as match condition on the port
      * @param actions the list of Action objects as actions on the switch
      */
+    public MatchAction(MatchActionId id, SwitchPort port, Match match, List<Action> actions) {
+        this.id = id;
+        this.port = port;
+        this.match = match;
+        this.actions = actions;
+    }
+
+    /**
+     * Constructor. TEMPORARY
+     *
+     * @param id ID for this MatchAction object
+     * @param port switch port to apply changes to
+     * @param match the Match object as match condition on the port
+     * @param actions the list of Action objects as actions on the switch
+     */
     public MatchAction(String id, SwitchPort port, Match match, List<Action> actions) {
-        this.id = new MatchActionId(id);
+        this.id = null;
         this.port = port;
         this.match = match;
         this.actions = actions;
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java
index b520439..3dcb64c 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java
@@ -2,36 +2,38 @@
 
 import net.onrc.onos.api.batchoperation.BatchOperationTarget;
 
+import java.util.Objects;
+
 /**
  * A unique identifier for a MatchAction.  Objects of this class are immutable.
  */
 public final class MatchActionId implements BatchOperationTarget {
-    private final String value;
+    private final long value;
 
     /**
      * Creates a new Match Action Identifier based on the given id string.
      *
      * @param id unique id string
      */
-    public MatchActionId(String id) {
+    public MatchActionId(long id) {
         value = id;
     }
 
     @Override
     public String toString() {
-        return value;
+        return Long.toString(value);
     }
 
     @Override
     public int hashCode() {
-        return value.hashCode();
+        return Objects.hashCode(value);
     }
 
     @Override
     public boolean equals(Object obj) {
         if (obj instanceof MatchActionId) {
-            MatchActionId other = (MatchActionId) obj;
-            return (value.equals(other.value));
+            final MatchActionId that = (MatchActionId) obj;
+            return this.value == that.value;
         }
         return false;
     }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGenerator.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGenerator.java
new file mode 100644
index 0000000..4f36d7c
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGenerator.java
@@ -0,0 +1,10 @@
+package net.onrc.onos.core.matchaction;
+/**
+  * A generator of MatchActionId.
+  */
+public interface MatchActionIdGenerator {
+    /**
+      * Generates a globally unique MatchActionId instance.
+      */
+    MatchActionId getNewId();
+}
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGeneratorWithIdBlockAllocator.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGeneratorWithIdBlockAllocator.java
new file mode 100644
index 0000000..2c92ff7
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionIdGeneratorWithIdBlockAllocator.java
@@ -0,0 +1,37 @@
+package net.onrc.onos.core.matchaction;
+
+import net.onrc.onos.core.util.IdBlock;
+import net.onrc.onos.core.util.IdBlockAllocator;
+import net.onrc.onos.core.util.UnavailableIdException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Generates a global unique MatchActionIdId.
+ */
+public class MatchActionIdGeneratorWithIdBlockAllocator
+        implements MatchActionIdGenerator {
+
+        private final IdBlockAllocator allocator;
+        private IdBlock idBlock;
+
+        /**
+          * Creates a FlowId generator instance using specified ID block allocator.
+          *
+          * @param allocator the ID block allocator to be used
+          */
+        public MatchActionIdGeneratorWithIdBlockAllocator(IdBlockAllocator allocator) {
+            this.allocator = checkNotNull(allocator);
+            this.idBlock = allocator.allocateUniqueIdBlock();
+        }
+
+        @Override
+        public synchronized MatchActionId getNewId() {
+            try {
+                return new MatchActionId(idBlock.getNextId());
+            } catch (UnavailableIdException e) {
+                idBlock = allocator.allocateUniqueIdBlock();
+                return new MatchActionId(idBlock.getNextId());
+            }
+        }
+}
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java
index a17d0f2..c865203 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java
@@ -28,22 +28,11 @@
      *
      * @param newId match action operations identifier for this instance
      */
-    private MatchActionOperations(final MatchActionOperationsId newId) {
+    public MatchActionOperations(final MatchActionOperationsId newId) {
         id = checkNotNull(newId);
     }
 
     /**
-     * Creates a MatchActionOperations object from an id.
-     *
-     * @param newId match action operations identifier to use for the new object
-     * @return Match Action Operations object
-     */
-    public static MatchActionOperations createMatchActionsOperations(
-            final MatchActionOperationsId newId) {
-        return new MatchActionOperations(newId);
-    }
-
-    /**
      * Gets the identifier for the Match Action Operations object.
      *
      * @return identifier for the Opertions object
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java
index 7c9d1db..e346732 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java
@@ -1,6 +1,6 @@
 package net.onrc.onos.core.matchaction;
 
-import java.util.UUID;
+import java.util.Objects;
 
 /**
  * Identifier for a MatchActionOperations object.  This is an immutable class
@@ -9,15 +9,13 @@
  */
 public final class MatchActionOperationsId {
 
-    private static final String OPERATIONS_ID_PREFIX = "MatchActionOperationsId-";
-    private final String id;
+    private final long id;
 
     /**
-     * Constructs an Operations identifier and allocates a unique identifier
-     * for it.
+     * Constructs an Operations identifier and from a unique identifier.
      */
-    private MatchActionOperationsId() {
-        id = OPERATIONS_ID_PREFIX + UUID.randomUUID();
+    public MatchActionOperationsId(final long newId) {
+        id = newId;
     }
 
     /**
@@ -25,7 +23,7 @@
      *
      * @return Operations object identifier as a string
      */
-    public String getId() {
+    public long getId() {
         return id;
     }
 
@@ -39,24 +37,13 @@
             return false;
         }
 
-        final MatchActionOperationsId otherMatchActionOperationsId =
-                (MatchActionOperationsId) other;
+        final MatchActionOperationsId that = (MatchActionOperationsId) other;
 
-        return otherMatchActionOperationsId.getId().equals(getId());
+        return this.getId() == that.getId();
     }
 
     @Override
     public int hashCode() {
-        return id.hashCode();
+        return Objects.hashCode(id);
     }
-
-    /**
-     * Creates a new Id for a MatchActionOperation.
-     *
-     * @return new Id for a MatchActionOperation
-     */
-    public static MatchActionOperationsId createNewOperationsId() {
-        return new MatchActionOperationsId();
-    }
-
 }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGenerator.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGenerator.java
new file mode 100644
index 0000000..3274224
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGenerator.java
@@ -0,0 +1,10 @@
+package net.onrc.onos.core.matchaction;
+/**
+  * A generator of MatchActionId.
+  */
+public interface MatchActionOperationsIdGenerator {
+    /**
+      * Generates a globally unique MatchActionId instance.
+      */
+    MatchActionOperationsId getNewId();
+}
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGeneratorWithIdBlockAllocator.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGeneratorWithIdBlockAllocator.java
new file mode 100644
index 0000000..d1d5240
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsIdGeneratorWithIdBlockAllocator.java
@@ -0,0 +1,37 @@
+package net.onrc.onos.core.matchaction;
+
+import net.onrc.onos.core.util.IdBlock;
+import net.onrc.onos.core.util.IdBlockAllocator;
+import net.onrc.onos.core.util.UnavailableIdException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Generates a global unique MatchActionIdId.
+ */
+public class MatchActionOperationsIdGeneratorWithIdBlockAllocator
+        implements MatchActionOperationsIdGenerator {
+
+        private final IdBlockAllocator allocator;
+        private IdBlock idBlock;
+
+        /**
+          * Creates a FlowId generator instance using specified ID block allocator.
+          *
+          * @param allocator the ID block allocator to be used
+          */
+        public MatchActionOperationsIdGeneratorWithIdBlockAllocator(IdBlockAllocator allocator) {
+            this.allocator = checkNotNull(allocator);
+            this.idBlock = allocator.allocateUniqueIdBlock();
+        }
+
+        @Override
+        public synchronized MatchActionOperationsId getNewId() {
+            try {
+                return new MatchActionOperationsId(idBlock.getNextId());
+            } catch (UnavailableIdException e) {
+                idBlock = allocator.allocateUniqueIdBlock();
+                return new MatchActionOperationsId(idBlock.getNextId());
+            }
+        }
+}
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)));
