diff --git a/src/main/java/net/onrc/onos/api/intent/IIntentRuntimeService.java b/src/main/java/net/onrc/onos/api/intent/IIntentRuntimeService.java
deleted file mode 100644
index a3b1705..0000000
--- a/src/main/java/net/onrc/onos/api/intent/IIntentRuntimeService.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package net.onrc.onos.api.intent;
-
-import java.util.Collection;
-import java.util.EventListener;
-
-import net.onrc.onos.api.flowmanager.ConflictDetectionPolicy;
-import net.onrc.onos.api.flowmanager.Flow;
-import net.onrc.onos.api.flowmanager.FlowId;
-
-/**
- * An interface class for the Intent-Runtime Service. The role of the
- * Intent-Runtime Service is to manage a set of IFlow objects based on the
- * specified Intent objects.
- * <p>
- * It compiles accepted Intents to IFlow objects by allocating resources and
- * calculating paths based on the constrains described in the Intents, and
- * executes installation/uninstallation of the IFlow objects using FlowManager
- * Service.
- */
-public interface IIntentRuntimeService {
-    /**
-     * Installs the specified intent synchronously.
-     *
-     * <p>
-     * This method blocks until the installation succeeds or fails.
-     * </p>
-     *
-     * @param intent the intent to be installed.
-     * @return true if the intent is successfully installed. Otherwise, false.
-     */
-    public boolean install(Intent intent);
-
-    /**
-     * Removes the specified intent synchronously.
-     *
-     * <p>
-     * This method blocks until the removal succeeds or fails.
-     * </p>
-     *
-     * @param id the ID of the intent to be uninstalled.
-     * @return true if the intent is successfully uninstalled. Otherwise, false.
-     */
-    public boolean remove(IntentId id);
-
-    /**
-     * Gets specific intent.
-     *
-     * @param id ID of the intent should be retrieved
-     * @return Intent if it exists, null otherwise.
-     */
-    Intent getIntent(IntentId id);
-
-    /**
-     * Gets all intents.
-     *
-     * @return collection of intents.
-     */
-    Collection<Intent> getIntents();
-
-    /**
-     * Executes batch operation of intents.
-     *
-     * @param ops BatchOperations to be executed.
-     * @return true if succeeded, false otherwise.
-     */
-    boolean executeBatch(IntentBatchOperation ops);
-
-    /**
-     * Adds an IntentResolver associated with a given intent type.
-     *
-     * @param type the class instance of the intent type.
-     * @param resolver the resolver of the given intent type.
-     * @param <T> the type of the intent.
-     */
-    public <T extends Intent> void addResolver(Class<T> type, IntentResolver<T> resolver);
-
-    /**
-     * Removes the IntentResolver associated with the intent type.
-     *
-     * @param type the class instance of the intent type.
-     * @param <T> the type of the intent.
-     */
-    public <T extends Intent> void removeResolver(Class<T> type);
-
-    /**
-     * Adds an IntentInstaller associated with a given intent type.
-     *
-     * <p>
-     * If there is an Intent instance of the specified Intent type in the runtime,
-     * the specified IntentInstaller doesn't replace the existing installer.
-     * Otherwise, the existing installer is replaced with the specified installer.
-     * </p>
-     *
-     * @param type the class instance of the intent type.
-     * @param installer the installer of the given intent type.
-     * @param <T> the type of the intent.
-     * @return false when there is an Intent instance of the specified intent type
-     * in the runtime. Otherwise, true.
-     */
-    public <T extends Intent> boolean addInstaller(Class<T> type, IntentInstaller<T> installer);
-
-    /**
-     * Removes the IntentInstaller associated with a given intent type.
-     *
-     * <p>
-     * If there is an Intent instance of the specified Intent type in the runtime,
-     * the specified IntentInstaller is not removed. Otherwise, the existing
-     * IntentInstaller is removed from the runtime.
-     * </p>
-     *
-     * @param type the class instance of the intent type.
-     * @param <T> the type of the intent.
-     * @return false when there is an Intent instance of the specified intent type
-     * in the runtime. Otherwise, true.
-     */
-    public <T extends Intent> boolean removeInstaller(Class<T> type);
-
-    /**
-     * Gets IFlow objects managed by the specified intent.
-     *
-     * @param intentId ID of the target Intent.
-     * @return Collection of IFlow objects if exists, null otherwise.
-     */
-    Collection<Flow> getFlows(String intentId);
-
-    /**
-     * Gets Intent object which manages the specified IFlow object.
-     *
-     * @param flowId ID of the target IFlow object.
-     * @return Intent which manages the specified IFlow object, null otherwise.
-     */
-    Intent getIntentByFlow(FlowId flowId);
-
-    /**
-     * Sets a conflict detection policy.
-     *
-     * @param policy ConflictDetectionPolicy object to be set.
-     */
-    void setConflictDetectionPolicy(ConflictDetectionPolicy policy);
-
-    /**
-     * Gets the conflict detection policy.
-     *
-     * @return ConflictDetectionPolicy object being applied currently.
-     */
-    ConflictDetectionPolicy getConflictDetectionPolicy();
-
-    /**
-     * Adds event listener to this service.
-     *
-     * @param listener EventListener to be added.
-     */
-    void addEventListener(EventListener listener);
-
-    /**
-     * Removes event listener from this service.
-     *
-     * @param listener EventListener to be removed.
-     */
-    void removeEventListener(EventListener listener);
-}
diff --git a/src/main/java/net/onrc/onos/api/intent/Intent.java b/src/main/java/net/onrc/onos/api/intent/Intent.java
deleted file mode 100644
index 586605c..0000000
--- a/src/main/java/net/onrc/onos/api/intent/Intent.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package net.onrc.onos.api.intent;
-
-import com.google.common.base.Objects;
-import net.onrc.onos.api.batchoperation.BatchOperationTarget;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * The base class of an intent type.
- *
- * <p>
- * This class is sub-classed to provide other intent types like shortest path
- * connectivity and bandwidth constrained shortest path connectivity.
- * </p>
- *
- * <p>
- * The reasoning behind "intent" is that the applications can provide some
- * abstract representation of how traffic should flow be handled by the
- * networking, allowing the network OS to compile, reserve and optimize the
- * data-plane to satisfy those constraints.
- * </p>
- *
- * <p>
- * It is assumed that any kinds of intents are immutable.
- * Developers that will define a new intent type should ensure its immutability.
- * </p>
- */
-public abstract class Intent implements BatchOperationTarget {
-    private final IntentId id;
-
-    /**
-     * Constructs an intent, which is activated permanently until it is removed explicitly.
-     *
-     * @param id ID for this intent object.
-     */
-    protected Intent(IntentId id) {
-        this.id = checkNotNull(id);
-    }
-
-    /**
-     * Returns ID for this Intent object.
-     *
-     * @return ID for this Intent object.
-     */
-    public IntentId getId() {
-        return id;
-    }
-
-    @Override
-    public int hashCode() {
-        return id.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (!(obj instanceof Intent)) {
-            return false;
-        }
-
-        Intent that = (Intent) obj;
-        return Objects.equal(this.id, that.id);
-    }
-
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this)
-                .add("id", id)
-                .toString();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/api/intent/IntentId.java b/src/main/java/net/onrc/onos/api/intent/IntentId.java
deleted file mode 100644
index 5de5a12..0000000
--- a/src/main/java/net/onrc/onos/api/intent/IntentId.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package net.onrc.onos.api.intent;
-
-import net.onrc.onos.api.batchoperation.BatchOperationTarget;
-
-/**
- * The class representing intent's ID.
- *
- * <p>
- * This class is immutable.
- * </p>
- */
-public final class IntentId implements BatchOperationTarget {
-    private final long id;
-
-    /**
-     * Constructs the ID corresponding to a given long value.
-     *
-     * <p>
-     * In the future, this constructor will not be exposed to avoid misuses.
-     * </p>
-     *
-     * @param id the underlay value of this ID.
-     */
-    public IntentId(long id) {
-        this.id = id;
-    }
-
-    @Override
-    public int hashCode() {
-        return (int) (id ^ (id >>> 32));
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (!(obj instanceof IntentId)) {
-            return false;
-        }
-
-        IntentId that = (IntentId) obj;
-        return this.id == that.id;
-    }
-
-    @Override
-    public String toString() {
-        return "0x" + Long.toHexString(id);
-    }
-}
diff --git a/src/main/java/net/onrc/onos/api/intent/IntentInstaller.java b/src/main/java/net/onrc/onos/api/intent/IntentInstaller.java
deleted file mode 100644
index 3b8085a..0000000
--- a/src/main/java/net/onrc/onos/api/intent/IntentInstaller.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package net.onrc.onos.api.intent;
-
-/**
- * An interface to handle installation and removal of a specific type of intent.
- *
- * @param <T> the type of intent this installer handles.
- */
-public interface IntentInstaller<T extends Intent> {
-    /**
-     * Installs the given intent.
-     *
-     * @param intent the intent to be installed.
-     * @return true if the installation succeeds. Otherwise, false.
-     */
-    public boolean install(T intent);
-
-    /**
-     * Removes the given intent.
-     *
-     * @param intent the intent to be removed.
-     * @return true if the removal succeeds. Otherwise, false.
-     */
-    public boolean remove(T intent);
-}
diff --git a/src/main/java/net/onrc/onos/api/intent/IntentResolutionException.java b/src/main/java/net/onrc/onos/api/intent/IntentResolutionException.java
deleted file mode 100644
index 5b90f27..0000000
--- a/src/main/java/net/onrc/onos/api/intent/IntentResolutionException.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package net.onrc.onos.api.intent;
-
-/**
- * The base class of an exception thrown during intent resolution.
- */
-public class IntentResolutionException extends Exception {
-}
diff --git a/src/main/java/net/onrc/onos/api/intent/IntentResolver.java b/src/main/java/net/onrc/onos/api/intent/IntentResolver.java
deleted file mode 100644
index a27cc57..0000000
--- a/src/main/java/net/onrc/onos/api/intent/IntentResolver.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package net.onrc.onos.api.intent;
-
-import java.util.List;
-
-/**
- * An interface to translate an intent to lower level intents.
- *
- * <p>
- * IntentResolvers are registered to {@link IIntentRuntimeService} to handle translations of intents
- * (we call it intent resolution).
- * </p>
- *
- * @param <T> the type of intent this resolver translates
- */
-public interface IntentResolver<T extends Intent> {
-    /**
-     * Returns lower level intents, into which the given intent is translated.
-     *
-     * This method is invoked by the Intent Framework when the framework find an unresolved intent.
-     *
-     * @param intent the intent to be translated.
-     * @return lower level intents, into which the given intent is translated.
-     * @throws IntentResolutionException if this method can't resolve the intent.
-     */
-    public List<Intent> resolve(T intent) throws IntentResolutionException;
-}
diff --git a/src/main/java/net/onrc/onos/api/newintent/Intent.java b/src/main/java/net/onrc/onos/api/newintent/Intent.java
index 009725c..671ad30 100644
--- a/src/main/java/net/onrc/onos/api/newintent/Intent.java
+++ b/src/main/java/net/onrc/onos/api/newintent/Intent.java
@@ -1,11 +1,13 @@
 package net.onrc.onos.api.newintent;
 
