Refactoring intent API.
diff --git a/core/api/src/main/java/org/onlab/onos/net/intent/IntentId.java b/core/api/src/main/java/org/onlab/onos/net/intent/IntentId.java
index 8285070..08ab7fa 100644
--- a/core/api/src/main/java/org/onlab/onos/net/intent/IntentId.java
+++ b/core/api/src/main/java/org/onlab/onos/net/intent/IntentId.java
@@ -15,7 +15,7 @@
      * @param fingerprint long value
      * @return intent identifier
      */
-    static IntentId valueOf(long fingerprint) {
+    public static IntentId valueOf(long fingerprint) {
         return new IntentId(fingerprint);
     }
 
diff --git a/core/net/src/main/java/org/onlab/onos/impl/CoreManager.java b/core/net/src/main/java/org/onlab/onos/impl/CoreManager.java
index edfc080..da1f8c9 100644
--- a/core/net/src/main/java/org/onlab/onos/impl/CoreManager.java
+++ b/core/net/src/main/java/org/onlab/onos/impl/CoreManager.java
@@ -27,6 +27,7 @@
     private static Version version = Version.version("1.0.0-SNAPSHOT");
 
     private final Map<Short, DefaultApplicationId> appIds = new ConcurrentHashMap<>();
+    private final Map<String, DefaultApplicationId> appIdsByName = new ConcurrentHashMap<>();
 
     // TODO: work in progress
 
@@ -50,9 +51,13 @@
 
     @Override
     public ApplicationId registerApplication(String name) {
-        short id = (short) ID_DISPENSER.getAndIncrement();
-        DefaultApplicationId appId = new DefaultApplicationId(id, name);
-        appIds.put(id, appId);
+        DefaultApplicationId appId = appIdsByName.get(name);
+        if (appId == null) {
+            short id = (short) ID_DISPENSER.getAndIncrement();
+            appId = new DefaultApplicationId(id, name);
+            appIds.put(id, appId);
+            appIdsByName.put(name, appId);
+        }
         return appId;
     }
 
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/HostToHostIntentCompiler.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/HostToHostIntentCompiler.java
index 50faf38..e769982 100644
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/HostToHostIntentCompiler.java
+++ b/core/net/src/main/java/org/onlab/onos/net/intent/impl/HostToHostIntentCompiler.java
@@ -11,11 +11,9 @@
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.host.HostService;
 import org.onlab.onos.net.intent.HostToHostIntent;
-import org.onlab.onos.net.intent.IdGenerator;
 import org.onlab.onos.net.intent.Intent;
 import org.onlab.onos.net.intent.IntentCompiler;
 import org.onlab.onos.net.intent.IntentExtensionService;
-import org.onlab.onos.net.intent.IntentId;
 import org.onlab.onos.net.intent.PathIntent;
 import org.onlab.onos.net.topology.PathService;
 
@@ -41,12 +39,8 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected HostService hostService;
 
-    protected IdGenerator<IntentId> intentIdGenerator;
-
     @Activate
     public void activate() {
-        IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator();
-        intentIdGenerator = new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator);
         intentManager.registerCompiler(HostToHostIntent.class, this);
     }
 
@@ -70,13 +64,10 @@
     // Creates a path intent from the specified path and original connectivity intent.
     private Intent createPathIntent(Path path, Host src, Host dst,
                                     HostToHostIntent intent) {
-
         TrafficSelector selector = builder(intent.selector())
                 .matchEthSrc(src.mac()).matchEthDst(dst.mac()).build();
-
-        return new PathIntent(intentIdGenerator.getNewId(),
-                              selector, intent.treatment(),
-                              path.src(), path.dst(), path);
+        return new PathIntent(intent.appId(), selector, intent.treatment(),
+                              path);
     }
 
     private Path getPath(HostId one, HostId two) {
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/IdBlockAllocatorBasedIntentIdGenerator.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/IdBlockAllocatorBasedIntentIdGenerator.java
deleted file mode 100644
index 9620e59..0000000
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/IdBlockAllocatorBasedIntentIdGenerator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.onlab.onos.net.intent.impl;
-
-import org.onlab.onos.net.intent.IntentId;
-
-/**
- * An implementation of {@link org.onlab.onos.net.intent.IdGenerator} of intent ID,
- * which uses {@link IdBlockAllocator}.
- */
-public class IdBlockAllocatorBasedIntentIdGenerator extends AbstractBlockAllocatorBasedIdGenerator<IntentId> {
-
-    /**
-     * Constructs an intent ID generator, which uses the specified ID block allocator
-     * to generate a global unique intent ID.
-     *
-     * @param allocator the ID block allocator to use for generating intent IDs
-     */
-    public IdBlockAllocatorBasedIntentIdGenerator(IdBlockAllocator allocator) {
-        super(allocator);
-    }
-
-    @Override
-    protected IntentId convertFrom(long value) {
-        return new IntentId(value);
-    }
-}
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java
index ff1e948..1838814 100644
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java
+++ b/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java
@@ -1,30 +1,8 @@
 package org.onlab.onos.net.intent.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.concurrent.Executors.newSingleThreadExecutor;
-import static org.onlab.onos.net.intent.IntentState.COMPILING;
-import static org.onlab.onos.net.intent.IntentState.FAILED;
-import static org.onlab.onos.net.intent.IntentState.INSTALLED;
-import static org.onlab.onos.net.intent.IntentState.INSTALLING;
-import static org.onlab.onos.net.intent.IntentState.RECOMPILING;
-import static org.onlab.onos.net.intent.IntentState.WITHDRAWING;
-import static org.onlab.onos.net.intent.IntentState.WITHDRAWN;
-import static org.onlab.util.Tools.namedThreads;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -36,7 +14,6 @@
 import org.onlab.onos.net.flow.CompletedBatchOperation;
 import org.onlab.onos.net.flow.FlowRuleBatchOperation;
 import org.onlab.onos.net.flow.FlowRuleService;
-import org.onlab.onos.net.intent.InstallableIntent;
 import org.onlab.onos.net.intent.Intent;
 import org.onlab.onos.net.intent.IntentCompiler;
 import org.onlab.onos.net.intent.IntentEvent;
@@ -52,9 +29,24 @@
 import org.onlab.onos.net.intent.IntentStoreDelegate;
 import org.slf4j.Logger;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.onos.net.intent.IntentState.*;
+import static org.onlab.util.Tools.namedThreads;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * An implementation of Intent Manager.
@@ -71,8 +63,8 @@
     // Collections for compiler, installer, and listener are ONOS instance local
     private final ConcurrentMap<Class<? extends Intent>,
             IntentCompiler<? extends Intent>> compilers = new ConcurrentHashMap<>();
-    private final ConcurrentMap<Class<? extends InstallableIntent>,
-            IntentInstaller<? extends InstallableIntent>> installers = new ConcurrentHashMap<>();
+    private final ConcurrentMap<Class<? extends Intent>,
+            IntentInstaller<? extends Intent>> installers = new ConcurrentHashMap<>();
 
     private final AbstractListenerRegistry<IntentEvent, IntentListener>
             listenerRegistry = new AbstractListenerRegistry<>();
@@ -186,17 +178,17 @@
     }
 
     @Override
