diff --git a/core/api/src/main/java/org/onosproject/net/intent/IntentStore.java b/core/api/src/main/java/org/onosproject/net/intent/IntentStore.java
index 4898a45..ea60d7c 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/IntentStore.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/IntentStore.java
@@ -56,23 +56,6 @@
     IntentState getIntentState(IntentId intentId);
 
     /**
-     * Sets the state of the specified intent to the new state.
-     *
-     * @param intent   intent whose state is to be changed
-     * @param newState new state
-     */
-    void setState(Intent intent, IntentState newState);
-
-    /**
-     * Sets the installable intents which resulted from compilation of the
-     * specified original intent.
-     *
-     * @param intentId           original intent identifier
-     * @param installableIntents compiled installable intents
-     */
-    void setInstallableIntents(IntentId intentId, List<Intent> installableIntents);
-
-    /**
      * Returns the list of the installable events associated with the specified
      * original intent.
      *
@@ -82,14 +65,6 @@
     List<Intent> getInstallableIntents(IntentId intentId);
 
     /**
-     * Removes any installable intents which resulted from compilation of the
-     * specified original intent.
-     *
-     * @param intentId original intent identifier
-     */
-    void removeInstalledIntents(IntentId intentId);
-
-    /**
      * Execute writes in a batch.
      * If the specified BatchWrite is empty, write will not be executed.
      *
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/DistributedIntentStore.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/DistributedIntentStore.java
index 0848819..ef3b803 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/DistributedIntentStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/DistributedIntentStore.java
@@ -116,10 +116,7 @@
     // TODO make this configurable
     private boolean onlyLogTransitionError = true;
 
-    private Timer setInstallableIntentsTimer;
     private Timer getInstallableIntentsTimer;
-    private Timer removeInstalledIntentsTimer;
-    private Timer setStateTimer;
     private Timer getIntentCountTimer;
     private Timer getIntentsTimer;
     private Timer getIntentTimer;
@@ -132,10 +129,7 @@
 
     @Activate
     public void activate() {
-        setInstallableIntentsTimer = createResponseTimer("setInstallableIntents");
         getInstallableIntentsTimer = createResponseTimer("getInstallableIntents");
-        removeInstalledIntentsTimer = createResponseTimer("removeInstalledIntents");
-        setStateTimer = createResponseTimer("setState");
         getIntentCountTimer = createResponseTimer("getIntentCount");
         getIntentsTimer = createResponseTimer("getIntents");
         getIntentTimer = createResponseTimer("getIntent");
@@ -242,94 +236,6 @@
     }
 
     @Override
-    public void setState(Intent intent, IntentState state) {
-        Context timer = startTimer(setStateTimer);
-        try {
-            final IntentId id = intent.id();
-            IntentEvent.Type evtType = null;
-            final IntentState prevParking;
-            boolean transitionedToParking = true;
-            boolean updated;
-
-            // parking state transition
-            switch (state) {
-            case INSTALL_REQ:
-                prevParking = states.get(id);
-                if (prevParking == null) {
-                    updated = states.putIfAbsent(id, INSTALL_REQ);
-                    verify(updated, "Conditional replace %s => %s failed", prevParking, INSTALL_REQ);
-                } else {
-                    verify(prevParking == WITHDRAWN,
-                            "Illegal state transition attempted from %s to INSTALL_REQ",
-                            prevParking);
-                    updated = states.replace(id, prevParking, INSTALL_REQ);
-                    verify(updated, "Conditional replace %s => %s failed", prevParking, INSTALL_REQ);
-                }
-                evtType = IntentEvent.Type.INSTALL_REQ;
-                break;
-
-            case INSTALLED:
-                prevParking = states.get(id);
-                verify(PRE_INSTALLED.contains(prevParking),
-                       "Illegal state transition attempted from %s to INSTALLED",
-                       prevParking);
-                updated = states.replace(id, prevParking, INSTALLED);
-                verify(updated, "Conditional replace %s => %s failed", prevParking, INSTALLED);
-                evtType = IntentEvent.Type.INSTALLED;
-                break;
-
-            case FAILED:
-                prevParking = states.get(id);
-                updated = states.replace(id, prevParking, FAILED);
-                verify(updated, "Conditional replace %s => %s failed", prevParking, FAILED);
-                evtType = IntentEvent.Type.FAILED;
-                break;
-
-            case WITHDRAWN:
-                prevParking = states.get(id);
-                verify(PRE_WITHDRAWN.contains(prevParking),
-                       "Illegal state transition attempted from %s to WITHDRAWN",
-                       prevParking);
-                updated = states.replace(id, prevParking, WITHDRAWN);
-                verify(updated, "Conditional replace %s => %s failed", prevParking, WITHDRAWN);
-                evtType = IntentEvent.Type.WITHDRAWN;
-                break;
-
-            default:
-                transitionedToParking = false;
-                prevParking = null;
-                break;
-            }
-            if (transitionedToParking) {
-                log.debug("Parking State change: {} {}=>{}",  id, prevParking, state);
-                // remove instance local state
-                transientStates.remove(id);
-            } else {
-                // Update instance local state, which includes non-parking state transition
-                final IntentState prevTransient = transientStates.put(id, state);
-                log.debug("Transient State change: {} {}=>{}", id, prevTransient, state);
-            }
-
-            if (evtType != null) {
-                notifyDelegate(new IntentEvent(evtType, intent));
-            }
-            return;
-        } finally {
-            stopTimer(timer);
-        }
-    }
-
-    @Override
-    public void setInstallableIntents(IntentId intentId, List<Intent> result) {
-        Context timer = startTimer(setInstallableIntentsTimer);
-        try {
-            installable.put(intentId, result);
-        } finally {
-            stopTimer(timer);
-        }
-    }
-
-    @Override
     public List<Intent> getInstallableIntents(IntentId intentId) {
         Context timer = startTimer(getInstallableIntentsTimer);
         try {
@@ -339,16 +245,6 @@
         }
     }
 
-    @Override
-    public void removeInstalledIntents(IntentId intentId) {
-        Context timer = startTimer(removeInstalledIntentsTimer);
-        try {
-            installable.remove(intentId);
-        } finally {
-            stopTimer(timer);
-        }
-    }
-
     protected String strIntentId(IntentId key) {
         return keyCache.getUnchecked(key);
     }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
index 4f65979..dff3b67 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
@@ -186,11 +186,6 @@
         return null;
     }
 
-    @Override
-    public void setState(Intent intent, IntentState newState) {
-        // TODO implement
-    }
-
     private IntentEvent setStateInternal(IntentId intentId, IntentState newState, Timestamp timestamp) {
         switch (newState) {
         case WITHDRAW_REQ:
@@ -225,12 +220,6 @@
         }
     }
 
-    @Override
-    public void setInstallableIntents(IntentId intentId,
-                                      List<Intent> installableIntents) {
-        // TODO implement
-    }
-
     private void setInstallableIntentsInternal(IntentId intentId,
                                                List<Intent> installableIntents,
                                                Timestamp timestamp) {
@@ -253,11 +242,6 @@
     }
 
     @Override
-    public void removeInstalledIntents(IntentId intentId) {
-        // TODO implement
-    }
-
-    @Override
     public List<BatchWrite.Operation> batchWrite(BatchWrite batch) {
 
         List<IntentEvent> events = Lists.newArrayList();
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/HazelcastIntentStore.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/HazelcastIntentStore.java
index 5121aca..a090c7e 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/HazelcastIntentStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/HazelcastIntentStore.java
@@ -101,10 +101,7 @@
 
     private boolean onlyLogTransitionError = true;
 
-    private Timer setInstallableIntentsTimer;
     private Timer getInstallableIntentsTimer;
-    private Timer removeInstalledIntentsTimer;
-    private Timer setStateTimer;
     private Timer getIntentCountTimer;
     private Timer getIntentsTimer;
     private Timer getIntentTimer;
@@ -128,10 +125,7 @@
     public void activate() {
         localIntents = new ConcurrentHashMap<>();
 
-        setInstallableIntentsTimer = createResponseTimer("setInstallableIntents");
         getInstallableIntentsTimer = createResponseTimer("getInstallableIntents");
-        removeInstalledIntentsTimer = createResponseTimer("removeInstalledIntents");
-        setStateTimer = createResponseTimer("setState");
         getIntentCountTimer = createResponseTimer("getIntentCount");
         getIntentsTimer = createResponseTimer("getIntents");
         getIntentTimer = createResponseTimer("getIntent");
@@ -257,86 +251,6 @@
     }
 
     @Override
-    public void setState(Intent intent, IntentState state) {
-        Context timer = startTimer(setStateTimer);
-        try {
-            final IntentId id = intent.id();
-            IntentEvent.Type type = null;
-            final IntentState prevParking;
-            boolean transientStateChangeOnly = false;
-
-            // parking state transition
-            switch (state) {
-            case INSTALL_REQ:
-                prevParking = states.get(id);
-                if (prevParking == null) {
-                    IntentState existing = states.putIfAbsent(id, INSTALL_REQ);
-                    verify(existing == null, "Conditional replace %s => %s failed", prevParking, INSTALL_REQ);
-                } else {
-                    verify(PRE_INSTALLED.contains(prevParking),
-                            "Illegal state transition attempted from %s to INSTALL_REQ",
-                            prevParking);
-                    boolean updated = states.replace(id, prevParking, INSTALL_REQ);
-                    verify(updated, "Conditional replace %s => %s failed", prevParking, INSTALL_REQ);
-                }
-                type = IntentEvent.Type.INSTALL_REQ;
-                break;
-            case INSTALLED:
-                prevParking = states.replace(id, INSTALLED);
-                verify(prevParking == INSTALL_REQ,
-                       "Illegal state transition attempted from %s to INSTALLED",
-                       prevParking);
-                type = IntentEvent.Type.INSTALLED;
-                break;
-            case FAILED:
-                prevParking = states.replace(id, FAILED);
-                type = IntentEvent.Type.FAILED;
-                break;
-            case WITHDRAW_REQ:
-                prevParking = states.replace(id, WITHDRAW_REQ);
-                verify(PRE_WITHDRAWN.contains(prevParking),
-                       "Illegal state transition attempted from %s to WITHDRAW_REQ",
-                       prevParking);
-                type = IntentEvent.Type.WITHDRAW_REQ;
-                break;
-            case WITHDRAWN:
-                prevParking = states.replace(id, WITHDRAWN);
-                verify(prevParking == WITHDRAW_REQ,
-                       "Illegal state transition attempted from %s to WITHDRAWN",
-                       prevParking);
-                type = IntentEvent.Type.WITHDRAWN;
-                break;
-            default:
-                transientStateChangeOnly = true;
-                prevParking = null;
-                break;
-            }
-            if (!transientStateChangeOnly) {
-                log.debug("Parking State change: {} {}=>{}",  id, prevParking, state);
-            }
-            // Update instance local state, which includes non-parking state transition
-            final IntentState prevTransient = transientStates.put(id, state);
-            log.debug("Transient State change: {} {}=>{}", id, prevTransient, state);
-
-            if (type != null) {
-                notifyDelegate(new IntentEvent(type, intent));
-            }
-        } finally {
-            stopTimer(timer);
-        }
-    }
-
-    @Override
-    public void setInstallableIntents(IntentId intentId, List<Intent> result) {
-        Context timer = startTimer(setInstallableIntentsTimer);
-        try {
-            installable.put(intentId, result);
-        } finally {
-            stopTimer(timer);
-        }
-    }
-
-    @Override
     public List<Intent> getInstallableIntents(IntentId intentId) {
         Context timer = startTimer(getInstallableIntentsTimer);
         try {
@@ -347,16 +261,6 @@
     }
 
     @Override
-    public void removeInstalledIntents(IntentId intentId) {
-        Context timer = startTimer(removeInstalledIntentsTimer);
-        try {
-            installable.remove(intentId);
-        } finally {
-            stopTimer(timer);
-        }
-    }
-
-    @Override
     public List<Operation> batchWrite(BatchWrite batch) {
         if (batch.isEmpty()) {
             return Collections.emptyList();
diff --git a/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleIntentStore.java b/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleIntentStore.java
index efdff0a..d2e102e 100644
--- a/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleIntentStore.java
+++ b/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleIntentStore.java
@@ -101,8 +101,7 @@
         return states.get(id);
     }
 
-    @Override
-    public void setState(Intent intent, IntentState state) {
+    private void setState(Intent intent, IntentState state) {
         IntentId id = intent.id();
         states.put(id, state);
         IntentEvent.Type type = null;
@@ -131,8 +130,7 @@
         }
     }
 
-    @Override
-    public void setInstallableIntents(IntentId intentId, List<Intent> result) {
+    private void setInstallableIntents(IntentId intentId, List<Intent> result) {
         installable.put(intentId, result);
     }
 
@@ -141,10 +139,10 @@
         return installable.get(intentId);
     }
 
-    @Override
-    public void removeInstalledIntents(IntentId intentId) {
+    private void removeInstalledIntents(IntentId intentId) {
         installable.remove(intentId);
     }
+
     /**
      * Execute writes in a batch.
      *