+import net.onrc.onos.api.batchoperation.BatchOperationTarget;
+
 /**
  * Abstraction of an application level intent.
  *
  * Make sure that an Intent should be immutable when a new type is defined.
  */
-public interface Intent {
+public interface Intent extends BatchOperationTarget {
     /**
      * Returns the intent identifier.
      *
diff --git a/src/main/java/net/onrc/onos/api/intent/IntentBatchOperation.java b/src/main/java/net/onrc/onos/api/newintent/IntentBatchOperation.java
similarity index 96%
rename from src/main/java/net/onrc/onos/api/intent/IntentBatchOperation.java
rename to src/main/java/net/onrc/onos/api/newintent/IntentBatchOperation.java
index b5ca1aa..0e34deb 100644
--- a/src/main/java/net/onrc/onos/api/intent/IntentBatchOperation.java
+++ b/src/main/java/net/onrc/onos/api/newintent/IntentBatchOperation.java
@@ -1,4 +1,4 @@
-package net.onrc.onos.api.intent;
+package net.onrc.onos.api.newintent;
 
 import net.onrc.onos.api.batchoperation.BatchOperation;
 import net.onrc.onos.api.batchoperation.BatchOperationEntry;
diff --git a/src/main/java/net/onrc/onos/api/newintent/IntentId.java b/src/main/java/net/onrc/onos/api/newintent/IntentId.java
index 6d10b35..b7cdb01 100644
--- a/src/main/java/net/onrc/onos/api/newintent/IntentId.java
+++ b/src/main/java/net/onrc/onos/api/newintent/IntentId.java
@@ -1,11 +1,13 @@
 package net.onrc.onos.api.newintent;
 
+import net.onrc.onos.api.batchoperation.BatchOperationTarget;
+
 /**
  * Intent identifier suitable as an external key.
  *
  * This class is immutable.
  */
-public final class IntentId {
+public final class IntentId implements BatchOperationTarget {
 
     private static final int DEC = 10;
     private static final int HEX = 16;
diff --git a/src/main/java/net/onrc/onos/api/intent/IntentIdGenerator.java b/src/main/java/net/onrc/onos/api/newintent/IntentIdGenerator.java
similarity index 93%
rename from src/main/java/net/onrc/onos/api/intent/IntentIdGenerator.java
rename to src/main/java/net/onrc/onos/api/newintent/IntentIdGenerator.java
index 7bfd906..ec75c7b 100644
--- a/src/main/java/net/onrc/onos/api/intent/IntentIdGenerator.java
+++ b/src/main/java/net/onrc/onos/api/newintent/IntentIdGenerator.java
@@ -1,4 +1,4 @@
-package net.onrc.onos.api.intent;
+package net.onrc.onos.api.newintent;
 
 /**
  * This interface is for generator of IntentId.
diff --git a/src/main/java/net/onrc/onos/api/newintent/IntentState.java b/src/main/java/net/onrc/onos/api/newintent/IntentState.java
index f272320..65310ee 100644
--- a/src/main/java/net/onrc/onos/api/newintent/IntentState.java
+++ b/src/main/java/net/onrc/onos/api/newintent/IntentState.java
@@ -36,7 +36,7 @@
     /**
      * The intent is being withdrawn.
      *
-     * When {@link net.onrc.onos.api.newintent.IntentService#withdraw(Intent)} is called,
+     * When {@link IntentService#withdraw(Intent)} is called,
      * the intent takes this state first.
      */
     WITHDRAWING,
diff --git a/src/main/java/net/onrc/onos/api/intent/OpticalConnectivityIntent.java b/src/main/java/net/onrc/onos/api/newintent/OpticalConnectivityIntent.java
similarity index 87%
rename from src/main/java/net/onrc/onos/api/intent/OpticalConnectivityIntent.java
rename to src/main/java/net/onrc/onos/api/newintent/OpticalConnectivityIntent.java
index 256fa44..174d8c0 100644
--- a/src/main/java/net/onrc/onos/api/intent/OpticalConnectivityIntent.java
+++ b/src/main/java/net/onrc/onos/api/newintent/OpticalConnectivityIntent.java
@@ -1,7 +1,8 @@
-package net.onrc.onos.api.intent;
+package net.onrc.onos.api.newintent;
 
 import net.onrc.onos.core.util.SwitchPort;
 
+// TODO: consider if this intent should be sub-class of ConnectivityIntent
 /**
  * An optical layer Intent for a connectivity from a transponder port to another
  * transponder port.
@@ -10,7 +11,7 @@
  * ports and assign lambda automatically. The lambda can be specified using
  * OpticalPathFlow class.
  */
-public class OpticalConnectivityIntent extends Intent {
+public class OpticalConnectivityIntent extends AbstractIntent {
     protected SwitchPort srcSwitchPort;
     protected SwitchPort dstSwitchPort;
 
diff --git a/src/main/java/net/onrc/onos/api/intent/PacketConnectivityIntent.java b/src/main/java/net/onrc/onos/api/newintent/PacketConnectivityIntent.java
similarity index 96%
rename from src/main/java/net/onrc/onos/api/intent/PacketConnectivityIntent.java
rename to src/main/java/net/onrc/onos/api/newintent/PacketConnectivityIntent.java
index 77a2a13..e03166c 100644
--- a/src/main/java/net/onrc/onos/api/intent/PacketConnectivityIntent.java
+++ b/src/main/java/net/onrc/onos/api/newintent/PacketConnectivityIntent.java
@@ -1,4 +1,4 @@
-package net.onrc.onos.api.intent;
+package net.onrc.onos.api.newintent;
 
 import net.onrc.onos.core.matchaction.match.PacketMatch;
 import net.onrc.onos.core.util.SwitchPort;
@@ -8,6 +8,7 @@
 import java.util.HashSet;
 import java.util.Set;
 
+// TODO: consider if this intent should be sub-class of Connectivity intent
 /**
  * A packet layer Intent for a connectivity from a set of ports to a set of
  * ports.
@@ -16,7 +17,7 @@
  * NOTE: Should this class support modifier methods? Should this object a
  * read-only object?
  */
-public class PacketConnectivityIntent extends Intent {
+public class PacketConnectivityIntent extends AbstractIntent {
     protected Set<SwitchPort> srcSwitchPorts;
     protected PacketMatch match;
     protected Set<SwitchPort> dstSwitchPorts;
diff --git a/src/main/java/net/onrc/onos/core/newintent/IntentRuntimeModule.java b/src/main/java/net/onrc/onos/core/newintent/IntentRuntimeModule.java
deleted file mode 100644
index cabc1a7..0000000
--- a/src/main/java/net/onrc/onos/core/newintent/IntentRuntimeModule.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package net.onrc.onos.core.newintent;
-
-import java.util.Collection;
-import java.util.EventListener;
-
-import net.onrc.onos.api.flowmanager.ConflictDetectionPolicy;
-import net.onrc.onos.api.flowmanager.Flow;
-import net.onrc.onos.api.flowmanager.FlowId;
-import net.onrc.onos.api.intent.IIntentRuntimeService;
-import net.onrc.onos.api.intent.Intent;
-import net.onrc.onos.api.intent.IntentBatchOperation;
-import net.onrc.onos.api.intent.IntentId;
-import net.onrc.onos.api.intent.IntentInstaller;
-import net.onrc.onos.api.intent.IntentResolver;
-
-/**
- * Implementation of Intent-Runtime Service.
- * <p>
- * TODO: Make all methods thread-safe. <br>
- * TODO: Design methods to support the ReactiveForwarding and the SDN-IP.
- */
-public class IntentRuntimeModule implements IIntentRuntimeService {
-    @Override
-    public boolean install(Intent intent) {
-        // TODO: implement this method
-        return false;
-    }
-
-    @Override
-    public boolean remove(IntentId id) {
-        // TODO: implement this method
-        return false;
-    }
-
-    @Override
-    public Intent getIntent(IntentId id) {
-        // TODO Auto-generated method stub
-        // - retrieves intents from global distributed maps
-        return null;
-    }
-
-    @Override
-    public Collection<Intent> getIntents() {
-        // TODO Auto-generated method stub
-        // - retrieves intents from global distributed maps
-        return null;
-    }
-
-    @Override
-    public boolean executeBatch(IntentBatchOperation ops) {
-        // TODO Auto-generated method stub
-        // - gets flow operations using compile() method for each Intent object.
-        // - allocates resources
-        // - combines and executes flow operations using FlowManager Service.
-        // - updates global distributed maps
-        return false;
-    }
-
-    @Override
-    public <T extends Intent> void addResolver(Class<T> type, IntentResolver<T> resolver) {
-        //To change body of implemented methods use File | Settings | File Templates.
-    }
-
-    @Override
-    public <T extends Intent> void removeResolver(Class<T> type) {
-        //To change body of implemented methods use File | Settings | File Templates.
-    }
-
-    @Override
-    public <T extends Intent> boolean addInstaller(Class<T> type, IntentInstaller<T> installer) {
-        // TODO: implement this method
-        return false;
-    }
-
-    @Override
-    public <T extends Intent> boolean removeInstaller(Class<T> type) {
-        // TODO: impelment this method
-        return false;
-    }
-
-    @Override
-    public Collection<Flow> getFlows(String intentId) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Intent getIntentByFlow(FlowId flowId) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void setConflictDetectionPolicy(ConflictDetectionPolicy policy) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public ConflictDetectionPolicy getConflictDetectionPolicy() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void addEventListener(EventListener listener) {
-        // TODO Auto-generated method stub
-        // - listener for addition/removal of intents,
-        // and states changes of intents
-    }
-
-    @Override
-    public void removeEventListener(EventListener listener) {
-        // TODO Auto-generated method stub
-
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/newintent/MultiPointToSinglePointIntent.java b/src/main/java/net/onrc/onos/core/newintent/MultiPointToSinglePointIntent.java
deleted file mode 100644
index e411dd9..0000000
--- a/src/main/java/net/onrc/onos/core/newintent/MultiPointToSinglePointIntent.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package net.onrc.onos.core.newintent;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import net.onrc.onos.api.intent.Intent;
-import net.onrc.onos.api.intent.IntentId;
-import net.onrc.onos.core.matchaction.action.Action;
-import net.onrc.onos.core.matchaction.match.Match;
-import net.onrc.onos.core.util.SwitchPort;
-
-import java.util.List;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * The class represents multiple sources, single destination tree like connectivity.
- *
- * <p>
- * This class is intended to be used for the SDN-IP application.
- * </p>
- */
-public class MultiPointToSinglePointIntent extends Intent {
-    private final ImmutableList<SwitchPort> ingressPorts;
-    private final SwitchPort egressPort;
-    private final Match match;
-    private final ImmutableList<Action> modifications;
-
-    /**
-     * Constructs an intent representing multiple sources, single destination
-     * tree like connectivity.
-     *
-     * @param id the ID of the intent.
-     * @param ingressPorts the ingress ports.
-     * @param egressPort the egress port.
-     * @param match the filter condition of the incoming traffic which can go through.
-     * @param modifications the modification actions to the outgoing traffic.
-     */
-    public MultiPointToSinglePointIntent(IntentId id,
-                                         List<SwitchPort> ingressPorts,
-                                         SwitchPort egressPort,
-                                         Match match,
-                                         List<Action> modifications) {
-        super(id);
-
-        this.ingressPorts = ImmutableList.copyOf(checkNotNull(ingressPorts));
-        this.egressPort = checkNotNull(egressPort);
-        this.match = checkNotNull(match);
-        this.modifications = ImmutableList.copyOf(checkNotNull(modifications));
-    }
-
-    /**
-     * Returns the ingress ports.
-     *
-     * @return the ingress ports.
-     */
-    public ImmutableList<SwitchPort> getIngressPorts() {
-        return ingressPorts;
-    }
-
-    /**
-     * Returns the egress port.
-     *
-     * @return the egress port.
-     */
-    public SwitchPort getEgressPort() {
-        return egressPort;
-    }
-
-    /**
-     * Returns the filter condition of the incoming traffic which can go through.
-     *
-     * @return the filter condition of the incoming traffic which can go through.
-     */
-    public Match getMatch() {
-        return match;
-    }
-
-    /**
-     * Returns the modification actions to the outgoing traffic.
-     *
-     * @return the modification actions to the outgoing traffic.
-     */
-    public ImmutableList<Action> getModifications() {
-        return modifications;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(getId(), ingressPorts, egressPort, match, modifications);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (!(obj instanceof MultiPointToSinglePointIntent)) {
-            return false;
-        }
-
-        MultiPointToSinglePointIntent that = (MultiPointToSinglePointIntent) obj;
-        return Objects.equal(this.getId(), that.getId())
-                && Objects.equal(this.ingressPorts, that.ingressPorts)
-                && Objects.equal(this.egressPort, that.egressPort)
-                && Objects.equal(this.match, that.match)
-                && Objects.equal(this.modifications, that.modifications);
-    }
-
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this)
-                .add("id", getId())
-                .add("ingressPorts", ingressPorts)
-                .add("egressPort", egressPort)
-                .add("match", match)
-                .add("modifications", modifications)
-                .toString();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/newintent/PointToPointIntent.java b/src/main/java/net/onrc/onos/core/newintent/PointToPointIntent.java
deleted file mode 100644
index 95e6be8..0000000
--- a/src/main/java/net/onrc/onos/core/newintent/PointToPointIntent.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package net.onrc.onos.core.newintent;
-
-import com.google.common.base.Objects;
-import net.onrc.onos.api.intent.Intent;
-import net.onrc.onos.api.intent.IntentId;
-import net.onrc.onos.core.matchaction.match.Match;
-import net.onrc.onos.core.util.Pair;
-import net.onrc.onos.core.util.SwitchPort;
-
-import java.util.concurrent.TimeUnit;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * This class represents point-to-point connectivity.
- */
-public class PointToPointIntent extends Intent {
-    private final SwitchPort ingressPort;
-    private final SwitchPort egressPort;
-    private final Match match;
-    private final long idleTimeout;
-    private final TimeUnit unit;
-
-    /**
-     * Constructs an intent representing ingress port to egress port
-     * connectivity with a given match condition.
-     *
-     * @param id ID of this Intent object.
-     * @param ingressPort the ingress port where a path is originated.
-     * @param egressPort the egress port where a path is terminated.
-     * @param match the match condition of a path established by this intent.
-     */
-    public PointToPointIntent(IntentId id,
-                              SwitchPort ingressPort, SwitchPort egressPort,
-                              Match match) {
-        this(id, ingressPort, egressPort, match, 0, TimeUnit.SECONDS);
-    }
-
-    /**
-     * Constructs an intent representing ingress port to egress port
-     * connectivity with a given match condition
-     * and idle timeout.
-     *
-     * @param id ID of this Intent object.
-     * @param ingressPort the ingress port where a path is originated.
-     * @param egressPort the egress port where a path is terminated.
-     * @param match the match condition of a path established by this intent.
-     * @param idleTimeout the maximum time to be idle.
-     * @param unit the unit of the idleTimeout argument.
-     */
-    public PointToPointIntent(IntentId id,
-                              SwitchPort ingressPort, SwitchPort egressPort,
-                              Match match, long idleTimeout, TimeUnit unit) {
-        super(id);
-
-        checkArgument(idleTimeout >= 0, "idleTimeout should not be negative");
-
-        this.ingressPort = checkNotNull(ingressPort);
-        this.egressPort = checkNotNull(egressPort);
-        this.match = checkNotNull(match);
-        this.idleTimeout = idleTimeout;
-        this.unit = checkNotNull(unit);
-    }
-
-    /**
-     * Returns the ingress port.
-     *
-     * @return the ingress port.
-     */
-    public SwitchPort getIngressPort() {
-        return ingressPort;
-    }
-
-    /**
-     * Returns the egress port.
-     *
-     * @return the egress port.
-     */
-    public SwitchPort getEgressPort() {
-        return egressPort;
-    }
-
-    /**
-     * Returns the match condition.
-     *
-     * @return the match condition.
-     */
-    public Match getMatch() {
-        return match;
-    }
-
-    /**
-     * Returns the idle timeout.
-     *
-     * @return the idle timeout.
-     */
-    public Pair<Long, TimeUnit> getIdleTimeout() {
-        return new Pair<>(idleTimeout, unit);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(getId(), ingressPort, egressPort, match, idleTimeout, unit);
-    }
-
-    /**
-     * Compares the specified object with this intent for equality.
-     *
-     * <p>
-     * Note: Comparison of idleTimeout value is done in micro-second precision.
-     * Then the value less than a micro second is truncated. In addition, the comparison
-     * is done between long values. It causes overflow if the idleTimeout is large.
-     * </p>
-     *
-     * @param obj the object to be compared with this intent for equality.
-     * @return true if the specified object is equal to this intent.
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (!(obj instanceof PointToPointIntent)) {
-            return false;
-        }
-
-        PointToPointIntent that = (PointToPointIntent) obj;
-        long thisIdleTimeoutInMicro = this.unit.toMicros(this.idleTimeout);
-        long thatIdleTimeoutInMicro = that.unit.toMicros(that.idleTimeout);
-
-        return Objects.equal(this.getId(), that.getId())
-                && Objects.equal(this.ingressPort, that.ingressPort)
-                && Objects.equal(this.egressPort, that.egressPort)
-                && Objects.equal(this.match, that.match)
-                && Objects.equal(thisIdleTimeoutInMicro, thatIdleTimeoutInMicro);
-    }
-
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this)
-                .add("id", getId())
-                .add("ingressPort", ingressPort)
-                .add("egressPort", egressPort)
-                .add("match", match)
-                .add("idleTimeout", idleTimeout)
-                .add("unit", unit)
-                .toString();
-    }
-}