-    public <T extends InstallableIntent> void registerInstaller(Class<T> cls, IntentInstaller<T> installer) {
+    public <T extends Intent> void registerInstaller(Class<T> cls, IntentInstaller<T> installer) {
         installers.put(cls, installer);
     }
 
     @Override
-    public <T extends InstallableIntent> void unregisterInstaller(Class<T> cls) {
+    public <T extends Intent> void unregisterInstaller(Class<T> cls) {
         installers.remove(cls);
     }
 
     @Override
-    public Map<Class<? extends InstallableIntent>, IntentInstaller<? extends InstallableIntent>> getInstallers() {
+    public Map<Class<? extends Intent>, IntentInstaller<? extends Intent>> getInstallers() {
         return ImmutableMap.copyOf(installers);
     }
 
@@ -223,7 +215,7 @@
      * @param <T>    the type of installable intent
      * @return intent installer corresponding to the specified installable intent
      */
-    private <T extends InstallableIntent> IntentInstaller<T> getInstaller(T intent) {
+    private <T extends Intent> IntentInstaller<T> getInstaller(T intent) {
         @SuppressWarnings("unchecked")
         IntentInstaller<T> installer = (IntentInstaller<T>) installers.get(intent.getClass());
         if (installer == null) {
@@ -243,7 +235,7 @@
 
         try {
             // Compile the intent into installable derivatives.
-            List<InstallableIntent> installable = compileIntent(intent);
+            List<Intent> installable = compileIntent(intent);
 
             // If all went well, associate the resulting list of installable
             // intents with the top-level intent and proceed to install.
@@ -264,12 +256,12 @@
      * @param intent intent
      * @return result of compilation
      */
-    private List<InstallableIntent> compileIntent(Intent intent) {
-        if (intent instanceof InstallableIntent) {
-            return ImmutableList.of((InstallableIntent) intent);
+    private List<Intent> compileIntent(Intent intent) {
+        if (intent instanceof Intent) {
+            return ImmutableList.of((Intent) intent);
         }
 
-        List<InstallableIntent> installable = new ArrayList<>();
+        List<Intent> installable = new ArrayList<>();
         // TODO do we need to registerSubclassCompiler?
         for (Intent compiled : getCompiler(intent).compile(intent)) {
             installable.addAll(compileIntent(compiled));
@@ -290,12 +282,12 @@
 
         List<FlowRuleBatchOperation> installWork = Lists.newArrayList();
         try {
-            List<InstallableIntent> installables = store.getInstallableIntents(intent.id());
+            List<Intent> installables = store.getInstallableIntents(intent.id());
             if (installables != null) {
-                for (InstallableIntent installable : installables) {
+                for (Intent installable : installables) {
                     registerSubclassInstallerIfNeeded(installable);
                     trackerService.addTrackedResources(intent.id(),
-                                                       installable.requiredLinks());
+                                                       installable.resources());
                     List<FlowRuleBatchOperation> batch = getInstaller(installable).install(installable);
                     installWork.addAll(batch);
                 }
@@ -324,14 +316,13 @@
 
         try {
             // Compile the intent into installable derivatives.
-            List<InstallableIntent> installable = compileIntent(intent);
+            List<Intent> installable = compileIntent(intent);
 
             // If all went well, compare the existing list of installable
             // intents with the newly compiled list. If they are the same,
             // bail, out since the previous approach was determined not to
             // be viable.
-            List<InstallableIntent> originalInstallable =
-                    store.getInstallableIntents(intent.id());
+            List<Intent> originalInstallable = store.getInstallableIntents(intent.id());
 
             if (Objects.equals(originalInstallable, installable)) {
                 eventDispatcher.post(store.setState(intent, FAILED));
@@ -376,9 +367,9 @@
     private void uninstallIntent(Intent intent, IntentState nextState) {
         List<FlowRuleBatchOperation> uninstallWork = Lists.newArrayList();
         try {
-            List<InstallableIntent> installables = store.getInstallableIntents(intent.id());
+            List<Intent> installables = store.getInstallableIntents(intent.id());
             if (installables != null) {
-                for (InstallableIntent installable : installables) {
+                for (Intent installable : installables) {
                     List<FlowRuleBatchOperation> batches = getInstaller(installable).uninstall(installable);
                     uninstallWork.addAll(batches);
                 }
@@ -422,12 +413,12 @@
      *
      * @param intent intent
      */
-    private void registerSubclassInstallerIfNeeded(InstallableIntent intent) {
+    private void registerSubclassInstallerIfNeeded(Intent intent) {
         if (!installers.containsKey(intent.getClass())) {
             Class<?> cls = intent.getClass();
             while (cls != Object.class) {
-                // As long as we're within the InstallableIntent class descendants
-                if (InstallableIntent.class.isAssignableFrom(cls)) {
+                // As long as we're within the Intent class descendants
+                if (Intent.class.isAssignableFrom(cls)) {
                     IntentInstaller<?> installer = installers.get(cls);
                     if (installer != null) {
                         installers.put(intent.getClass(), installer);
@@ -505,8 +496,8 @@
         private final IntentState nextState;
 
         public IntentInstallMonitor(Intent intent,
-                List<FlowRuleBatchOperation> work,
-                IntentState nextState) {
+                                    List<FlowRuleBatchOperation> work,
+                                    IntentState nextState) {
             this.intent = intent;
             this.work = work;
             // TODO how many Futures can be outstanding? one?
@@ -531,9 +522,7 @@
         }
 
         /**
-         * Apply a list of FlowRules.
-         *
-         * @param rules rules to apply
+         * Applies the next batch.
          */
         private Future<CompletedBatchOperation> applyNextBatch() {
             if (work.isEmpty()) {
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/MultiPointToSinglePointIntentCompiler.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/MultiPointToSinglePointIntentCompiler.java
index 6ce12d6..cfc8d73 100644
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/MultiPointToSinglePointIntentCompiler.java
+++ b/core/net/src/main/java/org/onlab/onos/net/intent/impl/MultiPointToSinglePointIntentCompiler.java
@@ -1,10 +1,5 @@
 package org.onlab.onos.net.intent.impl;
 
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -13,16 +8,19 @@
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.Link;
 import org.onlab.onos.net.Path;
-import org.onlab.onos.net.intent.IdGenerator;
 import org.onlab.onos.net.intent.Intent;
 import org.onlab.onos.net.intent.IntentCompiler;
 import org.onlab.onos.net.intent.IntentExtensionService;
-import org.onlab.onos.net.intent.IntentId;
 import org.onlab.onos.net.intent.LinkCollectionIntent;
 import org.onlab.onos.net.intent.MultiPointToSinglePointIntent;
 import org.onlab.onos.net.intent.PointToPointIntent;
 import org.onlab.onos.net.topology.PathService;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 /**
  * An intent compiler for
  * {@link org.onlab.onos.net.intent.MultiPointToSinglePointIntent}.
@@ -37,12 +35,8 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected PathService pathService;
 
-    protected IdGenerator<IntentId> intentIdGenerator;
-
     @Activate
     public void activate() {
-        IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator();
-        intentIdGenerator = new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator);
         intentManager.registerCompiler(MultiPointToSinglePointIntent.class, this);
     }
 
@@ -60,9 +54,9 @@
             links.addAll(path.links());
         }
 
-        Intent result = new LinkCollectionIntent(intentIdGenerator.getNewId(),
-                intent.selector(), intent.treatment(),
-                links, intent.egressPoint());
+        Intent result = new LinkCollectionIntent(intent.appId(),
+                                                 intent.selector(), intent.treatment(),
+                                                 links, intent.egressPoint());
         return Arrays.asList(result);
     }
 
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/ObjectiveTracker.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/ObjectiveTracker.java
index 7ba4e26..90e878e 100644
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/ObjectiveTracker.java
+++ b/core/net/src/main/java/org/onlab/onos/net/intent/impl/ObjectiveTracker.java
@@ -11,6 +11,7 @@
 import org.onlab.onos.event.Event;
 import org.onlab.onos.net.Link;
 import org.onlab.onos.net.LinkKey;
+import org.onlab.onos.net.NetworkResource;
 import org.onlab.onos.net.intent.IntentId;
 import org.onlab.onos.net.link.LinkEvent;
 import org.onlab.onos.net.topology.TopologyEvent;
@@ -27,8 +28,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Multimaps.synchronizedSetMultimap;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
-import static org.onlab.onos.net.link.LinkEvent.Type.LINK_REMOVED;
 import static org.onlab.onos.net.LinkKey.linkKey;
+import static org.onlab.onos.net.link.LinkEvent.Type.LINK_REMOVED;
 import static org.onlab.util.Tools.namedThreads;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -81,16 +82,22 @@
     }
 
     @Override
-    public void addTrackedResources(IntentId intentId, Collection<Link> resources) {
-        for (Link link : resources) {
-            intentsByLink.put(linkKey(link), intentId);
+    public void addTrackedResources(IntentId intentId,
+                                    Collection<NetworkResource> resources) {
+        for (NetworkResource resource : resources) {
+            if (resource instanceof Link) {
+                intentsByLink.put(linkKey((Link) resource), intentId);
+            }
         }
     }
 
     @Override
-    public void removeTrackedResources(IntentId intentId, Collection<Link> resources) {
-        for (Link link : resources) {
-            intentsByLink.remove(linkKey(link), intentId);
+    public void removeTrackedResources(IntentId intentId,
+                                       Collection<NetworkResource> resources) {
+        for (NetworkResource resource : resources) {
+            if (resource instanceof Link) {
+                intentsByLink.remove(linkKey((Link) resource), intentId);
+            }
         }
     }
 
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/ObjectiveTrackerService.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/ObjectiveTrackerService.java
index 15496ff..9acd215 100644
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/ObjectiveTrackerService.java
+++ b/core/net/src/main/java/org/onlab/onos/net/intent/impl/ObjectiveTrackerService.java
@@ -1,6 +1,6 @@
 package org.onlab.onos.net.intent.impl;
 
-import org.onlab.onos.net.Link;
+import org.onlab.onos.net.NetworkResource;
 import org.onlab.onos.net.intent.IntentId;
 
 import java.util.Collection;
@@ -28,17 +28,19 @@
     /**
      * Adds a path flow to be tracked.
      *
-     * @param intentId intent identity on whose behalf the path is being tracked
+     * @param intentId  intent identity on whose behalf the path is being tracked
      * @param resources resources to track
      */
-    public void addTrackedResources(IntentId intentId, Collection<Link> resources);
+    public void addTrackedResources(IntentId intentId,
+                                    Collection<NetworkResource> resources);
 
     /**
      * Removes a path flow to be tracked.
      *
-     * @param intentId intent identity on whose behalf the path is being tracked
+     * @param intentId  intent identity on whose behalf the path is being tracked
      * @param resources resources to stop tracking
      */
-    public void removeTrackedResources(IntentId intentId, Collection<Link> resources);
+    public void removeTrackedResources(IntentId intentId,
+                                       Collection<NetworkResource> resources);
 
 }
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/PointToPointIntentCompiler.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/PointToPointIntentCompiler.java
index 0556df0..25d50cc 100644
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/PointToPointIntentCompiler.java
+++ b/core/net/src/main/java/org/onlab/onos/net/intent/impl/PointToPointIntentCompiler.java
@@ -1,10 +1,5 @@
 package org.onlab.onos.net.intent.impl;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -16,16 +11,19 @@
 import org.onlab.onos.net.Link;
 import org.onlab.onos.net.Path;
 import org.onlab.onos.net.host.HostService;
-import org.onlab.onos.net.intent.IdGenerator;
 import org.onlab.onos.net.intent.Intent;
 import org.onlab.onos.net.intent.IntentCompiler;
 import org.onlab.onos.net.intent.IntentExtensionService;
-import org.onlab.onos.net.intent.IntentId;
 import org.onlab.onos.net.intent.PathIntent;
 import org.onlab.onos.net.intent.PointToPointIntent;
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.onos.net.topology.PathService;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
 /**
  * A intent compiler for {@link org.onlab.onos.net.intent.HostToHostIntent}.
  */
@@ -43,12 +41,8 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected HostService hostService;
 
-    protected IdGenerator<IntentId> intentIdGenerator;
-
     @Activate
     public void activate() {
-        IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator();
-        intentIdGenerator = new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator);
         intentManager.registerCompiler(PointToPointIntent.class, this);
     }
 
@@ -67,23 +61,21 @@
         links.add(DefaultEdgeLink.createEdgeLink(intent.egressPoint(), false));
 
         return Arrays.asList(createPathIntent(new DefaultPath(PID, links, path.cost() + 2,
-                                              path.annotations()),
-                             intent));
+                                                              path.annotations()),
+                                              intent));
     }
 
     /**
      * Creates a path intent from the specified path and original
      * connectivity intent.
      *
-     * @param path path to create an intent for
+     * @param path   path to create an intent for
      * @param intent original intent
      */
     private Intent createPathIntent(Path path,
                                     PointToPointIntent intent) {
-
-        return new PathIntent(intentIdGenerator.getNewId(),
-                              intent.selector(), intent.treatment(),
-                              path.src(), path.dst(), path);
+        return new PathIntent(intent.appId(),
+                              intent.selector(), intent.treatment(), path);
     }
 
     /**
diff --git a/core/net/src/test/java/org/onlab/onos/net/intent/TestHostToHostIntent.java b/core/net/src/test/java/org/onlab/onos/net/intent/TestHostToHostIntent.java
index f5e2551..9ec37e1 100644
--- a/core/net/src/test/java/org/onlab/onos/net/intent/TestHostToHostIntent.java
+++ b/core/net/src/test/java/org/onlab/onos/net/intent/TestHostToHostIntent.java
@@ -1,6 +1,8 @@
 package org.onlab.onos.net.intent;
 
 import org.junit.Test;
+import org.onlab.onos.ApplicationId;
+import org.onlab.onos.TestApplicationId;
 import org.onlab.onos.net.HostId;
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.flow.TrafficTreatment;
@@ -16,15 +18,13 @@
  */
 public class TestHostToHostIntent {
 
+    private static final ApplicationId APPID = new TestApplicationId("foo");
+
     private TrafficSelector selector = new IntentTestsMocks.MockSelector();
     private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment();
 
-    private HostToHostIntent makeHostToHost(long id, HostId one, HostId two) {
-        return new HostToHostIntent(new IntentId(id),
-                                    one,
-                                    two,
-                                    selector,
-                                    treatment);
+    private HostToHostIntent makeHostToHost(HostId one, HostId two) {
+        return new HostToHostIntent(APPID, one, two, selector, treatment);
     }
 
     /**
@@ -36,8 +36,8 @@
 
         HostId one = hid("00:00:00:00:00:01/-1");
         HostId two = hid("00:00:00:00:00:02/-1");
-        HostToHostIntent i1 = makeHostToHost(12, one, two);
-        HostToHostIntent i2 = makeHostToHost(12, one, two);
+        HostToHostIntent i1 = makeHostToHost(one, two);
+        HostToHostIntent i2 = makeHostToHost(one, two);
 
         assertThat(i1, is(equalTo(i2)));
     }
@@ -51,23 +51,8 @@
 
         HostId one = hid("00:00:00:00:00:01/-1");
         HostId two = hid("00:00:00:00:00:02/-1");
-        HostToHostIntent i1 = makeHostToHost(12, one, two);
-        HostToHostIntent i2 = makeHostToHost(12, two, one);
-
-        assertThat(i1, is(not(equalTo(i2))));
-    }
-
-    /**
-     * Tests the equals() method where two HostToHostIntents have different
-     * ids. These should compare not equal.
-     */
-
-    @Test
-    public void testBaseDifferentEquals() {
-        HostId one = hid("00:00:00:00:00:01/-1");
-        HostId two = hid("00:00:00:00:00:02/-1");
-        HostToHostIntent i1 = makeHostToHost(12, one, two);
-        HostToHostIntent i2 = makeHostToHost(11, one, two);
+        HostToHostIntent i1 = makeHostToHost(one, two);
+        HostToHostIntent i2 = makeHostToHost(two, one);
 
         assertThat(i1, is(not(equalTo(i2))));
     }
@@ -76,13 +61,12 @@
      * Tests that the hashCode() values for two equivalent HostToHostIntent
      * objects are the same.
      */
-
     @Test
     public void testHashCodeEquals() {
         HostId one = hid("00:00:00:00:00:01/-1");
         HostId two = hid("00:00:00:00:00:02/-1");
-        HostToHostIntent i1 = makeHostToHost(12, one, two);
-        HostToHostIntent i2 = makeHostToHost(12, one, two);
+        HostToHostIntent i1 = makeHostToHost(one, two);
+        HostToHostIntent i2 = makeHostToHost(one, two);
 
         assertThat(i1.hashCode(), is(equalTo(i2.hashCode())));
     }
@@ -91,13 +75,12 @@
      * Tests that the hashCode() values for two distinct LinkCollectionIntent
      * objects are different.
      */
-
     @Test
     public void testHashCodeDifferent() {
         HostId one = hid("00:00:00:00:00:01/-1");
         HostId two = hid("00:00:00:00:00:02/-1");
-        HostToHostIntent i1 = makeHostToHost(12, one, two);
-        HostToHostIntent i2 = makeHostToHost(112, one, two);
+        HostToHostIntent i1 = makeHostToHost(one, two);
+        HostToHostIntent i2 = makeHostToHost(two, one);
 
         assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode()))));
     }
diff --git a/core/net/src/test/java/org/onlab/onos/net/intent/TestLinkCollectionIntent.java b/core/net/src/test/java/org/onlab/onos/net/intent/TestLinkCollectionIntent.java
index a7082b4..65aa71f 100644
--- a/core/net/src/test/java/org/onlab/onos/net/intent/TestLinkCollectionIntent.java
+++ b/core/net/src/test/java/org/onlab/onos/net/intent/TestLinkCollectionIntent.java
@@ -11,6 +11,8 @@
 
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.onos.ApplicationId;
+import org.onlab.onos.TestApplicationId;
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Link;
@@ -23,6 +25,8 @@
  */
 public class TestLinkCollectionIntent {
 
+    private static final ApplicationId APPID = new TestApplicationId("foo");
+
     private Link link1 = link("dev1", 1, "dev2", 2);
     private Link link2 = link("dev1", 1, "dev3", 2);
     private Link link3 = link("dev2", 1, "dev3", 2);
@@ -38,10 +42,9 @@
     private TrafficSelector selector = new IntentTestsMocks.MockSelector();
     private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment();
 
-    private LinkCollectionIntent makeLinkCollection(long id, Set<Link> links,
+    private LinkCollectionIntent makeLinkCollection(Set<Link> links,
             ConnectPoint egress) {
-        return new LinkCollectionIntent(new IntentId(id),
-                                        selector, treatment, links, egress);
+        return new LinkCollectionIntent(APPID, selector, treatment, links, egress);
     }
 
     @Before
@@ -64,8 +67,8 @@
         links2.add(link2);
         links2.add(link1);
 
-        LinkCollectionIntent i1 = makeLinkCollection(12, links1, egress1);
-        LinkCollectionIntent i2 = makeLinkCollection(12, links2, egress1);
+        LinkCollectionIntent i1 = makeLinkCollection(links1, egress1);
+        LinkCollectionIntent i2 = makeLinkCollection(links2, egress1);
 
         assertThat(i1, is(equalTo(i2)));
     }
@@ -82,8 +85,8 @@
         links2.add(link3);
         links2.add(link1);
 
-        LinkCollectionIntent i1 = makeLinkCollection(12, links1, egress1);
-        LinkCollectionIntent i2 = makeLinkCollection(12, links2, egress1);
+        LinkCollectionIntent i1 = makeLinkCollection(links1, egress1);
+        LinkCollectionIntent i2 = makeLinkCollection(links2, egress1);
 
         assertThat(i1, is(not(equalTo(i2))));
     }
@@ -102,26 +105,8 @@
         links2.add(link2);
         links2.add(link1);
 
-        LinkCollectionIntent i1 = makeLinkCollection(12, links1, egress1);
-        LinkCollectionIntent i2 = makeLinkCollection(12, links2, egress2);
-
-        assertThat(i1, is(not(equalTo(i2))));
-    }
-
-    /**
-     * Tests the equals() method where two LinkCollectionIntents have different
-     * ids. These should compare not equal.
-     */
-    @Test
-    public void testBaseDifferentEquals() {
-        links1.add(link1);
-        links1.add(link2);
-
-        links2.add(link2);
-        links2.add(link1);
-
-        LinkCollectionIntent i1 = makeLinkCollection(1, links1, egress1);
-        LinkCollectionIntent i2 = makeLinkCollection(2, links2, egress1);
+        LinkCollectionIntent i1 = makeLinkCollection(links1, egress1);
+        LinkCollectionIntent i2 = makeLinkCollection(links2, egress2);
 
         assertThat(i1, is(not(equalTo(i2))));
     }
@@ -140,8 +125,8 @@
         links2.add(link2);
         links2.add(link1);
 
-        LinkCollectionIntent i1 = makeLinkCollection(1, links1, egress1);
-        LinkCollectionIntent i2 = makeLinkCollection(1, links2, egress1);
+        LinkCollectionIntent i1 = makeLinkCollection(links1, egress1);
+        LinkCollectionIntent i2 = makeLinkCollection(links2, egress1);
 
         assertThat(i1.hashCode(), is(equalTo(i2.hashCode())));
     }
@@ -158,8 +143,8 @@
         links2.add(link1);
         links2.add(link3);
 
-        LinkCollectionIntent i1 = makeLinkCollection(1, links1, egress1);
-        LinkCollectionIntent i2 = makeLinkCollection(1, links2, egress2);
+        LinkCollectionIntent i1 = makeLinkCollection(links1, egress1);
+        LinkCollectionIntent i2 = makeLinkCollection(links2, egress2);
 
         assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode()))));
     }
diff --git a/core/net/src/test/java/org/onlab/onos/net/intent/TestMultiPointToSinglePointIntent.java b/core/net/src/test/java/org/onlab/onos/net/intent/TestMultiPointToSinglePointIntent.java
index e921907..09dfcb2 100644
--- a/core/net/src/test/java/org/onlab/onos/net/intent/TestMultiPointToSinglePointIntent.java
+++ b/core/net/src/test/java/org/onlab/onos/net/intent/TestMultiPointToSinglePointIntent.java
@@ -1,14 +1,16 @@
 package org.onlab.onos.net.intent;
 
-import java.util.HashSet;
-import java.util.Set;
-
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.onos.ApplicationId;
+import org.onlab.onos.TestApplicationId;
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.flow.TrafficTreatment;
 
+import java.util.HashSet;
+import java.util.Set;
+
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
@@ -20,6 +22,8 @@
  */
 public class TestMultiPointToSinglePointIntent {
 
+    private static final ApplicationId APPID = new TestApplicationId("foo");
+
     private ConnectPoint point1 = connectPoint("dev1", 1);
     private ConnectPoint point2 = connectPoint("dev2", 1);
     private ConnectPoint point3 = connectPoint("dev3", 1);
@@ -33,19 +37,14 @@
     /**
      * Creates a MultiPointToSinglePointIntent object.
      *
-     * @param id identifier to use for the new intent
      * @param ingress set of ingress points
-     * @param egress egress point
+     * @param egress  egress point
      * @return MultiPointToSinglePoint intent
      */
-    private MultiPointToSinglePointIntent makeIntent(long id,
-                       Set<ConnectPoint> ingress,
-                       ConnectPoint egress) {
-        return new MultiPointToSinglePointIntent(new IntentId(id),
-                                                 selector,
-                                                 treatment,
-                                                 ingress,
-                                                 egress);
+    private MultiPointToSinglePointIntent makeIntent(Set<ConnectPoint> ingress,
+                                                     ConnectPoint egress) {
+        return new MultiPointToSinglePointIntent(APPID, selector, treatment,
+                                                 ingress, egress);
     }
 
     /**
@@ -72,8 +71,8 @@
         ingress2.add(point3);
         ingress2.add(point2);
 
-        Intent i1 = makeIntent(12, ingress1, point1);
-        Intent i2 = makeIntent(12, ingress2, point1);
+        Intent i1 = makeIntent(ingress1, point1);
+        Intent i2 = makeIntent(ingress2, point1);
 
         assertThat(i1, is(equalTo(i2)));
     }
@@ -89,23 +88,8 @@
         ingress2.add(point3);
         ingress2.add(point2);
 
-        Intent i1 = makeIntent(12, ingress1, point1);
-        Intent i2 = makeIntent(12, ingress2, point1);
-
-        assertThat(i1, is(not(equalTo(i2))));
-    }
-
-    /**
-     * Tests the equals() method where two MultiPointToSinglePoint have different
-     * ids. These should compare not equal.
-     */
-    @Test
-    public void testBaseDifferentEquals() {
-        ingress1.add(point3);
-        ingress2.add(point3);
-
-        Intent i1 = makeIntent(12, ingress1, point1);
-        Intent i2 = makeIntent(11, ingress2, point1);
+        Intent i1 = makeIntent(ingress1, point1);
+        Intent i2 = makeIntent(ingress2, point1);
 
         assertThat(i1, is(not(equalTo(i2))));
     }
@@ -122,8 +106,8 @@
         ingress2.add(point3);
         ingress2.add(point2);
 
-        Intent i1 = makeIntent(12, ingress1, point1);
-        Intent i2 = makeIntent(12, ingress2, point1);
+        Intent i1 = makeIntent(ingress1, point1);
+        Intent i2 = makeIntent(ingress2, point1);
 
         assertThat(i1.hashCode(), is(equalTo(i2.hashCode())));
     }
@@ -139,8 +123,8 @@
         ingress2.add(point3);
         ingress2.add(point2);
 
-        Intent i1 = makeIntent(12, ingress1, point1);
-        Intent i2 = makeIntent(12, ingress2, point1);
+        Intent i1 = makeIntent(ingress1, point1);
+        Intent i2 = makeIntent(ingress2, point1);
 
 
         assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode()))));
diff --git a/core/net/src/test/java/org/onlab/onos/net/intent/TestPointToPointIntent.java b/core/net/src/test/java/org/onlab/onos/net/intent/TestPointToPointIntent.java
index 41769c6..e34d7ce 100644
--- a/core/net/src/test/java/org/onlab/onos/net/intent/TestPointToPointIntent.java
+++ b/core/net/src/test/java/org/onlab/onos/net/intent/TestPointToPointIntent.java
@@ -1,14 +1,14 @@
 package org.onlab.onos.net.intent;
 
 import org.junit.Test;
+import org.onlab.onos.ApplicationId;
+import org.onlab.onos.TestApplicationId;
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.flow.TrafficTreatment;
 
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.*;
 import static org.onlab.onos.net.NetTestTools.connectPoint;
 
 /**
@@ -16,20 +16,17 @@
  */
 public class TestPointToPointIntent {
 
+    private static final ApplicationId APPID = new TestApplicationId("foo");
+
     private TrafficSelector selector = new IntentTestsMocks.MockSelector();
     private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment();
 
     private ConnectPoint point1 = connectPoint("dev1", 1);
     private ConnectPoint point2 = connectPoint("dev2", 1);
 
-    private PointToPointIntent makePointToPoint(long id,
-                                                ConnectPoint ingress,
+    private PointToPointIntent makePointToPoint(ConnectPoint ingress,
                                                 ConnectPoint egress) {
-        return new PointToPointIntent(new IntentId(id),
-                                      selector,
-                                      treatment,
-                                      ingress,
-                                      egress);
+        return new PointToPointIntent(APPID, selector, treatment, ingress, egress);
     }
 
     /**
@@ -38,8 +35,8 @@
      */
     @Test
     public void testSameEquals() {
-        PointToPointIntent i1 = makePointToPoint(12, point1, point2);
-        PointToPointIntent i2 = makePointToPoint(12, point1, point2);
+        PointToPointIntent i1 = makePointToPoint(point1, point2);
+        PointToPointIntent i2 = makePointToPoint(point1, point2);
 
         assertThat(i1, is(equalTo(i2)));
     }
@@ -50,22 +47,8 @@
      */
     @Test
     public void testLinksDifferentEquals() {
-
-        PointToPointIntent i1 = makePointToPoint(12, point1, point2);
-        PointToPointIntent i2 = makePointToPoint(12, point2, point1);
-
-        assertThat(i1, is(not(equalTo(i2))));
-    }
-
-    /**
-     * Tests the equals() method where two HostToHostIntents have different
-     * ids. These should compare not equal.
-     */
-    @Test
-    public void testBaseDifferentEquals() {
-        PointToPointIntent i1 = makePointToPoint(12, point1, point2);
-        PointToPointIntent i2 = makePointToPoint(11, point1, point2);
-
+        PointToPointIntent i1 = makePointToPoint(point1, point2);
+        PointToPointIntent i2 = makePointToPoint(point2, point1);
 
         assertThat(i1, is(not(equalTo(i2))));
     }
@@ -76,8 +59,8 @@
      */
     @Test
     public void testHashCodeEquals() {
-        PointToPointIntent i1 = makePointToPoint(12, point1, point2);
-        PointToPointIntent i2 = makePointToPoint(12, point1, point2);
+        PointToPointIntent i1 = makePointToPoint(point1, point2);
+        PointToPointIntent i2 = makePointToPoint(point1, point2);
 
         assertThat(i1.hashCode(), is(equalTo(i2.hashCode())));
     }
@@ -88,8 +71,8 @@
      */
     @Test
     public void testHashCodeDifferent() {
-        PointToPointIntent i1 = makePointToPoint(12, point1, point2);
-        PointToPointIntent i2 = makePointToPoint(22, point1, point2);
+        PointToPointIntent i1 = makePointToPoint(point1, point2);
+        PointToPointIntent i2 = makePointToPoint(point2, point1);
 
         assertThat(i1.hashCode(), is(not(equalTo(i2.hashCode()))));
     }
diff --git a/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestHostToHostIntentCompiler.java b/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestHostToHostIntentCompiler.java
index bd61b7a..e853a29 100644
--- a/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestHostToHostIntentCompiler.java
+++ b/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestHostToHostIntentCompiler.java
@@ -1,10 +1,10 @@
 package org.onlab.onos.net.intent.impl;
 
-import java.util.List;
-
 import org.hamcrest.Matchers;
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.onos.ApplicationId;
+import org.onlab.onos.TestApplicationId;
 import org.onlab.onos.net.Host;
 import org.onlab.onos.net.HostId;
 import org.onlab.onos.net.flow.TrafficSelector;
@@ -12,16 +12,14 @@
 import org.onlab.onos.net.host.HostService;
 import org.onlab.onos.net.intent.HostToHostIntent;
 import org.onlab.onos.net.intent.Intent;
-import org.onlab.onos.net.intent.IntentId;
 import org.onlab.onos.net.intent.IntentTestsMocks;
 import org.onlab.onos.net.intent.PathIntent;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
+import java.util.List;
+
+import static org.easymock.EasyMock.*;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.hasSize;
@@ -40,6 +38,8 @@
     private static final String HOST_ONE = HOST_ONE_MAC + "/" + HOST_ONE_VLAN;
     private static final String HOST_TWO = HOST_TWO_MAC + "/" + HOST_TWO_VLAN;
 
+    private static final ApplicationId APPID = new TestApplicationId("foo");
+
     private TrafficSelector selector = new IntentTestsMocks.MockSelector();
     private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment();
 
@@ -73,11 +73,8 @@
      * @return HostToHostIntent for the two hosts
      */
     private HostToHostIntent makeIntent(String oneIdString, String twoIdString) {
-        return new HostToHostIntent(new IntentId(12),
-                                    hid(oneIdString),
-                                    hid(twoIdString),
-                                    selector,
-                                    treatment);
+        return new HostToHostIntent(APPID, hid(oneIdString), hid(twoIdString),
+                                    selector, treatment);
     }
 
     /**
@@ -91,9 +88,6 @@
                 new HostToHostIntentCompiler();
         compiler.pathService = new IntentTestsMocks.MockPathService(hops);
         compiler.hostService = mockHostService;
-        IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator();
-        compiler.intentIdGenerator =
-                new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator);
         return compiler;
     }
 
diff --git a/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestMultiPointToSinglePointIntentCompiler.java b/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestMultiPointToSinglePointIntentCompiler.java
index 8d286cf..1c78e26 100644
--- a/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestMultiPointToSinglePointIntentCompiler.java
+++ b/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestMultiPointToSinglePointIntentCompiler.java
@@ -1,24 +1,25 @@
 package org.onlab.onos.net.intent.impl;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 import org.hamcrest.Matchers;
 import org.junit.Test;
+import org.onlab.onos.ApplicationId;
+import org.onlab.onos.TestApplicationId;
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.ElementId;
 import org.onlab.onos.net.Path;
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.flow.TrafficTreatment;
 import org.onlab.onos.net.intent.Intent;
-import org.onlab.onos.net.intent.IntentId;
 import org.onlab.onos.net.intent.IntentTestsMocks;
 import org.onlab.onos.net.intent.LinkCollectionIntent;
 import org.onlab.onos.net.intent.MultiPointToSinglePointIntent;
 import org.onlab.onos.net.topology.LinkWeight;
 import org.onlab.onos.net.topology.PathService;
 
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.hasSize;
@@ -32,6 +33,8 @@
  */
 public class TestMultiPointToSinglePointIntentCompiler {
 
+    private static final ApplicationId APPID = new TestApplicationId("foo");
+
     private TrafficSelector selector = new IntentTestsMocks.MockSelector();
     private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment();
 
@@ -74,7 +77,7 @@
      * and an egress point.
      *
      * @param ingressIds array of ingress device ids
-     * @param egressId device id of the egress point
+     * @param egressId   device id of the egress point
      * @return MultiPointToSinglePoint intent
      */
     private MultiPointToSinglePointIntent makeIntent(String[] ingressIds, String egressId) {
@@ -82,15 +85,11 @@
         ConnectPoint egressPoint = connectPoint(egressId, 1);
 
         for (String ingressId : ingressIds) {
-                ingressPoints.add(connectPoint(ingressId, 1));
+            ingressPoints.add(connectPoint(ingressId, 1));
         }
 
-        return new MultiPointToSinglePointIntent(
-                new IntentId(12),
-                selector,
-                treatment,
-                ingressPoints,
-                egressPoint);
+        return new MultiPointToSinglePointIntent(APPID, selector, treatment,
+                                                 ingressPoints, egressPoint);
     }
 
     /**
@@ -103,9 +102,6 @@
         MultiPointToSinglePointIntentCompiler compiler =
                 new MultiPointToSinglePointIntentCompiler();
         compiler.pathService = new MockPathService(hops);
-        IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator();
-        compiler.intentIdGenerator =
-                new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator);
         return compiler;
     }
 
@@ -122,7 +118,7 @@
         assertThat(intent, is(notNullValue()));
 
         String[] hops = {"h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8",
-                         egress};
+                egress};
         MultiPointToSinglePointIntentCompiler compiler = makeCompiler(hops);
         assertThat(compiler, is(notNullValue()));
 
@@ -184,7 +180,7 @@
     @Test
     public void testMultiIngressCompilation() {
         String[] ingress = {"i1", "i2", "i3", "i4", "i5",
-                            "i6", "i7", "i8", "i9", "i10"};
+                "i6", "i7", "i8", "i9", "i10"};
         String egress = "e";
 
         MultiPointToSinglePointIntent intent = makeIntent(ingress, egress);
diff --git a/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestPointToPointIntentCompiler.java b/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestPointToPointIntentCompiler.java
index e282347..5b50a22 100644
--- a/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestPointToPointIntentCompiler.java
+++ b/core/net/src/test/java/org/onlab/onos/net/intent/impl/TestPointToPointIntentCompiler.java
@@ -1,17 +1,18 @@
 package org.onlab.onos.net.intent.impl;
 
-import java.util.List;
-
 import org.hamcrest.Matchers;
 import org.junit.Test;
+import org.onlab.onos.ApplicationId;
+import org.onlab.onos.TestApplicationId;
 import org.onlab.onos.net.flow.TrafficSelector;
 import org.onlab.onos.net.flow.TrafficTreatment;
 import org.onlab.onos.net.intent.Intent;
-import org.onlab.onos.net.intent.IntentId;
 import org.onlab.onos.net.intent.IntentTestsMocks;
 import org.onlab.onos.net.intent.PathIntent;
 import org.onlab.onos.net.intent.PointToPointIntent;
 
+import java.util.List;
+
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.hasSize;
@@ -24,6 +25,8 @@
  */
 public class TestPointToPointIntentCompiler {
 
+    private static final ApplicationId APPID = new TestApplicationId("foo");
+
     private TrafficSelector selector = new IntentTestsMocks.MockSelector();
     private TrafficTreatment treatment = new IntentTestsMocks.MockTreatment();
 
@@ -31,14 +34,12 @@
      * Creates a PointToPoint intent based on ingress and egress device Ids.
      *
      * @param ingressIdString string for id of ingress device
-     * @param egressIdString string for id of egress device
+     * @param egressIdString  string for id of egress device
      * @return PointToPointIntent for the two devices
      */
     private PointToPointIntent makeIntent(String ingressIdString,
                                           String egressIdString) {
-        return new PointToPointIntent(new IntentId(12),
-                                      selector,
-                                      treatment,
+        return new PointToPointIntent(APPID, selector, treatment,
                                       connectPoint(ingressIdString, 1),
                                       connectPoint(egressIdString, 1));
     }
@@ -53,9 +54,6 @@
         PointToPointIntentCompiler compiler =
                 new PointToPointIntentCompiler();
         compiler.pathService = new IntentTestsMocks.MockPathService(hops);
-        IdBlockAllocator idBlockAllocator = new DummyIdBlockAllocator();
-        compiler.intentIdGenerator =
-                new IdBlockAllocatorBasedIntentIdGenerator(idBlockAllocator);
         return compiler;
     }
 
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/DistributedIntentStore.java b/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/DistributedIntentStore.java
index eaba057..0deccfb 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/DistributedIntentStore.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/DistributedIntentStore.java
@@ -1,20 +1,10 @@
 package org.onlab.onos.store.intent.impl;
 
-import static org.onlab.onos.net.intent.IntentState.FAILED;
-import static org.onlab.onos.net.intent.IntentState.INSTALLED;
-import static org.onlab.onos.net.intent.IntentState.SUBMITTED;
-import static org.onlab.onos.net.intent.IntentState.WITHDRAWN;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
+import com.google.common.collect.ImmutableSet;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Service;
-import org.onlab.onos.net.intent.InstallableIntent;
 import org.onlab.onos.net.intent.Intent;
 import org.onlab.onos.net.intent.IntentEvent;
 import org.onlab.onos.net.intent.IntentId;
@@ -24,7 +14,12 @@
 import org.onlab.onos.store.AbstractStore;
 import org.slf4j.Logger;
 
-import com.google.common.collect.ImmutableSet;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static org.onlab.onos.net.intent.IntentState.*;
+import static org.slf4j.LoggerFactory.getLogger;
 
 //FIXME: I LIE I AM NOT DISTRIBUTED
 @Component(immediate = true)
@@ -36,8 +31,7 @@
     private final Logger log = getLogger(getClass());
     private final Map<IntentId, Intent> intents = new ConcurrentHashMap<>();
     private final Map<IntentId, IntentState> states = new ConcurrentHashMap<>();
-    private final Map<IntentId, List<InstallableIntent>> installable =
-            new ConcurrentHashMap<>();
+    private final Map<IntentId, List<Intent>> installable = new ConcurrentHashMap<>();
 
     @Activate
     public void activate() {
@@ -97,12 +91,12 @@
     }
 
     @Override
-    public void addInstallableIntents(IntentId intentId, List<InstallableIntent> result) {
+    public void addInstallableIntents(IntentId intentId, List<Intent> result) {
         installable.put(intentId, result);
     }
 
     @Override
-    public List<InstallableIntent> getInstallableIntents(IntentId intentId) {
+    public List<Intent> getInstallableIntents(IntentId intentId) {
         return installable.get(intentId);
     }