diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java b/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java
index 62174e0..3c73851 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java
@@ -182,6 +182,12 @@
     }
 
     @Override
+    public Iterable<IntentData> getIntentData() {
+        checkPermission(Permission.INTENT_READ);
+        return store.getIntentData(false, 0);
+    }
+
+    @Override
     public long getIntentCount() {
         checkPermission(Permission.INTENT_READ);
 
@@ -258,6 +264,11 @@
         public void process(IntentData data) {
             accumulator.add(data);
         }
+
+        @Override
+        public void onUpdate(IntentData intentData) {
+            trackerService.trackIntent(intentData);
+        }
     }
 
     private void buildAndSubmitBatches(Iterable<Key> intentKeys,
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTracker.java b/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTracker.java
index 62d67ed..5f6bc5d 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTracker.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTracker.java
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.google.common.collect.SetMultimap;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -40,6 +41,7 @@
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.intent.Intent;
+import org.onosproject.net.intent.IntentData;
 import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.PartitionEvent;
@@ -57,7 +59,9 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -69,7 +73,9 @@
 import static com.google.common.collect.Multimaps.synchronizedSetMultimap;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onlab.util.Tools.isNullOrEmpty;
 import static org.onosproject.net.LinkKey.linkKey;
+import static org.onosproject.net.intent.IntentState.INSTALLED;
 import static org.onosproject.net.link.LinkEvent.Type.LINK_REMOVED;
 import static org.onosproject.net.link.LinkEvent.Type.LINK_UPDATED;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -84,6 +90,8 @@
 
     private final Logger log = getLogger(getClass());
 
+    private final ConcurrentMap<Key, Intent> intents = Maps.newConcurrentMap();
+
     private final SetMultimap<LinkKey, Key> intentsByLink =
             //TODO this could be slow as a point of synchronization
             synchronizedSetMultimap(HashMultimap.<LinkKey, Key>create());
@@ -195,6 +203,46 @@
         }
     }
 
+    @Override
+    public void trackIntent(IntentData intentData) {
+
+        //NOTE: This will be called for intents that are being added to the store
+        //      locally (i.e. every intent update)
+
+        Key key = intentData.key();
+        Intent intent = intentData.intent();
+        boolean isLocal = intentService.isLocal(key);
+        List<Intent> installables = intentData.installables();
+
+        if (log.isTraceEnabled()) {
+            log.trace("intent {}, old: {}, new: {}, installableCount: {}, resourceCount: {}",
+                      key,
+                      intentsByDevice.values().contains(key),
+                      isLocal,
+                      installables.size(),
+                      intent.resources().size() +
+                          installables.stream()
+                              .mapToLong(i -> i.resources().size()).sum());
+        }
+
+        if (isNullOrEmpty(installables) && intentData.state() == INSTALLED) {
+            log.warn("Intent {} is INSTALLED with no installables", key);
+        }
+
+        if (isLocal) {
+            addTrackedResources(key, intent.resources());
+            for (Intent installable : installables) {
+                addTrackedResources(key, installable.resources());
+            }
+            // FIXME check all resources against current topo service(s); recompile if necessary
+        } else {
+            removeTrackedResources(key, intent.resources());
+            for (Intent installable : installables) {
+                removeTrackedResources(key, installable.resources());
+            }
+        }
+    }
+
     // Internal re-actor to topology change events.
     private class InternalTopologyListener implements TopologyListener {
         @Override
@@ -371,25 +419,11 @@
         }
         try {
             //FIXME very inefficient
-            for (Intent intent : intentService.getIntents()) {
+            for (IntentData intentData : intentService.getIntentData()) {
                 try {
-                    if (intentService.isLocal(intent.key())) {
-                        log.trace("intent {}, old: {}, new: {}",
-                                 intent.key(), intentsByDevice.values().contains(intent.key()), true);
-                        addTrackedResources(intent.key(), intent.resources());
-                        intentService.getInstallableIntents(intent.key()).stream()
-                                .forEach(installable ->
-                                                 addTrackedResources(intent.key(), installable.resources()));
-                    } else {
-                        log.trace("intent {}, old: {}, new: {}",
-                                 intent.key(), intentsByDevice.values().contains(intent.key()), false);
-                        removeTrackedResources(intent.key(), intent.resources());
-                        intentService.getInstallableIntents(intent.key()).stream()
-                                .forEach(installable ->
-                                                 removeTrackedResources(intent.key(), installable.resources()));
-                    }
+                    trackIntent(intentData);
                 } catch (NullPointerException npe) {
-                    log.warn("intent error {}", intent.key(), npe);
+                    log.warn("intent error {}", intentData.key(), npe);
                 }
             }
         } catch (Exception e) {
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTrackerService.java b/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTrackerService.java
index 667803c..b7d367d 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTrackerService.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTrackerService.java
@@ -15,11 +15,12 @@
  */
 package org.onosproject.net.intent.impl;
 
-import java.util.Collection;
-
 import org.onosproject.net.NetworkResource;
+import org.onosproject.net.intent.IntentData;
 import org.onosproject.net.intent.Key;
 
+import java.util.Collection;
+
 /**
  * Auxiliary service for tracking intent path flows and for notifying the
  * intent service of environment changes via topology change delegate.
@@ -59,4 +60,10 @@
     void removeTrackedResources(Key intentKey,
                                        Collection<NetworkResource> resources);
 
+    /**
+     * Submits the specified intent data to be tracked.
+     *
+     * @param intentData intent data object to be tracked
+     */
+    void trackIntent(IntentData intentData);
 }
