diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/ServiceFunctionForwarderService.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/ServiceFunctionForwarderService.java
deleted file mode 100644
index b270b13..0000000
--- a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/ServiceFunctionForwarderService.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.sfc.forwarder;
-
-import java.util.List;
-
-import org.onosproject.net.NshServicePathId;
-import org.onosproject.vtnrsc.PortChain;
-import org.onosproject.vtnrsc.PortPairId;
-
-/**
- * Abstraction of an entity which provides service function forwarder.
- */
-public interface ServiceFunctionForwarderService {
-
-    /**
-     * Install forwarding rule.
-     *
-     * @param portChain port-chain
-     * @param nshSpi nsh spi
-     */
-    @Deprecated
-    void installForwardingRule(PortChain portChain, NshServicePathId nshSpi);
-
-    /**
-     * Uninstall forwarding rule.
-     *
-     * @param portChain port-chain
-     * @param nshSpi nsh spi
-     */
-    @Deprecated
-    void unInstallForwardingRule(PortChain portChain, NshServicePathId nshSpi);
-
-    /**
-     * Install load balanced forwarding rules.
-     *
-     * @param path load balanced path of port pairs
-     * @param nshSpi nsh service path index
-     */
-    void installLoadBalancedForwardingRule(List<PortPairId> path, NshServicePathId nshSpi);
-
-    /**
-     * Uninstall load balanced forwarding rules.
-     *
-     * @param path load balanced path of port pairs
-     * @param nshSpi nsh service path index
-     */
-    void unInstallLoadBalancedForwardingRule(List<PortPairId> path, NshServicePathId nshSpi);
-}
diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/impl/ServiceFunctionForwarderImpl.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/impl/ServiceFunctionForwarderImpl.java
deleted file mode 100644
index 9875e4d..0000000
--- a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/impl/ServiceFunctionForwarderImpl.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.sfc.forwarder.impl;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.net.flow.criteria.ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SPI;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.List;
-import java.util.ListIterator;
-
-import org.onlab.osgi.DefaultServiceDirectory;
-import org.onlab.osgi.ServiceDirectory;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.TpPort;
-import org.onlab.packet.VlanId;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.NshServicePathId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.behaviour.ExtensionSelectorResolver;
-import org.onosproject.net.driver.DriverHandler;
-import org.onosproject.net.driver.DriverService;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.ExtensionSelector;
-import org.onosproject.net.flowobjective.DefaultForwardingObjective;
-import org.onosproject.net.flowobjective.FlowObjectiveService;
-import org.onosproject.net.flowobjective.ForwardingObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective.Flag;
-import org.onosproject.net.flowobjective.Objective;
-import org.onosproject.net.host.HostService;
-import org.onosproject.sfc.forwarder.ServiceFunctionForwarderService;
-import org.onosproject.vtnrsc.PortChain;
-import org.onosproject.vtnrsc.PortPair;
-import org.onosproject.vtnrsc.PortPairId;
-import org.onosproject.vtnrsc.VirtualPortId;
-import org.onosproject.vtnrsc.flowclassifier.FlowClassifierService;
-import org.onosproject.vtnrsc.portchain.PortChainService;
-import org.onosproject.vtnrsc.portpair.PortPairService;
-import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
-import org.onosproject.vtnrsc.service.VtnRscService;
-import org.onosproject.vtnrsc.virtualport.VirtualPortService;
-import org.slf4j.Logger;
-
-/**
- * Provides service function forwarder implementation.
- */
-public class ServiceFunctionForwarderImpl implements ServiceFunctionForwarderService {
-
-    private final Logger log = getLogger(getClass());
-    protected VirtualPortService virtualPortService;
-    protected VtnRscService vtnRscService;
-    protected PortPairService portPairService;
-    protected PortPairGroupService portPairGroupService;
-    protected FlowClassifierService flowClassifierService;
-    protected PortChainService portChainService;
-    protected DriverService driverService;
-    protected FlowObjectiveService flowObjectiveService;
-    protected HostService hostService;
-    protected ApplicationId appId;
-
-    private static final String PATH_NOT_NULL = "Load balanced path cannot be null";
-    private static final String APP_ID_NOT_NULL = "Application-Id cannot be null";
-
-    /**
-     * Default constructor.
-     */
-    public ServiceFunctionForwarderImpl() {
-    }
-
-    /**
-     * Explicit constructor.
-     *
-     * @param appId application id
-     */
-    public ServiceFunctionForwarderImpl(ApplicationId appId) {
-        this.appId = checkNotNull(appId, APP_ID_NOT_NULL);
-        ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
-        this.flowObjectiveService = serviceDirectory.get(FlowObjectiveService.class);
-        this.driverService = serviceDirectory.get(DriverService.class);
-        this.virtualPortService = serviceDirectory.get(VirtualPortService.class);
-        this.vtnRscService = serviceDirectory.get(VtnRscService.class);
-        this.portPairService = serviceDirectory.get(PortPairService.class);
-        this.portPairGroupService = serviceDirectory.get(PortPairGroupService.class);
-        this.flowClassifierService = serviceDirectory.get(FlowClassifierService.class);
-        this.hostService = serviceDirectory.get(HostService.class);
-        this.portChainService = serviceDirectory.get(PortChainService.class);
-    }
-
-    @Override
-    public void installForwardingRule(PortChain portChain, NshServicePathId nshSpi) {
-        //TODO this method will be removed
-    }
-
-    @Override
-    public void unInstallForwardingRule(PortChain portChain, NshServicePathId nshSpi) {
-        //TODO this method will be removed
-    }
-
-    @Override
-    public void installLoadBalancedForwardingRule(List<PortPairId> path, NshServicePathId nshSpi) {
-        checkNotNull(path, PATH_NOT_NULL);
-        processForwardingRule(path, nshSpi, Objective.Operation.ADD);
-    }
-
-    @Override
-    public void unInstallLoadBalancedForwardingRule(List<PortPairId> path, NshServicePathId nshSpi) {
-        checkNotNull(path, PATH_NOT_NULL);
-        processForwardingRule(path, nshSpi, Objective.Operation.REMOVE);
-    }
-
-    /**
-     * Process the required forwarding rules for the given path.
-     *
-     * @param path list of port pair ids
-     * @param nshSpi service path index
-     * @param type operation type ADD/REMOVE
-     */
-    private void processForwardingRule(List<PortPairId> path, NshServicePathId nshSpi,
-                                       Objective.Operation type) {
-
-        // Get the first port pair
-        ListIterator<PortPairId> portPairListIterator = path.listIterator();
-        PortPair currentPortPair = portPairService.getPortPair(portPairListIterator.next());
-
-        // Get destination port pair group
-        if (!portPairListIterator.hasNext()) {
-            log.debug("Path is empty");
-            return;
-        }
-        PortPair nextPortPair = portPairService.getPortPair(portPairListIterator.next());
-        DeviceId currentDeviceId = null;
-        DeviceId nextDeviceId = null;
-
-        // Travel from SF to SF.
-        do {
-            currentDeviceId = vtnRscService.getSfToSffMaping(VirtualPortId.portId(currentPortPair.egress()));
-            nextDeviceId = vtnRscService.getSfToSffMaping(VirtualPortId.portId(nextPortPair.ingress()));
-            // pack traffic selector
-            TrafficSelector.Builder selector = packTrafficSelector(currentDeviceId, currentPortPair, nshSpi);
-            // Pack treatment
-            if (currentDeviceId.equals(nextDeviceId)) {
-                TrafficTreatment.Builder treatment = packTrafficTreatment(nextPortPair, true);
-                // Send SFF to SFF
-                sendServiceFunctionForwarder(selector, treatment, currentDeviceId, type);
-            } else {
-                TrafficTreatment.Builder treatment = packTrafficTreatment(nextPortPair, false);
-                // Send SFF to OVS
-                sendServiceFunctionForwarder(selector, treatment, currentDeviceId, type);
-
-                // At the other device get the packet from vlan and send to first port pair
-                TrafficSelector.Builder selectorDst = DefaultTrafficSelector.builder();
-                selectorDst.matchVlanId((VlanId.vlanId(Short.parseShort((vtnRscService
-                        .getL3vni(nextPortPair.tenantId()).toString())))));
-                TrafficTreatment.Builder treatmentDst = DefaultTrafficTreatment.builder();
-                MacAddress macAddr = virtualPortService.getPort(VirtualPortId.portId(nextPortPair.ingress()))
-                        .macAddress();
-                Host host = hostService.getHost(HostId.hostId(macAddr));
-                PortNumber port = host.location().port();
-                treatmentDst.setOutput(port);
-                // Send OVS to SFF
-                sendServiceFunctionForwarder(selectorDst, treatmentDst, nextDeviceId, type);
-            }
-
-            // Move to next service function
-            currentPortPair = nextPortPair;
-            if (!portPairListIterator.hasNext()) {
-                break;
-            }
-            nextPortPair = portPairService.getPortPair(portPairListIterator.next());
-        } while (true);
-    }
-
-    /**
-     * Pack traffic selector.
-     *
-     * @param deviceId device id
-     * @param portPair port-pair
-     * @param nshSpi nsh service path index
-     * @return traffic selector
-     */
-    public TrafficSelector.Builder packTrafficSelector(DeviceId deviceId,
-                                                       PortPair portPair, NshServicePathId nshSpi) {
-        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
-
-        MacAddress dstMacAddress = virtualPortService.getPort(VirtualPortId.portId(portPair.egress())).macAddress();
-        Host host = hostService.getHost(HostId.hostId(dstMacAddress));
-        PortNumber port = host.location().port();
-        selector.matchInPort(port);
-
-        DriverHandler handler = driverService.createHandler(deviceId);
-        ExtensionSelectorResolver resolver = handler.behaviour(ExtensionSelectorResolver.class);
-        ExtensionSelector nspSpiSelector = resolver.getExtensionSelector(NICIRA_MATCH_NSH_SPI.type());
-
-        try {
-            nspSpiSelector.setPropertyValue("nshSpi", nshSpi);
-        } catch (Exception e) {
-            log.error("Failed to get extension instruction to set Nsh Spi Id {}", deviceId);
-        }
-
-        selector.extension(nspSpiSelector, deviceId);
-
-        return selector;
-    }
-
-    /**
-     * Pack traffic treatment.
-     *
-     * @param portPair port pair
-     * @param isSameOvs whether the next port pair is in the same ovs
-     * @return traffic treatment
-     */
-    public TrafficTreatment.Builder packTrafficTreatment(PortPair portPair, boolean isSameOvs) {
-        MacAddress srcMacAddress = null;
-
-        // Check the treatment whether destination SF is on same OVS or in
-        // different OVS.
-        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
-        if (isSameOvs) {
-            srcMacAddress = virtualPortService.getPort(VirtualPortId.portId(portPair.ingress())).macAddress();
-            Host host = hostService.getHost(HostId.hostId(srcMacAddress));
-            PortNumber port = host.location().port();
-            treatment.setOutput(port);
-        } else {
-            // Vxlan tunnel port for NSH header(Vxlan + NSH).
-            TpPort nshDstPort = TpPort.tpPort(6633);
-            // TODO check whether this logic is correct
-            VlanId vlanId = VlanId.vlanId(Short.parseShort((vtnRscService.getL3vni(portPair.tenantId()).toString())));
-            treatment.setVlanId(vlanId);
-            treatment.setUdpDst(nshDstPort);
-        }
-
-        return treatment;
-    }
-
-    /**
-     * Send service function forwarder to OVS.
-     *
-     * @param selector traffic selector
-     * @param treatment traffic treatment
-     * @param deviceId device id
-     * @param type operation type
-     */
-    public void sendServiceFunctionForwarder(TrafficSelector.Builder selector, TrafficTreatment.Builder treatment,
-                                             DeviceId deviceId, Objective.Operation type) {
-        log.info("Sending flow to serfice-function-forwarder. Selector {}, Treatment {}",
-                 selector.toString(), treatment.toString());
-        ForwardingObjective.Builder objective = DefaultForwardingObjective.builder().withTreatment(treatment.build())
-                .withSelector(selector.build()).fromApp(appId).makePermanent().withFlag(Flag.VERSATILE);
-        if (type.equals(Objective.Operation.ADD)) {
-            log.debug("ADD");
-            flowObjectiveService.forward(deviceId, objective.add());
-        } else {
-            log.debug("REMOVE");
-            flowObjectiveService.forward(deviceId, objective.remove());
-        }
-    }
-}
diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/impl/package-info.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/impl/package-info.java
deleted file mode 100644
index 6dfe007..0000000
--- a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/impl/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * SFC Service manager for interacting with SFC.
- */
-package org.onosproject.sfc.forwarder.impl;
diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/package-info.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/package-info.java
deleted file mode 100644
index 83ac1dd..0000000
--- a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/forwarder/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Service function forwarder for SFC.
- */
-package org.onosproject.sfc.forwarder;
diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/FlowClassifierInstallerService.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/SfcFlowRuleInstallerService.java
similarity index 79%
rename from apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/FlowClassifierInstallerService.java
rename to apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/SfcFlowRuleInstallerService.java
index 58e59be..caff305 100644
--- a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/FlowClassifierInstallerService.java
+++ b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/SfcFlowRuleInstallerService.java
@@ -23,7 +23,7 @@
 /**
  * Abstraction of an entity which installs flow classification rules in ovs.
  */
-public interface FlowClassifierInstallerService {
+public interface SfcFlowRuleInstallerService {
 
     /**
      * Install flow classifier.
@@ -44,24 +44,24 @@
     ConnectPoint unInstallFlowClassifier(PortChain portChain, NshServicePathId nshSpiId);
 
     /**
-     * Install load balanced flow classifier.
+     * Install load balanced flow rules.
      *
      * @param portChain port-chain
      * @param fiveTuple five tuple packet information
      * @param nshSpiId service path index identifier
      * @return connectPoint the network identifier
      */
-    ConnectPoint installLoadBalancedFlowClassifier(PortChain portChain, FiveTuple fiveTuple,
-                                                   NshServicePathId nshSpiId);
+    ConnectPoint installLoadBalancedFlowRules(PortChain portChain, FiveTuple fiveTuple,
+            NshServicePathId nshSpiId);
 
     /**
-     * Uninstall load balanced flow classifier.
+     * Uninstall load balanced flow rules.
      *
      * @param portChain port-chain
      * @param fiveTuple five tuple packet information
      * @param nshSpiId service path index identifier
      * @return connectPoint the network identifier
      */
-    ConnectPoint unInstallLoadBalancedFlowClassifier(PortChain portChain, FiveTuple fiveTuple,
-                                                     NshServicePathId nshSpiId);
+    ConnectPoint unInstallLoadBalancedFlowRules(PortChain portChain, FiveTuple fiveTuple,
+            NshServicePathId nshSpiId);
 }
diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/impl/FlowClassifierInstallerImpl.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/impl/FlowClassifierInstallerImpl.java
deleted file mode 100644
index ec12553..0000000
--- a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/impl/FlowClassifierInstallerImpl.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.sfc.installer.impl;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_SI;
-import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_SPI;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.onlab.osgi.DefaultServiceDirectory;
-import org.onlab.osgi.ServiceDirectory;
-import org.onlab.packet.Ethernet;
-import org.onlab.packet.IPv4;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.TpPort;
-import org.onlab.packet.VlanId;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.NshServiceIndex;
-import org.onosproject.net.NshServicePathId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.driver.DriverHandler;
-import org.onosproject.net.driver.DriverService;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.Criteria;
-import org.onosproject.net.flow.instructions.ExtensionTreatment;
-import org.onosproject.net.flowobjective.DefaultForwardingObjective;
-import org.onosproject.net.flowobjective.FlowObjectiveService;
-import org.onosproject.net.flowobjective.ForwardingObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective.Flag;
-import org.onosproject.net.flowobjective.Objective;
-import org.onosproject.net.host.HostService;
-import org.onosproject.sfc.installer.FlowClassifierInstallerService;
-import org.onosproject.vtnrsc.FiveTuple;
-import org.onosproject.vtnrsc.FlowClassifier;
-import org.onosproject.vtnrsc.FlowClassifierId;
-import org.onosproject.vtnrsc.PortChain;
-import org.onosproject.vtnrsc.PortPair;
-import org.onosproject.vtnrsc.PortPairGroup;
-import org.onosproject.vtnrsc.PortPairGroupId;
-import org.onosproject.vtnrsc.PortPairId;
-import org.onosproject.vtnrsc.VirtualPortId;
-import org.onosproject.vtnrsc.flowclassifier.FlowClassifierService;
-import org.onosproject.vtnrsc.portpair.PortPairService;
-import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
-import org.onosproject.vtnrsc.service.VtnRscService;
-import org.onosproject.vtnrsc.virtualport.VirtualPortService;
-import org.slf4j.Logger;
-
-/**
- * Provides flow classifier installer implementation.
- */
-public class FlowClassifierInstallerImpl implements FlowClassifierInstallerService {
-    private final Logger log = getLogger(getClass());
-
-    protected VirtualPortService virtualPortService;
-    protected VtnRscService vtnRscService;
-    protected PortPairService portPairService;
-    protected PortPairGroupService portPairGroupService;
-    protected FlowClassifierService flowClassifierService;
-    protected DriverService driverService;
-    protected DeviceService deviceService;
-    protected HostService hostService;
-    protected FlowObjectiveService flowObjectiveService;
-    protected ApplicationId appId;
-
-    private static final String DRIVER_NAME = "onosfw";
-    private static final String FLOW_CLASSIFIER_NOT_NULL = "Flow-Classifier cannot be null";
-    private static final String FLOW_CLASSIFIER_ID_NOT_NULL = "Flow-Classifier-Id cannot be null";
-    private static final String PORT_CHAIN_NOT_NULL = "Port-Chain cannot be null";
-    private static final int NULL = 0;
-    private static final int FLOW_CLASSIFIER_PRIORITY = 0x7fff;
-    private static final short NSH_SI_ID = 0xff;
-
-    /**
-     * Default constructor.
-     */
-    public FlowClassifierInstallerImpl() {
-    }
-
-    /**
-     * Explicit constructor.
-     *
-     * @param appId application id.
-     */
-    public FlowClassifierInstallerImpl(ApplicationId appId) {
-        this.appId = checkNotNull(appId, "ApplicationId can not be null");
-        ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
-        this.flowObjectiveService = serviceDirectory.get(FlowObjectiveService.class);
-        this.driverService = serviceDirectory.get(DriverService.class);
-        this.deviceService = serviceDirectory.get(DeviceService.class);
-        this.hostService = serviceDirectory.get(HostService.class);
-        this.virtualPortService = serviceDirectory.get(VirtualPortService.class);
-        this.vtnRscService = serviceDirectory.get(VtnRscService.class);
-        this.portPairService = serviceDirectory.get(PortPairService.class);
-        this.portPairGroupService = serviceDirectory.get(PortPairGroupService.class);
-        this.flowClassifierService = serviceDirectory.get(FlowClassifierService.class);
-    }
-
-    @Override
-    public ConnectPoint installFlowClassifier(PortChain portChain, NshServicePathId nshSpiId) {
-        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
-        // Get the portPairGroup
-        List<PortPairGroupId> llPortPairGroupIdList = portChain.portPairGroups();
-        ListIterator<PortPairGroupId> portPairGroupIdListIterator = llPortPairGroupIdList.listIterator();
-        PortPairGroupId portPairGroupId = portPairGroupIdListIterator.next();
-        PortPairGroup portPairGroup = portPairGroupService.getPortPairGroup(portPairGroupId);
-        List<PortPairId> llPortPairIdList = portPairGroup.portPairs();
-
-        // Get port pair
-        ListIterator<PortPairId> portPairListIterator = llPortPairIdList.listIterator();
-        PortPairId portPairId = portPairListIterator.next();
-        PortPair portPair = portPairService.getPortPair(portPairId);
-
-        return processFlowClassifier(portChain, portPair, nshSpiId, null, Objective.Operation.ADD);
-    }
-
-    @Override
-    public ConnectPoint unInstallFlowClassifier(PortChain portChain, NshServicePathId nshSpiId) {
-        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
-        // Get the portPairGroup
-        List<PortPairGroupId> llPortPairGroupIdList = portChain.portPairGroups();
-        ListIterator<PortPairGroupId> portPairGroupIdListIterator = llPortPairGroupIdList.listIterator();
-        PortPairGroupId portPairGroupId = portPairGroupIdListIterator.next();
-        PortPairGroup portPairGroup = portPairGroupService.getPortPairGroup(portPairGroupId);
-        List<PortPairId> llPortPairIdList = portPairGroup.portPairs();
-
-        // Get port pair
-        ListIterator<PortPairId> portPairListIterator = llPortPairIdList.listIterator();
-        PortPairId portPairId = portPairListIterator.next();
-        PortPair portPair = portPairService.getPortPair(portPairId);
-
-        return processFlowClassifier(portChain, portPair, nshSpiId, null, Objective.Operation.REMOVE);
-    }
-
-    @Override
-    public ConnectPoint installLoadBalancedFlowClassifier(PortChain portChain, FiveTuple fiveTuple,
-                                                          NshServicePathId nshSpiId) {
-        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
-
-        // Get the load balanced path
-        List<PortPairId> portPairs = portChain.getLoadBalancePath(fiveTuple);
-
-        // Get the first port pair
-        ListIterator<PortPairId> portPairListIterator = portPairs.listIterator();
-        PortPairId portPairId = portPairListIterator.next();
-        PortPair portPair = portPairService.getPortPair(portPairId);
-
-        return processFlowClassifier(portChain, portPair, nshSpiId, fiveTuple, Objective.Operation.ADD);
-    }
-
-    @Override
-    public ConnectPoint unInstallLoadBalancedFlowClassifier(PortChain portChain, FiveTuple fiveTuple,
-                                                            NshServicePathId nshSpiId) {
-        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
-        // Get the load balanced path
-        List<PortPairId> portPairs = portChain.getLoadBalancePath(fiveTuple);
-
-        // Get the first port pair
-        ListIterator<PortPairId> portPairListIterator = portPairs.listIterator();
-        PortPairId portPairId = portPairListIterator.next();
-        PortPair portPair = portPairService.getPortPair(portPairId);
-
-        return processFlowClassifier(portChain, portPair, nshSpiId, fiveTuple, Objective.Operation.REMOVE);
-    }
-
-    public ConnectPoint processFlowClassifier(PortChain portChain, PortPair portPair, NshServicePathId nshSpiId,
-                                              FiveTuple fiveTuple, Objective.Operation type) {
-
-        DeviceId deviceIdfromPortPair = vtnRscService.getSfToSffMaping(VirtualPortId.portId(portPair.ingress()));
-        MacAddress srcMacAddress = virtualPortService.getPort(VirtualPortId.portId(portPair.ingress())).macAddress();
-        Host host = hostService.getHost(HostId.hostId(srcMacAddress));
-        PortNumber port = host.location().port();
-
-        DeviceId deviceId = deviceIdfromPortPair;
-
-        // Vxlan tunnel port for NSH header(Vxlan + NSH).
-        TpPort nshDstPort = TpPort.tpPort(6633);
-
-        FlowClassifierInstallerService flowclassifierinstallerService;
-        // get flow classifiers
-        List<FlowClassifierId> llFlowClassifierList = portChain.flowClassifiers();
-        ListIterator<FlowClassifierId> flowClassifierListIterator = llFlowClassifierList.listIterator();
-
-        while (flowClassifierListIterator.hasNext()) {
-            FlowClassifierId flowclassifierId = flowClassifierListIterator.next();
-            FlowClassifier flowClassifier = flowClassifierService.getFlowClassifier(flowclassifierId);
-
-            if ((flowClassifier.srcPort() != null) && (!flowClassifier.srcPort().portId().isEmpty())) {
-                deviceId = vtnRscService.getSfToSffMaping(flowClassifier.srcPort());
-            }
-
-            // Build Traffic selector.
-            TrafficSelector.Builder selector = packTrafficSelector(flowClassifier, fiveTuple);
-
-            if (fiveTuple == null) {
-                // Send the packet to controller
-                TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
-                treatment.setOutput(PortNumber.CONTROLLER);
-                sendServiceFunctionClassifier(selector, treatment, deviceId, type, flowClassifier.priority());
-            } else if (deviceId.equals(deviceIdfromPortPair)) {
-                // classifier and source device are in the same OVS. So directly send packet to first port pair
-                TrafficTreatment.Builder treatment = packTrafficTreatment(deviceId, port, nshDstPort,
-                                                                          nshSpiId, flowClassifier, true);
-                // Build forwarding objective and send to OVS.
-                sendServiceFunctionClassifier(selector, treatment, deviceId, type, flowClassifier.priority());
-            } else {
-                // classifier and source device are not in the same OVS. Send packet on vlan Tunnel
-                TrafficTreatment.Builder treatment = packTrafficTreatment(deviceId, port, nshDstPort,
-                                                                          nshSpiId, flowClassifier, false);
-                // Build forwarding objective and send to OVS.
-                sendServiceFunctionClassifier(selector, treatment, deviceId, type, flowClassifier.priority());
-
-                // At the other device get the packet from vlan and send to first port pair
-                TrafficSelector.Builder selectorDst = DefaultTrafficSelector.builder();
-                selectorDst.matchVlanId((VlanId.vlanId(Short.parseShort((vtnRscService
-                        .getL3vni(flowClassifier.tenantId()).toString())))));
-                TrafficTreatment.Builder treatmentDst = DefaultTrafficTreatment.builder();
-                Host hostDst = hostService.getHost(HostId.hostId(srcMacAddress));
-                treatmentDst.setOutput(hostDst.location().port());
-                sendServiceFunctionClassifier(selectorDst, treatmentDst, deviceIdfromPortPair, type,
-                                              flowClassifier.priority());
-            }
-        }
-        return host.location();
-    }
-
-    /**
-     * Pack Traffic selector.
-     *
-     * @param flowClassifier flow-classifier
-     * @param fiveTuple five tuple info for the packet
-     * @return traffic selector
-     */
-    public TrafficSelector.Builder packTrafficSelector(FlowClassifier flowClassifier, FiveTuple fiveTuple) {
-
-        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
-
-        if ((flowClassifier.srcIpPrefix() != null) && (flowClassifier.srcIpPrefix().prefixLength() != 0)) {
-            selector.matchIPSrc(flowClassifier.srcIpPrefix());
-        } else if (fiveTuple != null && fiveTuple.ipSrc() != null) {
-            selector.matchIPSrc(IpPrefix.valueOf(fiveTuple.ipSrc(), 24));
-        }
-
-        if ((flowClassifier.dstIpPrefix() != null) && (flowClassifier.dstIpPrefix().prefixLength() != 0)) {
-            selector.matchIPDst(flowClassifier.dstIpPrefix());
-        } else if (fiveTuple != null && fiveTuple.ipDst() != null) {
-            selector.matchIPDst(IpPrefix.valueOf(fiveTuple.ipDst(), 24));
-        }
-
-        if ((flowClassifier.protocol() != null) && (!flowClassifier.protocol().isEmpty())) {
-            if (flowClassifier.protocol().equalsIgnoreCase("TCP")) {
-                selector.add(Criteria.matchIPProtocol(IPv4.PROTOCOL_TCP));
-            } else if (flowClassifier.protocol().equalsIgnoreCase("UDP")) {
-                selector.add(Criteria.matchIPProtocol(IPv4.PROTOCOL_UDP));
-            }
-        } else if (fiveTuple != null && fiveTuple.protocol() != 0) {
-            selector.add(Criteria.matchIPProtocol(fiveTuple.protocol()));
-        }
-
-        if (((flowClassifier.etherType() != null) && (!flowClassifier.etherType().isEmpty()))
-                && (flowClassifier.etherType().equals("IPv4") || flowClassifier.etherType().equals("IPv6"))) {
-            if (flowClassifier.etherType().equals("IPv4")) {
-                selector.matchEthType(Ethernet.TYPE_IPV4);
-            } else {
-                selector.matchEthType(Ethernet.TYPE_IPV6);
-            }
-        }
-
-        if ((flowClassifier.srcPort() != null) && (!flowClassifier.srcPort().portId().isEmpty())) {
-            VirtualPortId vPortId = VirtualPortId.portId(flowClassifier.srcPort().portId());
-            MacAddress macAddress = virtualPortService.getPort(vPortId).macAddress();
-            Host host = hostService.getHost(HostId.hostId(macAddress));
-            selector.matchInPort(host.location().port());
-        }
-
-        // Take the port information from five tuple only when the protocol is TCP.
-        if (fiveTuple != null && fiveTuple.protocol() == IPv4.PROTOCOL_TCP) {
-            selector.matchTcpSrc(TpPort.tpPort((int) fiveTuple.portSrc().toLong()));
-            selector.matchTcpDst(TpPort.tpPort((int) fiveTuple.portDst().toLong()));
-        } else {
-            // For udp packets take the port information from flow classifier
-            List<TpPort> srcPortRange = new LinkedList<>();
-            List<TpPort> dstPortRange = new LinkedList<>();
-            if ((flowClassifier.minSrcPortRange() != 0) && flowClassifier.maxSrcPortRange() != 0
-                    && flowClassifier.minDstPortRange() != 0 && flowClassifier.maxDstPortRange() != 0) {
-
-                for (int port = flowClassifier.minSrcPortRange(); port <= flowClassifier.maxSrcPortRange(); port++) {
-                    srcPortRange.add(TpPort.tpPort(port));
-                }
-                for (int port = flowClassifier.minDstPortRange(); port <= flowClassifier.maxDstPortRange(); port++) {
-                    dstPortRange.add(TpPort.tpPort(port));
-                }
-            }
-
-            for (TpPort inPort : srcPortRange) {
-                selector.matchUdpSrc(inPort);
-            }
-            for (TpPort outPort : dstPortRange) {
-                selector.matchUdpDst(outPort);
-            }
-        }
-        return selector;
-    }
-
-    /**
-     * Pack traffic treatment.
-     *
-     * @param deviceId device id
-     * @param port port number
-     * @param nshDstPort vxlan tunnel port for nsh header
-     * @param nshSpi nsh spi
-     * @param flowClassifier flow-classifier
-     * @param isSameOvs whether the next service function is in same ovs
-     * @return traffic treatment
-     */
-    public TrafficTreatment.Builder packTrafficTreatment(DeviceId deviceId, PortNumber port,
-                                                         TpPort nshDstPort, NshServicePathId nshSpi,
-                                                         FlowClassifier flowClassifier, boolean isSameOvs) {
-
-        TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
-
-        if (isSameOvs) {
-            treatmentBuilder.setOutput(port);
-        } else {
-            treatmentBuilder.setVlanId((VlanId.vlanId(Short.parseShort((vtnRscService
-                    .getL3vni(flowClassifier.tenantId()).toString())))));
-            treatmentBuilder.setUdpDst(nshDstPort);
-        }
-
-        // Set NSH
-        DriverHandler handler = driverService.createHandler(deviceId);
-        ExtensionTreatmentResolver resolver = handler.behaviour(ExtensionTreatmentResolver.class);
-        ExtensionTreatment nspIdTreatment = resolver.getExtensionInstruction(NICIRA_SET_NSH_SPI.type());
-        ExtensionTreatment nsiIdTreatment = resolver.getExtensionInstruction(NICIRA_SET_NSH_SI.type());
-
-        treatmentBuilder.extension(nspIdTreatment, deviceId);
-        treatmentBuilder.extension(nsiIdTreatment, deviceId);
-
-        try {
-            nspIdTreatment.setPropertyValue("nshSpi", nshSpi);
-        } catch (Exception e) {
-            log.error("Failed to get extension instruction to set Nsh Spi Id {}", deviceId);
-        }
-        try {
-            nsiIdTreatment.setPropertyValue("nshSi", NshServiceIndex.of(NSH_SI_ID));
-        } catch (Exception e) {
-            log.error("Failed to get extension instruction to set Nsh Si Id {}", deviceId);
-        }
-
-        return treatmentBuilder;
-    }
-
-    /**
-     * Send service-function-forwarder to OVS.
-     *
-     * @param selector traffic selector
-     * @param treatment traffic treatment
-     * @param deviceId device id
-     * @param type operation type
-     * @param priority priority of classifier
-     */
-    public void sendServiceFunctionClassifier(TrafficSelector.Builder selector, TrafficTreatment.Builder treatment,
-                                              DeviceId deviceId, Objective.Operation type, int priority) {
-        log.info("Sending flow to service function classifier. Selector {}, Treatment {}",
-                 selector.toString(), treatment.toString());
-        ForwardingObjective.Builder objective = DefaultForwardingObjective.builder().withTreatment(treatment.build())
-                .withSelector(selector.build()).fromApp(appId).makePermanent().withFlag(Flag.VERSATILE)
-                .withPriority(priority);
-
-        if (type.equals(Objective.Operation.ADD)) {
-            log.debug("flowClassifierRules-->ADD");
-            flowObjectiveService.forward(deviceId, objective.add());
-        } else {
-            log.debug("flowClassifierRules-->REMOVE");
-            flowObjectiveService.forward(deviceId, objective.remove());
-        }
-    }
-}
diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/impl/SfcFlowRuleInstallerImpl.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/impl/SfcFlowRuleInstallerImpl.java
new file mode 100644
index 0000000..71397a7
--- /dev/null
+++ b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/installer/impl/SfcFlowRuleInstallerImpl.java
@@ -0,0 +1,888 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.sfc.installer.impl;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.net.flow.criteria.ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_ENCAP_ETH_TYPE;
+import static org.onosproject.net.flow.criteria.ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SI;
+import static org.onosproject.net.flow.criteria.ExtensionSelectorType.ExtensionSelectorTypes.NICIRA_MATCH_NSH_SPI;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_ENCAP_ETH_DST;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_ENCAP_ETH_SRC;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_NSH_MDTYPE;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_NSH_NP;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_POP_NSH;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_PUSH_NSH;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_RESUBMIT_TABLE;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_CH1;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_CH2;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_CH3;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_CH4;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_SI;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_NSH_SPI;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST;
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_TUN_GPE_NP;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Set;
+
+import org.onlab.osgi.DefaultServiceDirectory;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.IPv4;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.TpPort;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.NshContextHeader;
+import org.onosproject.net.NshServiceIndex;
+import org.onosproject.net.NshServicePathId;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.behaviour.BridgeConfig;
+import org.onosproject.net.behaviour.ExtensionSelectorResolver;
+import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.criteria.Criteria;
+import org.onosproject.net.flow.criteria.ExtensionSelector;
+import org.onosproject.net.flow.instructions.ExtensionTreatment;
+import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
+import org.onosproject.net.flow.instructions.Instructions;
+import org.onosproject.net.flowobjective.DefaultForwardingObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+import org.onosproject.net.flowobjective.ForwardingObjective.Flag;
+import org.onosproject.net.flowobjective.Objective;
+import org.onosproject.net.host.HostService;
+import org.onosproject.sfc.installer.SfcFlowRuleInstallerService;
+import org.onosproject.vtnrsc.FiveTuple;
+import org.onosproject.vtnrsc.FlowClassifier;
+import org.onosproject.vtnrsc.FlowClassifierId;
+import org.onosproject.vtnrsc.PortChain;
+import org.onosproject.vtnrsc.PortPair;
+import org.onosproject.vtnrsc.PortPairGroup;
+import org.onosproject.vtnrsc.PortPairGroupId;
+import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.SegmentationId;
+import org.onosproject.vtnrsc.VirtualPort;
+import org.onosproject.vtnrsc.VirtualPortId;
+import org.onosproject.vtnrsc.flowclassifier.FlowClassifierService;
+import org.onosproject.vtnrsc.portpair.PortPairService;
+import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
+import org.onosproject.vtnrsc.service.VtnRscService;
+import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
+import org.onosproject.vtnrsc.virtualport.VirtualPortService;
+import org.slf4j.Logger;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+/**
+ * Provides flow classifier installer implementation.
+ */
+public class SfcFlowRuleInstallerImpl implements SfcFlowRuleInstallerService {
+    private final Logger log = getLogger(getClass());
+
+    protected VirtualPortService virtualPortService;
+    protected VtnRscService vtnRscService;
+    protected PortPairService portPairService;
+    protected PortPairGroupService portPairGroupService;
+    protected FlowClassifierService flowClassifierService;
+    protected DriverService driverService;
+    protected DeviceService deviceService;
+    protected HostService hostService;
+    protected TenantNetworkService tenantNetworkService;
+    protected FlowObjectiveService flowObjectiveService;
+    protected ApplicationId appId;
+
+    private static final String PORT_CHAIN_NOT_NULL = "Port-Chain cannot be null";
+    private static final int FLOW_CLASSIFIER_PRIORITY = 0xC738;
+    private static final int DEFAULT_FORWARDER_PRIORITY = 0xD6D8;
+    private static final int ENCAP_OUTPUT_PRIORITY = 0x64;
+    private static final int TUNNEL_SEND_PRIORITY = 0xC8;
+    private static final String SWITCH_CHANNEL_ID = "channelId";
+    private static final int ENCAP_OUTPUT_TABLE = 4;
+    private static final int TUNNEL_SEND_TABLE = 7;
+    private static final short ENCAP_ETH_TYPE = (short) 0x894f;
+    private static final String DEFAULT_IP = "0.0.0.0";
+    private static final String VXLANPORT_HEAD = "vxlan-0.0.0.0";
+
+    /* Port chain params */
+    private short nshSi;
+    List<DeviceId> classifierList;
+    List<DeviceId> forwarderList;
+
+    /**
+     * Default constructor.
+     */
+    public SfcFlowRuleInstallerImpl() {
+    }
+
+    /**
+     * Explicit constructor.
+     *
+     * @param appId application id.
+     */
+    public SfcFlowRuleInstallerImpl(ApplicationId appId) {
+        this.appId = checkNotNull(appId, "ApplicationId can not be null");
+        ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
+        this.flowObjectiveService = serviceDirectory.get(FlowObjectiveService.class);
+        this.driverService = serviceDirectory.get(DriverService.class);
+        this.deviceService = serviceDirectory.get(DeviceService.class);
+        this.hostService = serviceDirectory.get(HostService.class);
+        this.virtualPortService = serviceDirectory.get(VirtualPortService.class);
+        this.vtnRscService = serviceDirectory.get(VtnRscService.class);
+        this.portPairService = serviceDirectory.get(PortPairService.class);
+        this.portPairGroupService = serviceDirectory.get(PortPairGroupService.class);
+        this.flowClassifierService = serviceDirectory.get(FlowClassifierService.class);
+        this.tenantNetworkService = serviceDirectory.get(TenantNetworkService.class);
+        nshSi = 0xff;
+    }
+
+    @Override
+    public ConnectPoint installFlowClassifier(PortChain portChain, NshServicePathId nshSpiId) {
+        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
+        // Get the portPairGroup
+        List<PortPairGroupId> llPortPairGroupIdList = portChain.portPairGroups();
+        ListIterator<PortPairGroupId> portPairGroupIdListIterator = llPortPairGroupIdList.listIterator();
+        PortPairGroupId portPairGroupId = portPairGroupIdListIterator.next();
+        PortPairGroup portPairGroup = portPairGroupService.getPortPairGroup(portPairGroupId);
+        List<PortPairId> llPortPairIdList = portPairGroup.portPairs();
+
+        // Get port pair
+        ListIterator<PortPairId> portPairListIterator = llPortPairIdList.listIterator();
+        PortPairId portPairId = portPairListIterator.next();
+        PortPair portPair = portPairService.getPortPair(portPairId);
+
+        return installSfcClassifierRules(portChain, portPair, nshSpiId, null, Objective.Operation.ADD);
+    }
+
+    @Override
+    public ConnectPoint unInstallFlowClassifier(PortChain portChain, NshServicePathId nshSpiId) {
+        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
+        // Get the portPairGroup
+        List<PortPairGroupId> llPortPairGroupIdList = portChain.portPairGroups();
+        ListIterator<PortPairGroupId> portPairGroupIdListIterator = llPortPairGroupIdList.listIterator();
+        PortPairGroupId portPairGroupId = portPairGroupIdListIterator.next();
+        PortPairGroup portPairGroup = portPairGroupService.getPortPairGroup(portPairGroupId);
+        List<PortPairId> llPortPairIdList = portPairGroup.portPairs();
+
+        // Get port pair
+        ListIterator<PortPairId> portPairListIterator = llPortPairIdList.listIterator();
+        PortPairId portPairId = portPairListIterator.next();
+        PortPair portPair = portPairService.getPortPair(portPairId);
+
+        return installSfcClassifierRules(portChain, portPair, nshSpiId, null, Objective.Operation.REMOVE);
+    }
+
+    @Override
+    public ConnectPoint installLoadBalancedFlowRules(PortChain portChain, FiveTuple fiveTuple,
+            NshServicePathId nshSpiId) {
+        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
+
+        return installSfcFlowRules(portChain, fiveTuple, nshSpiId, Objective.Operation.ADD);
+    }
+
+    @Override
+    public ConnectPoint unInstallLoadBalancedFlowRules(PortChain portChain, FiveTuple fiveTuple,
+            NshServicePathId nshSpiId) {
+        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
+        return installSfcFlowRules(portChain, fiveTuple, nshSpiId, Objective.Operation.REMOVE);
+    }
+
+    public ConnectPoint installSfcFlowRules(PortChain portChain, FiveTuple fiveTuple, NshServicePathId nshSpiId,
+            Objective.Operation type) {
+        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
+
+        classifierList = Lists.newArrayList();
+        forwarderList = Lists.newArrayList();
+
+        // Get the load balanced path
+        List<PortPairId> portPairs = portChain.getLoadBalancePath(fiveTuple);
+
+        // Get the first port pair
+        ListIterator<PortPairId> portPairListIterator = portPairs.listIterator();
+        PortPairId portPairId = portPairListIterator.next();
+        PortPair currentPortPair = portPairService.getPortPair(portPairId);
+
+        ConnectPoint connectPoint = installSfcClassifierRules(portChain, currentPortPair, nshSpiId, fiveTuple, type);
+
+        log.info("Installing encap and output for first port pair");
+
+        installSfcEncapOutputRule(currentPortPair, nshSpiId, type);
+
+        PortPair nextPortPair;
+        while (portPairListIterator.hasNext()) {
+            portPairId = portPairListIterator.next();
+            nextPortPair = portPairService.getPortPair(portPairId);
+            installSfcForwardRule(currentPortPair, nextPortPair, nshSpiId, type);
+            installSfcEncapOutputRule(nextPortPair, nshSpiId, type);
+            currentPortPair = nextPortPair;
+        }
+        installSfcEndRule(currentPortPair, nshSpiId, type);
+
+        if (type.equals(Objective.Operation.ADD)) {
+            portChain.addSfcClassifiers(portChain.getLoadBalanceId(fiveTuple), classifierList);
+            portChain.addSfcForwarders(portChain.getLoadBalanceId(fiveTuple), forwarderList);
+        } else {
+            portChain.removeSfcClassifiers(portChain.getLoadBalanceId(fiveTuple), classifierList);
+            portChain.removeSfcForwarders(portChain.getLoadBalanceId(fiveTuple), forwarderList);
+        }
+        return connectPoint;
+    }
+
+    public void installSfcTunnelReceiveRule(DeviceId deviceId, NshServicePathId nshSpiId, Objective.Operation type) {
+
+        DriverHandler handler = driverService.createHandler(deviceId);
+        ExtensionSelectorResolver selectorResolver = handler.behaviour(ExtensionSelectorResolver.class);
+        ExtensionSelector nshSpiSelector = selectorResolver.getExtensionSelector(NICIRA_MATCH_NSH_SPI.type());
+        ExtensionSelector nshSiSelector = selectorResolver.getExtensionSelector(NICIRA_MATCH_NSH_SI.type());
+
+        try {
+            nshSpiSelector.setPropertyValue("nshSpi", nshSpiId);
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Spi Id for end rule {}", e.getMessage());
+        }
+        try {
+            nshSiSelector.setPropertyValue("nshSi", NshServiceIndex.of(nshSi));
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Si Id for end rule {}", e.getMessage());
+        }
+
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+        selector.extension(nshSpiSelector, deviceId);
+        selector.extension(nshSiSelector, deviceId);
+
+        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+        treatment.transition(ENCAP_OUTPUT_TABLE);
+
+        sendSfcRule(selector, treatment, deviceId, type, DEFAULT_FORWARDER_PRIORITY);
+    }
+
+    public void installSfcTunnelSendRule(DeviceId deviceId, NshServicePathId nshSpiId, Objective.Operation type) {
+
+        // Prepare selector with nsp, nsi and inport from egress of port pair
+        DriverHandler handler = driverService.createHandler(deviceId);
+        ExtensionSelectorResolver selectorResolver = handler.behaviour(ExtensionSelectorResolver.class);
+        ExtensionSelector nshSpiSelector = selectorResolver.getExtensionSelector(NICIRA_MATCH_NSH_SPI.type());
+        ExtensionSelector nshSiSelector = selectorResolver.getExtensionSelector(NICIRA_MATCH_NSH_SI.type());
+        ExtensionSelector encapEthTypeSelector = selectorResolver.getExtensionSelector(NICIRA_MATCH_ENCAP_ETH_TYPE
+                                                                                       .type());
+        try {
+            nshSpiSelector.setPropertyValue("nshSpi", nshSpiId);
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Spi Id for end rule {}", e.getMessage());
+        }
+        try {
+            nshSiSelector.setPropertyValue("nshSi", NshServiceIndex.of(nshSi));
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Si Id for end rule {}", e.getMessage());
+        }
+        try {
+            encapEthTypeSelector.setPropertyValue("encapEthType", ENCAP_ETH_TYPE);
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match encapEthType {}", deviceId);
+        }
+
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+        selector.extension(nshSpiSelector, deviceId);
+        selector.extension(nshSiSelector, deviceId);
+
+        ExtensionTreatmentResolver treatmentResolver = handler.behaviour(ExtensionTreatmentResolver.class);
+        ExtensionTreatment tunGpeNpTreatment = treatmentResolver.getExtensionInstruction(NICIRA_TUN_GPE_NP.type());
+        try {
+            tunGpeNpTreatment.setPropertyValue("tunGpeNp", ((byte) 4));
+        } catch (Exception e) {
+            log.error("Failed to get extension instruction to set tunGpeNp {}", deviceId);
+        }
+
+        ExtensionTreatment moveC1ToC1 = treatmentResolver
+                .getExtensionInstruction(ExtensionTreatmentType.ExtensionTreatmentTypes
+                                         .NICIRA_MOV_NSH_C1_TO_C1.type());
+
+        ExtensionTreatment moveC2ToC2 = treatmentResolver
+                .getExtensionInstruction(ExtensionTreatmentType.ExtensionTreatmentTypes
+                                         .NICIRA_MOV_NSH_C2_TO_C2.type());
+
+        ExtensionTreatment moveC3ToC3 = treatmentResolver
+                .getExtensionInstruction(ExtensionTreatmentType.ExtensionTreatmentTypes
+                                         .NICIRA_MOV_NSH_C3_TO_C3.type());
+
+        ExtensionTreatment moveC4ToC4 = treatmentResolver
+                .getExtensionInstruction(ExtensionTreatmentType.ExtensionTreatmentTypes
+                                         .NICIRA_MOV_NSH_C4_TO_C4.type());
+
+        ExtensionTreatment moveTunIpv4DstToTunIpv4Dst = treatmentResolver
+                .getExtensionInstruction(ExtensionTreatmentType.ExtensionTreatmentTypes
+                                         .NICIRA_MOV_TUN_IPV4_DST_TO_TUN_IPV4_DST.type());
+
+        ExtensionTreatment moveTunIdToTunId = treatmentResolver
+                .getExtensionInstruction(ExtensionTreatmentType.ExtensionTreatmentTypes
+                                         .NICIRA_MOV_TUN_ID_TO_TUN_ID.type());
+
+        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+        treatment.extension(tunGpeNpTreatment, deviceId);
+        treatment.extension(moveC1ToC1, deviceId);
+        treatment.extension(moveC2ToC2, deviceId);
+        treatment.extension(moveC3ToC3, deviceId);
+        treatment.extension(moveC4ToC4, deviceId);
+        treatment.extension(moveTunIpv4DstToTunIpv4Dst, deviceId);
+        treatment.extension(moveTunIdToTunId, deviceId);
+
+        Iterable<Device> devices = deviceService.getAvailableDevices();
+        DeviceId localControllerId = getControllerId(deviceService.getDevice(deviceId), devices);
+        DriverHandler controllerHandler = driverService.createHandler(localControllerId);
+
+        BridgeConfig bridgeConfig = controllerHandler.behaviour(BridgeConfig.class);
+        Set<PortNumber> ports = bridgeConfig.getPortNumbers();
+        String tunnelName = "vxlan-" + DEFAULT_IP;
+        ports.stream()
+        .filter(p ->p.name().equalsIgnoreCase(tunnelName))
+        .forEach(p -> {
+            treatment.setOutput(p);
+            sendSfcRule(selector, treatment, deviceId, type, TUNNEL_SEND_PRIORITY);
+        });
+    }
+
+    public void installSfcEndRule(PortPair portPair, NshServicePathId nshSpiId, Objective.Operation type) {
+        DeviceId deviceId = vtnRscService.getSfToSffMaping(VirtualPortId.portId(portPair.egress()));
+        MacAddress srcMacAddress = virtualPortService.getPort(VirtualPortId.portId(portPair.egress())).macAddress();
+        Host host = hostService.getHost(HostId.hostId(srcMacAddress));
+        PortNumber port = host.location().port();
+
+        // Prepare selector with nsp, nsi and inport from egress of port pair
+        DriverHandler handler = driverService.createHandler(deviceId);
+        ExtensionSelectorResolver selectorResolver = handler.behaviour(ExtensionSelectorResolver.class);
+        ExtensionSelector nshSpiSelector = selectorResolver.getExtensionSelector(NICIRA_MATCH_NSH_SPI.type());
+        ExtensionSelector nshSiSelector = selectorResolver.getExtensionSelector(NICIRA_MATCH_NSH_SI.type());
+        ExtensionSelector encapEthTypeSelector = selectorResolver.getExtensionSelector(NICIRA_MATCH_ENCAP_ETH_TYPE
+                .type());
+        try {
+            nshSpiSelector.setPropertyValue("nshSpi", nshSpiId);
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Spi Id for end rule {}", e.getMessage());
+        }
+        // Decrement the SI
+        nshSi = (short) (nshSi - 1);
+        try {
+            nshSiSelector.setPropertyValue("nshSi", NshServiceIndex.of(nshSi));
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Si Id for end rule {}", e.getMessage());
+        }
+        try {
+            encapEthTypeSelector.setPropertyValue("encapEthType", ENCAP_ETH_TYPE);
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match encapEthType {}", deviceId);
+        }
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+        selector.extension(encapEthTypeSelector, deviceId);
+        selector.extension(nshSpiSelector, deviceId);
+        selector.extension(nshSiSelector, deviceId);
+        selector.matchInPort(port);
+
+        // Set treatment to pop nsh header, set tunnel id and resubmit to table
+        // 0.
+        ExtensionTreatmentResolver treatmentResolver = handler.behaviour(ExtensionTreatmentResolver.class);
+        ExtensionTreatment popNshTreatment = treatmentResolver.getExtensionInstruction(NICIRA_POP_NSH.type());
+
+        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+        treatment.extension(popNshTreatment, deviceId);
+
+        VirtualPort virtualPort = virtualPortService.getPort(VirtualPortId.portId(portPair.ingress()));
+        SegmentationId segmentationId = tenantNetworkService.getNetwork(virtualPort.networkId()).segmentationId();
+        treatment.add(Instructions.modTunnelId(Long.parseLong(segmentationId.toString())));
+
+        ExtensionTreatment resubmitTableTreatment = treatmentResolver.getExtensionInstruction(NICIRA_RESUBMIT_TABLE
+                .type());
+
+        PortNumber vxlanPortNumber = getVxlanPortNumber(deviceId);
+
+        try {
+            resubmitTableTreatment.setPropertyValue("inPort", vxlanPortNumber);
+        } catch (Exception e) {
+            log.error("Failed to set extension treatment for resubmit table in port {}", deviceId);
+        }
+        try {
+            resubmitTableTreatment.setPropertyValue("table", ((short) 0));
+        } catch (Exception e) {
+            log.error("Failed to set extension treatment for resubmit table {}", deviceId);
+        }
+        treatment.extension(resubmitTableTreatment, deviceId);
+
+        sendSfcRule(selector, treatment, deviceId, type, DEFAULT_FORWARDER_PRIORITY);
+    }
+
+    public void installSfcForwardRule(PortPair portPair, PortPair nextPortPair, NshServicePathId nshSpiId,
+            Objective.Operation type) {
+        DeviceId deviceId = vtnRscService.getSfToSffMaping(VirtualPortId.portId(portPair.egress()));
+        MacAddress srcMacAddress = virtualPortService.getPort(VirtualPortId.portId(portPair.egress())).macAddress();
+        Host host = hostService.getHost(HostId.hostId(srcMacAddress));
+        PortNumber port = host.location().port();
+
+        DriverHandler handler = driverService.createHandler(deviceId);
+        ExtensionSelectorResolver resolver = handler.behaviour(ExtensionSelectorResolver.class);
+
+        // Prepare selector with nsp, nsi and inport from egress of port pair
+        ExtensionSelector nshSpiSelector = resolver.getExtensionSelector(NICIRA_MATCH_NSH_SPI.type());
+        ExtensionSelector nshSiSelector = resolver.getExtensionSelector(NICIRA_MATCH_NSH_SI.type());
+        try {
+            nshSpiSelector.setPropertyValue("nshSpi", nshSpiId);
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Spi Id for forward rule {}", e.getMessage());
+        }
+        // Decrement the SI
+        nshSi = (short) (nshSi - 1);
+        try {
+            nshSiSelector.setPropertyValue("nshSi", NshServiceIndex.of(nshSi));
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Si Id for forward rule {}", e.getMessage());
+        }
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+        selector.extension(nshSpiSelector, deviceId);
+        selector.extension(nshSiSelector, deviceId);
+        selector.matchInPort(port);
+
+        DeviceId nextDeviceId = vtnRscService.getSfToSffMaping(VirtualPortId.portId(nextPortPair.ingress()));
+        if (deviceId.equals(nextDeviceId)) {
+
+            // Treatment with transition
+            TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+            treatment.transition(ENCAP_OUTPUT_TABLE);
+
+            sendSfcRule(selector, treatment, deviceId, type, DEFAULT_FORWARDER_PRIORITY);
+        } else {
+            // Treatment with with transition to send on tunnel
+            ExtensionTreatmentResolver treatmentResolver = handler.behaviour(ExtensionTreatmentResolver.class);
+            ExtensionTreatment moveC2ToTunId = treatmentResolver
+                    .getExtensionInstruction(ExtensionTreatmentType.ExtensionTreatmentTypes
+                                             .NICIRA_MOV_NSH_C2_TO_TUN_ID.type());
+
+            Device remoteDevice = deviceService.getDevice(nextDeviceId);
+            String url = remoteDevice.annotations().value(SWITCH_CHANNEL_ID);
+            String remoteControllerIp = url.substring(0, url.lastIndexOf(":"));
+            if (remoteControllerIp == null) {
+                log.error("Can't find remote controller of device: {}", nextDeviceId.toString());
+                return;
+            }
+
+            ExtensionTreatment tunnelDsttreatment = treatmentResolver.getExtensionInstruction(NICIRA_SET_TUNNEL_DST
+                                                                                              .type());
+            try {
+                tunnelDsttreatment.setPropertyValue("tunnelDst", Ip4Address.valueOf(remoteControllerIp));
+            } catch (Exception e) {
+                log.error("Failed to get extension instruction to set tunnel dst {}", deviceId);
+            }
+
+            TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+            treatment.extension(moveC2ToTunId, deviceId);
+            treatment.extension(tunnelDsttreatment, deviceId);
+            treatment.transition(TUNNEL_SEND_TABLE);
+
+            sendSfcRule(selector, treatment, deviceId, type, DEFAULT_FORWARDER_PRIORITY);
+
+            installSfcTunnelSendRule(deviceId, nshSpiId, type);
+            installSfcTunnelReceiveRule(nextDeviceId, nshSpiId, type);
+        }
+    }
+
+    public void installSfcEncapOutputRule(PortPair portPair, NshServicePathId nshSpiId, Objective.Operation type) {
+
+        DeviceId deviceId = vtnRscService.getSfToSffMaping(VirtualPortId.portId(portPair.ingress()));
+        MacAddress srcMacAddress = virtualPortService.getPort(VirtualPortId.portId(portPair.ingress())).macAddress();
+        Host host = hostService.getHost(HostId.hostId(srcMacAddress));
+        PortNumber port = host.location().port();
+
+        DriverHandler handler = driverService.createHandler(deviceId);
+        ExtensionSelectorResolver resolver = handler.behaviour(ExtensionSelectorResolver.class);
+
+        // Prepare selector with nsp, nsi and encap eth type
+        ExtensionSelector nshSpiSelector = resolver.getExtensionSelector(NICIRA_MATCH_NSH_SPI.type());
+        ExtensionSelector nshSiSelector = resolver.getExtensionSelector(NICIRA_MATCH_NSH_SI.type());
+        ExtensionSelector nshEncapEthTypeSelector = resolver.getExtensionSelector(NICIRA_MATCH_ENCAP_ETH_TYPE.type());
+
+        try {
+            nshSpiSelector.setPropertyValue("nshSpi", nshSpiId);
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Spi Id for encap rule {}", e.getMessage());
+        }
+        try {
+            nshSiSelector.setPropertyValue("nshSi", NshServiceIndex.of(nshSi));
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Si Id for encap rule {}", e.getMessage());
+        }
+        try {
+            nshEncapEthTypeSelector.setPropertyValue("encapEthType", ENCAP_ETH_TYPE);
+        } catch (Exception e) {
+            log.error("Failed to set extension selector to match Nsh Si Id {}", deviceId);
+        }
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+        selector.extension(nshSpiSelector, deviceId);
+        selector.extension(nshSiSelector, deviceId);
+
+        ExtensionTreatmentResolver treatmentResolver = handler.behaviour(ExtensionTreatmentResolver.class);
+        ExtensionTreatment encapEthSrcTreatment = treatmentResolver
+                .getExtensionInstruction(NICIRA_ENCAP_ETH_SRC.type());
+        ExtensionTreatment encapEthDstTreatment = treatmentResolver
+                .getExtensionInstruction(NICIRA_ENCAP_ETH_DST.type());
+
+        try {
+            encapEthDstTreatment.setPropertyValue("encapEthDst", srcMacAddress);
+        } catch (Exception e) {
+            log.error("Failed to set extension treatment to set encap eth dst {}", deviceId);
+        }
+        // TODO: move from packet source mac address
+        try {
+            encapEthSrcTreatment.setPropertyValue("encapEthSrc", srcMacAddress);
+        } catch (Exception e) {
+            log.error("Failed to set extension treatment to set encap eth src {}", deviceId);
+        }
+
+        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+        treatment.extension(encapEthSrcTreatment, deviceId);
+        treatment.extension(encapEthDstTreatment, deviceId);
+        treatment.setOutput(port);
+
+        sendSfcRule(selector, treatment, deviceId, type, ENCAP_OUTPUT_PRIORITY);
+        forwarderList.add(deviceId);
+    }
+
+    public ConnectPoint installSfcClassifierRules(PortChain portChain, PortPair portPair, NshServicePathId nshSpiId,
+            FiveTuple fiveTuple, Objective.Operation type) {
+
+        DeviceId deviceIdfromPortPair = vtnRscService.getSfToSffMaping(VirtualPortId.portId(portPair.ingress()));
+        MacAddress srcMacAddress = virtualPortService.getPort(VirtualPortId.portId(portPair.ingress())).macAddress();
+        VirtualPort virtualPort = virtualPortService.getPort(VirtualPortId.portId(portPair.ingress()));
+        Host host = hostService.getHost(HostId.hostId(srcMacAddress));
+        PortNumber port = host.location().port();
+
+        DeviceId deviceId = deviceIdfromPortPair;
+
+        // get flow classifiers
+        List<FlowClassifierId> llFlowClassifierList = portChain.flowClassifiers();
+        ListIterator<FlowClassifierId> flowClassifierListIterator = llFlowClassifierList.listIterator();
+
+        while (flowClassifierListIterator.hasNext()) {
+            FlowClassifierId flowclassifierId = flowClassifierListIterator.next();
+            FlowClassifier flowClassifier = flowClassifierService.getFlowClassifier(flowclassifierId);
+
+            if ((flowClassifier.srcPort() != null) && (!flowClassifier.srcPort().portId().isEmpty())) {
+                deviceId = vtnRscService.getSfToSffMaping(flowClassifier.srcPort());
+            }
+
+            // Build Traffic selector.
+            TrafficSelector.Builder selector = packClassifierSelector(flowClassifier, fiveTuple);
+
+            if (fiveTuple == null) {
+                // Send the packet to controller
+                log.info("Downloading rule to send packet to controller");
+                TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+                treatment.setOutput(PortNumber.CONTROLLER);
+                sendSfcRule(selector, treatment, deviceId, type, FLOW_CLASSIFIER_PRIORITY);
+                continue;
+            }
+
+            if (deviceId != null && !deviceId.equals(deviceIdfromPortPair)) {
+                // First SF is in another device. Set tunnel ipv4 destination to
+                // treatment
+                Device remoteDevice = deviceService.getDevice(deviceIdfromPortPair);
+                String url = remoteDevice.annotations().value(SWITCH_CHANNEL_ID);
+                String remoteControllerIp = url.substring(0, url.lastIndexOf(":"));
+                if (remoteControllerIp == null) {
+                    log.error("Can't find remote controller of device: {}", deviceIdfromPortPair.toString());
+                    return null;
+                }
+
+                DriverHandler handler = driverService.createHandler(deviceId);
+                ExtensionTreatmentResolver resolver = handler.behaviour(ExtensionTreatmentResolver.class);
+                ExtensionTreatment tunnelDsttreatment = resolver.getExtensionInstruction(NICIRA_SET_TUNNEL_DST.type());
+                try {
+                    tunnelDsttreatment.setPropertyValue("tunnelDst", Ip4Address.valueOf(remoteControllerIp));
+                } catch (Exception e) {
+                    log.error("Failed to get extension instruction to set tunnel dst {}", deviceId);
+                }
+
+                TrafficTreatment.Builder treatment = packClassifierTreatment(deviceId, virtualPort, port,
+                                                                             nshSpiId, flowClassifier);
+                treatment.extension(tunnelDsttreatment, deviceId);
+                treatment.transition(TUNNEL_SEND_TABLE);
+                sendSfcRule(selector, treatment, deviceId, type, flowClassifier.priority());
+                classifierList.add(deviceIdfromPortPair);
+
+                installSfcTunnelSendRule(deviceId, nshSpiId, type);
+                installSfcTunnelReceiveRule(deviceIdfromPortPair, nshSpiId, type);
+
+            } else {
+                // classifier and port pair are in the same OVS. So directly
+                // send packet to first port pair
+                TrafficTreatment.Builder treatment = packClassifierTreatment(deviceIdfromPortPair, virtualPort, port,
+                                                                             nshSpiId, flowClassifier);
+                treatment.transition(ENCAP_OUTPUT_TABLE);
+                sendSfcRule(selector, treatment, deviceIdfromPortPair, type, flowClassifier.priority());
+                classifierList.add(deviceIdfromPortPair);
+            }
+        }
+
+        return host.location();
+    }
+
+    /**
+     * Pack Traffic selector.
+     *
+     * @param flowClassifier flow-classifier
+     * @param fiveTuple five tuple info for the packet
+     * @return traffic selector
+     */
+    public TrafficSelector.Builder packClassifierSelector(FlowClassifier flowClassifier, FiveTuple fiveTuple) {
+
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+
+        if ((flowClassifier.srcIpPrefix() != null) && (flowClassifier.srcIpPrefix().prefixLength() != 0)) {
+            selector.matchIPSrc(flowClassifier.srcIpPrefix());
+        } else if (fiveTuple != null && fiveTuple.ipSrc() != null) {
+            selector.matchIPSrc(IpPrefix.valueOf(fiveTuple.ipSrc(), 24));
+        }
+
+        if ((flowClassifier.dstIpPrefix() != null) && (flowClassifier.dstIpPrefix().prefixLength() != 0)) {
+            selector.matchIPDst(flowClassifier.dstIpPrefix());
+        } else if (fiveTuple != null && fiveTuple.ipDst() != null) {
+            selector.matchIPDst(IpPrefix.valueOf(fiveTuple.ipDst(), 24));
+        }
+
+        if ((flowClassifier.protocol() != null) && (!flowClassifier.protocol().isEmpty())) {
+            if (flowClassifier.protocol().equalsIgnoreCase("TCP")) {
+                selector.add(Criteria.matchIPProtocol(IPv4.PROTOCOL_TCP));
+            } else if (flowClassifier.protocol().equalsIgnoreCase("UDP")) {
+                selector.add(Criteria.matchIPProtocol(IPv4.PROTOCOL_UDP));
+            } else if (flowClassifier.protocol().equalsIgnoreCase("ICMP")) {
+                selector.add(Criteria.matchIPProtocol(IPv4.PROTOCOL_ICMP));
+            }
+        } else if (fiveTuple != null && fiveTuple.protocol() != 0) {
+            selector.add(Criteria.matchIPProtocol(fiveTuple.protocol()));
+        }
+
+        if (((flowClassifier.etherType() != null) && (!flowClassifier.etherType().isEmpty()))
+                && (flowClassifier.etherType().equals("IPv4") || flowClassifier.etherType().equals("IPv6"))) {
+            if (flowClassifier.etherType().equals("IPv4")) {
+                selector.matchEthType(Ethernet.TYPE_IPV4);
+            } else {
+                selector.matchEthType(Ethernet.TYPE_IPV6);
+            }
+        }
+
+        if ((flowClassifier.srcPort() != null) && (!flowClassifier.srcPort().portId().isEmpty())) {
+            VirtualPortId vPortId = VirtualPortId.portId(flowClassifier.srcPort().portId());
+            MacAddress macAddress = virtualPortService.getPort(vPortId).macAddress();
+            Host host = hostService.getHost(HostId.hostId(macAddress));
+            selector.matchInPort(host.location().port());
+        }
+
+        // Take the port information from five tuple only when the protocol is
+        // TCP.
+        if (fiveTuple != null && fiveTuple.protocol() == IPv4.PROTOCOL_TCP) {
+            selector.matchTcpSrc(TpPort.tpPort((int) fiveTuple.portSrc().toLong()));
+            selector.matchTcpDst(TpPort.tpPort((int) fiveTuple.portDst().toLong()));
+        } else {
+            // For udp packets take the port information from flow classifier
+            List<TpPort> srcPortRange = new LinkedList<>();
+            List<TpPort> dstPortRange = new LinkedList<>();
+            if ((flowClassifier.minSrcPortRange() != 0) && flowClassifier.maxSrcPortRange() != 0
+                    && flowClassifier.minDstPortRange() != 0 && flowClassifier.maxDstPortRange() != 0) {
+
+                for (int port = flowClassifier.minSrcPortRange(); port <= flowClassifier.maxSrcPortRange(); port++) {
+                    srcPortRange.add(TpPort.tpPort(port));
+                }
+                for (int port = flowClassifier.minDstPortRange(); port <= flowClassifier.maxDstPortRange(); port++) {
+                    dstPortRange.add(TpPort.tpPort(port));
+                }
+            }
+
+            for (TpPort inPort : srcPortRange) {
+                selector.matchUdpSrc(inPort);
+            }
+            for (TpPort outPort : dstPortRange) {
+                selector.matchUdpDst(outPort);
+            }
+        }
+        return selector;
+    }
+
+    /**
+     * Pack traffic treatment.
+     *
+     * @param deviceId device id
+     * @param virtualPort virtual port
+     * @param port port number
+     * @param nshSpi nsh spi
+     * @param flowClassifier flow-classifier
+     * @return traffic treatment
+     */
+    public TrafficTreatment.Builder packClassifierTreatment(DeviceId deviceId, VirtualPort virtualPort,
+            PortNumber port, NshServicePathId nshSpi, FlowClassifier flowClassifier) {
+
+        TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
+
+        // set tunnel id
+        SegmentationId segmentationId = tenantNetworkService.getNetwork(virtualPort.networkId()).segmentationId();
+        treatmentBuilder.add(Instructions.modTunnelId(Long.parseLong(segmentationId.toString())));
+
+        // Set all NSH header fields
+        DriverHandler handler = driverService.createHandler(deviceId);
+        ExtensionTreatmentResolver resolver = handler.behaviour(ExtensionTreatmentResolver.class);
+        ExtensionTreatment nspIdTreatment = resolver.getExtensionInstruction(NICIRA_SET_NSH_SPI.type());
+        ExtensionTreatment nsiIdTreatment = resolver.getExtensionInstruction(NICIRA_SET_NSH_SI.type());
+        ExtensionTreatment pushNshTreatment = resolver.getExtensionInstruction(NICIRA_PUSH_NSH.type());
+
+        ExtensionTreatment nshCh1Treatment = resolver.getExtensionInstruction(NICIRA_SET_NSH_CH1.type());
+        ExtensionTreatment nshCh2Treatment = resolver.getExtensionInstruction(NICIRA_SET_NSH_CH2.type());
+        ExtensionTreatment nshCh3Treatment = resolver.getExtensionInstruction(NICIRA_SET_NSH_CH3.type());
+        ExtensionTreatment nshCh4Treatment = resolver.getExtensionInstruction(NICIRA_SET_NSH_CH4.type());
+        ExtensionTreatment nshMdTypeTreatment = resolver.getExtensionInstruction(NICIRA_NSH_MDTYPE.type());
+        ExtensionTreatment nshNpTreatment = resolver.getExtensionInstruction(NICIRA_NSH_NP.type());
+
+        try {
+            nshMdTypeTreatment.setPropertyValue("nshMdType", ((byte) 1));
+        } catch (Exception e) {
+            log.error("Failed to get extension instruction to set nshMdType {}", deviceId);
+        }
+        try {
+            nshNpTreatment.setPropertyValue("nshNp", ((byte) 3));
+        } catch (Exception e) {
+            log.error("Failed to get extension instruction to set nshNp {}", deviceId);
+        }
+        try {
+            nspIdTreatment.setPropertyValue("nshSpi", nshSpi);
+        } catch (Exception e) {
+            log.error("Failed to get extension instruction to set Nsh Spi Id {}", deviceId);
+        }
+        try {
+            nsiIdTreatment.setPropertyValue("nshSi", NshServiceIndex.of(nshSi));
+        } catch (Exception e) {
+            log.error("Failed to get extension instruction to set Nsh Si Id {}", deviceId);
+        }
+        try {
+            nshCh1Treatment.setPropertyValue("nshCh", NshContextHeader.of(1));
+        } catch (Exception e) {
+            log.error("Failed to get extension instruction to set NshCh1 {}", deviceId);
+        }
+        try {
+            nshCh2Treatment.setPropertyValue("nshCh", NshContextHeader.of(Integer.parseInt(segmentationId.toString())));
+        } catch (Exception e) {
+            log.error("Failed to get extension instruction to set NshCh2 {}", deviceId);
+        }
+        try {
+            nshCh3Treatment.setPropertyValue("nshCh", NshContextHeader.of(3));
+        } catch (Exception e) {
+            log.error("Failed to get extension instruction to set NshCh3 {}", deviceId);
+        }
+        try {
+            nshCh4Treatment.setPropertyValue("nshCh", NshContextHeader.of(4));
+        } catch (Exception e) {
+            log.error("Failed to get extension instruction to set NshCh4 {}", deviceId);
+        }
+        treatmentBuilder.extension(pushNshTreatment, deviceId);
+        treatmentBuilder.extension(nshMdTypeTreatment, deviceId);
+        treatmentBuilder.extension(nshNpTreatment, deviceId);
+        treatmentBuilder.extension(nspIdTreatment, deviceId);
+        treatmentBuilder.extension(nsiIdTreatment, deviceId);
+        treatmentBuilder.extension(nshCh1Treatment, deviceId);
+        treatmentBuilder.extension(nshCh2Treatment, deviceId);
+        treatmentBuilder.extension(nshCh3Treatment, deviceId);
+        treatmentBuilder.extension(nshCh4Treatment, deviceId);
+
+        return treatmentBuilder;
+    }
+
+    /**
+     * Get the ControllerId from the device .
+     *
+     * @param device Device
+     * @param devices Devices
+     * @return Controller Id
+     */
+    public DeviceId getControllerId(Device device, Iterable<Device> devices) {
+        for (Device d : devices) {
+            if (d.type() == Device.Type.CONTROLLER && d.id().toString()
+                    .contains(getControllerIpOfSwitch(device))) {
+                return d.id();
+            }
+        }
+        log.info("Can not find controller for device : {}", device.id());
+        return null;
+    }
+
+    /**
+     * Get the ControllerIp from the device .
+     *
+     * @param device Device
+     * @return Controller Ip
+     */
+    public String getControllerIpOfSwitch(Device device) {
+        String url = device.annotations().value(SWITCH_CHANNEL_ID);
+        return url.substring(0, url.lastIndexOf(":"));
+    }
+
+    /**
+     * Send service-function-forwarder to OVS.
+     *
+     * @param selector traffic selector
+     * @param treatment traffic treatment
+     * @param deviceId device id
+     * @param type operation type
+     * @param priority priority of classifier
+     */
+    public void sendSfcRule(TrafficSelector.Builder selector, TrafficTreatment.Builder treatment, DeviceId deviceId,
+            Objective.Operation type, int priority) {
+
+        log.info("Sending sfc flow rule. Selector {}, Treatment {}", selector.toString(),
+                 treatment.toString());
+        ForwardingObjective.Builder objective = DefaultForwardingObjective.builder().withTreatment(treatment.build())
+                .withSelector(selector.build()).fromApp(appId).makePermanent().withFlag(Flag.VERSATILE)
+                .withPriority(priority);
+
+        if (type.equals(Objective.Operation.ADD)) {
+            log.debug("flowClassifierRules-->ADD");
+            flowObjectiveService.forward(deviceId, objective.add());
+        } else {
+            log.debug("flowClassifierRules-->REMOVE");
+            flowObjectiveService.forward(deviceId, objective.remove());
+        }
+    }
+
+    private PortNumber getVxlanPortNumber(DeviceId deviceId) {
+        Iterable<Port> ports = deviceService.getPorts(deviceId);
+        Port vxlanPort = Sets.newHashSet(ports).stream()
+                .filter(p ->!p.number().equals(PortNumber.LOCAL))
+                .filter(p ->p.annotations().value(AnnotationKeys.PORT_NAME)
+                        .startsWith(VXLANPORT_HEAD))
+                .findFirst().get();
+        return vxlanPort.number();
+    }
+}
diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/manager/impl/SfcManager.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/manager/impl/SfcManager.java
index 0d7702c..3292e23 100644
--- a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/manager/impl/SfcManager.java
+++ b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/manager/impl/SfcManager.java
@@ -20,8 +20,9 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Optional;
+import java.util.ListIterator;
 import java.util.Set;
+import java.util.UUID;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -50,10 +51,7 @@
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketService;
-import org.onosproject.sfc.forwarder.ServiceFunctionForwarderService;
-import org.onosproject.sfc.forwarder.impl.ServiceFunctionForwarderImpl;
-import org.onosproject.sfc.installer.FlowClassifierInstallerService;
-import org.onosproject.sfc.installer.impl.FlowClassifierInstallerImpl;
+import org.onosproject.sfc.installer.impl.SfcFlowRuleInstallerImpl;
 import org.onosproject.sfc.manager.SfcService;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.DistributedSet;
@@ -77,7 +75,6 @@
 import org.onosproject.vtnrsc.VirtualPort;
 import org.onosproject.vtnrsc.VirtualPortId;
 import org.onosproject.vtnrsc.event.VtnRscEvent;
-import org.onosproject.vtnrsc.event.VtnRscEventFeedback;
 import org.onosproject.vtnrsc.event.VtnRscListener;
 import org.onosproject.vtnrsc.flowclassifier.FlowClassifierService;
 import org.onosproject.vtnrsc.portchain.PortChainService;
@@ -100,7 +97,6 @@
     private String nshSpiIdTopic = "nsh-spi-id";
     private static final String APP_ID = "org.onosproject.app.vtn";
     private static final int SFC_PRIORITY = 1000;
-    private static final int NULL_PORT = 0;
     private static final int MAX_NSH_SPI_ID = 0x7FFFF;
     private static final int MAX_LOAD_BALANCE_ID = 0x20;
 
@@ -131,10 +127,9 @@
     protected SfcPacketProcessor processor = new SfcPacketProcessor();
 
     protected ApplicationId appId;
-    protected ServiceFunctionForwarderService serviceFunctionForwarder;
-    protected FlowClassifierInstallerService flowClassifierInstaller;
     protected IdGenerator nshSpiIdGenerator;
     protected EventuallyConsistentMap<PortChainId, Integer> nshSpiPortChainMap;
+    protected EventuallyConsistentMap<PortChainId, List<FiveTuple>> portChainFiveTupleMap;
     protected DistributedSet<Integer> nshSpiIdFreeList;
 
     private final VtnRscListener vtnRscListener = new InnerVtnRscListener();
@@ -142,24 +137,22 @@
     @Activate
     public void activate() {
         appId = coreService.registerApplication(APP_ID);
-        serviceFunctionForwarder = new ServiceFunctionForwarderImpl(appId);
-        flowClassifierInstaller = new FlowClassifierInstallerImpl(appId);
         nshSpiIdGenerator = coreService.getIdGenerator(nshSpiIdTopic);
 
         vtnRscService.addListener(vtnRscListener);
 
-        KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
-                .register(TenantId.class)
-                .register(PortPairId.class)
-                .register(PortPairGroupId.class)
-                .register(FlowClassifierId.class)
-                .register(PortChainId.class);
+        KryoNamespace.Builder serializer = KryoNamespace
+                .newBuilder()
+                .register(PortChainId.class, UUID.class, FiveTuple.class, IpAddress.class, PortNumber.class,
+                          DefaultFiveTuple.class, IpAddress.Version.class, TenantId.class);
 
         nshSpiPortChainMap = storageService.<PortChainId, Integer>eventuallyConsistentMapBuilder()
-                .withName("nshSpiPortChainMap")
-                .withSerializer(serializer)
-                .withTimestampProvider((k, v) -> new WallClockTimestamp())
-                .build();
+                .withName("nshSpiPortChainMap").withSerializer(serializer)
+                .withTimestampProvider((k, v) ->new WallClockTimestamp()).build();
+
+        portChainFiveTupleMap = storageService.<PortChainId, List<FiveTuple>>eventuallyConsistentMapBuilder()
+                .withName("portChainFiveTupleMap").withSerializer(serializer)
+                .withTimestampProvider((k, v) ->new WallClockTimestamp()).build();
 
         nshSpiIdFreeList = storageService.<Integer>setBuilder()
                 .withName("nshSpiIdDeletedList")
@@ -186,43 +179,47 @@
         public void event(VtnRscEvent event) {
 
             if (VtnRscEvent.Type.PORT_PAIR_PUT == event.type()) {
-                PortPair portPair = ((VtnRscEventFeedback) event.subject()).portPair();
+                PortPair portPair = event.subject().portPair();
                 onPortPairCreated(portPair);
             } else if (VtnRscEvent.Type.PORT_PAIR_DELETE == event.type()) {
-                PortPair portPair = ((VtnRscEventFeedback) event.subject()).portPair();
+                PortPair portPair = event.subject().portPair();
                 onPortPairDeleted(portPair);
             } else if (VtnRscEvent.Type.PORT_PAIR_UPDATE == event.type()) {
-                PortPair portPair = ((VtnRscEventFeedback) event.subject()).portPair();
+                PortPair portPair = event.subject().portPair();
                 onPortPairDeleted(portPair);
                 onPortPairCreated(portPair);
             } else if (VtnRscEvent.Type.PORT_PAIR_GROUP_PUT == event.type()) {
-                PortPairGroup portPairGroup = ((VtnRscEventFeedback) event.subject()).portPairGroup();
+                PortPairGroup portPairGroup = event.subject().portPairGroup();
                 onPortPairGroupCreated(portPairGroup);
             } else if (VtnRscEvent.Type.PORT_PAIR_GROUP_DELETE == event.type()) {
-                PortPairGroup portPairGroup = ((VtnRscEventFeedback) event.subject()).portPairGroup();
+                PortPairGroup portPairGroup = event.subject().portPairGroup();
                 onPortPairGroupDeleted(portPairGroup);
             } else if (VtnRscEvent.Type.PORT_PAIR_GROUP_UPDATE == event.type()) {
-                PortPairGroup portPairGroup = ((VtnRscEventFeedback) event.subject()).portPairGroup();
+                PortPairGroup portPairGroup = event.subject().portPairGroup();
                 onPortPairGroupDeleted(portPairGroup);
                 onPortPairGroupCreated(portPairGroup);
             } else if (VtnRscEvent.Type.FLOW_CLASSIFIER_PUT == event.type()) {
-                FlowClassifier flowClassifier = ((VtnRscEventFeedback) event.subject()).flowClassifier();
+                FlowClassifier flowClassifier = event.subject().flowClassifier();
                 onFlowClassifierCreated(flowClassifier);
             } else if (VtnRscEvent.Type.FLOW_CLASSIFIER_DELETE == event.type()) {
-                FlowClassifier flowClassifier = ((VtnRscEventFeedback) event.subject()).flowClassifier();
+                FlowClassifier flowClassifier = event.subject().flowClassifier();
                 onFlowClassifierDeleted(flowClassifier);
             } else if (VtnRscEvent.Type.FLOW_CLASSIFIER_UPDATE == event.type()) {
-                FlowClassifier flowClassifier = ((VtnRscEventFeedback) event.subject()).flowClassifier();
+                FlowClassifier flowClassifier = event.subject().flowClassifier();
                 onFlowClassifierDeleted(flowClassifier);
                 onFlowClassifierCreated(flowClassifier);
             } else if (VtnRscEvent.Type.PORT_CHAIN_PUT == event.type()) {
-                PortChain portChain = (PortChain) ((VtnRscEventFeedback) event.subject()).portChain();
+                PortChain portChain = event.subject().portChain();
+                if (portChain.oldPortChain() != null) {
+                    onPortChainDeleted(portChain.oldPortChain());
+                }
                 onPortChainCreated(portChain);
             } else if (VtnRscEvent.Type.PORT_CHAIN_DELETE == event.type()) {
-                PortChain portChain = (PortChain) ((VtnRscEventFeedback) event.subject()).portChain();
+                PortChain portChain = event.subject().portChain();
                 onPortChainDeleted(portChain);
+                portChainFiveTupleMap.remove(portChain.portChainId());
             } else if (VtnRscEvent.Type.PORT_CHAIN_UPDATE == event.type()) {
-                PortChain portChain = (PortChain) ((VtnRscEventFeedback) event.subject()).portChain();
+                PortChain portChain = event.subject().portChain();
                 onPortChainDeleted(portChain);
                 onPortChainCreated(portChain);
             }
@@ -232,58 +229,69 @@
     @Override
     public void onPortPairCreated(PortPair portPair) {
         log.debug("onPortPairCreated");
-        // TODO: Modify forwarding rule on port-pair creation.
+        // Do nothing
     }
 
     @Override
     public void onPortPairDeleted(PortPair portPair) {
         log.debug("onPortPairDeleted");
-        // TODO: Modify forwarding rule on port-pair deletion.
+        // Do nothing
     }
 
     @Override
     public void onPortPairGroupCreated(PortPairGroup portPairGroup) {
         log.debug("onPortPairGroupCreated");
-        // TODO: Modify forwarding rule on port-pair-group creation.
+        // Do nothing
     }
 
     @Override
     public void onPortPairGroupDeleted(PortPairGroup portPairGroup) {
         log.debug("onPortPairGroupDeleted");
-        // TODO: Modify forwarding rule on port-pair-group deletion.
+        // Do nothing
     }
 
     @Override
     public void onFlowClassifierCreated(FlowClassifier flowClassifier) {
         log.debug("onFlowClassifierCreated");
-        // TODO: Modify forwarding rule on flow-classifier creation.
+        // Do nothing
     }
 
     @Override
     public void onFlowClassifierDeleted(FlowClassifier flowClassifier) {
         log.debug("onFlowClassifierDeleted");
-        // TODO: Modify forwarding rule on flow-classifier deletion.
+        // Do nothing
     }
 
     @Override
     public void onPortChainCreated(PortChain portChain) {
         NshServicePathId nshSpi;
-        log.info("onPortChainCreated");
-        if (nshSpiPortChainMap.containsKey(portChain.portChainId())) {
-            nshSpi = NshServicePathId.of(nshSpiPortChainMap.get(portChain.portChainId()));
-        } else {
-            int id = getNextNshSpi();
-            if (id > MAX_NSH_SPI_ID) {
-                log.error("Reached max limit of service path index."
-                        + "Failed to install SFC for port chain {}", portChain.portChainId().toString());
-                return;
-            }
-            nshSpi = NshServicePathId.of(id);
-            nshSpiPortChainMap.put(portChain.portChainId(), new Integer(id));
-        }
+        log.info("On port chain created");
 
+        int spi = getNextNshSpi();
+        if (spi > MAX_NSH_SPI_ID) {
+            log.error("Reached max limit of service path index." + "Failed to install SFC for port chain {}",
+                      portChain.portChainId().toString());
+            return;
+        }
+        nshSpi = NshServicePathId.of(spi);
+        nshSpiPortChainMap.put(portChain.portChainId(), new Integer(spi));
+        if (!portChainFiveTupleMap.containsKey(portChain.portChainId())) {
+            portChainFiveTupleMap.put(portChain.portChainId(), Lists.newArrayList());
+        }
         // Install classifier rule to send the packet to controller
-        flowClassifierInstaller.installFlowClassifier(portChain, nshSpi);
+        SfcFlowRuleInstallerImpl flowRuleInstaller = new SfcFlowRuleInstallerImpl(appId);
+        flowRuleInstaller.installFlowClassifier(portChain, nshSpi);
+
+        // Install rules for already identified five tuples.
+        List<FiveTuple> list = portChainFiveTupleMap.get(portChain.portChainId());
+        for (FiveTuple fiveTuple : list) {
+            LoadBalanceId id = loadBalanceSfc(portChain.portChainId(), fiveTuple);
+            // Get nsh service path index
+            nshSpi = NshServicePathId.of(getNshServicePathId(id, spi));
+            // download the required flow rules for classifier and
+            // forwarding
+            flowRuleInstaller.installLoadBalancedFlowRules(portChain, fiveTuple, nshSpi);
+        }
     }
 
     @Override
@@ -295,7 +303,8 @@
 
         int nshSpiId = nshSpiPortChainMap.get(portChain.portChainId());
         // Uninstall classifier rules
-        flowClassifierInstaller.unInstallFlowClassifier(portChain, NshServicePathId.of(nshSpiId));
+        SfcFlowRuleInstallerImpl flowRuleInstaller = new SfcFlowRuleInstallerImpl(appId);
+        flowRuleInstaller.unInstallFlowClassifier(portChain, NshServicePathId.of(nshSpiId));
         // remove from nshSpiPortChainMap and add to nshSpiIdFreeList
         nshSpiPortChainMap.remove(portChain.portChainId());
         nshSpiIdFreeList.add(nshSpiId);
@@ -314,9 +323,16 @@
                 processedIdList.add(id);
             }
             nshSpi = NshServicePathId.of(getNshServicePathId(id, nshSpiId));
-            flowClassifierInstaller.unInstallLoadBalancedFlowClassifier(portChain, fiveTuple, nshSpi);
-            serviceFunctionForwarder.unInstallLoadBalancedForwardingRule(portChain.getLoadBalancePath(fiveTuple),
-                                                                         nshSpi);
+            flowRuleInstaller.unInstallLoadBalancedFlowRules(portChain, fiveTuple, nshSpi);
+        }
+
+        // Reset load for all the port pairs
+        List<PortPairGroupId> ppgIdlist = portChain.portPairGroups();
+        ListIterator<PortPairGroupId> ppgIdListIterator = ppgIdlist.listIterator();
+        while (ppgIdListIterator.hasNext()) {
+            PortPairGroupId portPairGroupId = ppgIdListIterator.next();
+            PortPairGroup ppg = portPairGroupService.getPortPairGroup(portPairGroupId);
+            ppg.resetLoad();
         }
     }
 
@@ -388,9 +404,12 @@
                     boolean match = false;
                     // Check whether protocol is set in flow classifier
                     if (flowClassifier.protocol() != null) {
-                        if ((flowClassifier.protocol().equals("TCP") && fiveTuple.protocol() == IPv4.PROTOCOL_TCP) ||
-                                (flowClassifier.protocol().equals("UDP") &&
-                                        fiveTuple.protocol() == IPv4.PROTOCOL_UDP)) {
+                        if ((flowClassifier.protocol().equalsIgnoreCase("TCP")
+                                && fiveTuple.protocol() == IPv4.PROTOCOL_TCP)
+                                || (flowClassifier.protocol().equalsIgnoreCase("UDP")
+                                        && fiveTuple.protocol() == IPv4.PROTOCOL_UDP)
+                                        || (flowClassifier.protocol().equalsIgnoreCase("ICMP")
+                                                && fiveTuple.protocol() == IPv4.PROTOCOL_ICMP)) {
                             match = true;
                         } else {
                             continue;
@@ -459,68 +478,6 @@
         }
 
         /**
-         * Find the load balanced path set it to port chain for the given five tuple.
-         *
-         * @param portChainId port chain id
-         * @param fiveTuple five tuple info
-         * @return load balance id
-         */
-        private LoadBalanceId loadBalanceSfc(PortChainId portChainId, FiveTuple fiveTuple) {
-
-            // Get the port chain
-            PortChain portChain = portChainService.getPortChain(portChainId);
-            List<PortPairId> loadBalancePath = Lists.newArrayList();
-            LoadBalanceId id;
-            int paths = portChain.getLoadBalancePathSize();
-            if (paths >= MAX_LOAD_BALANCE_ID) {
-                log.info("Max limit reached for load balance paths. "
-                        + "Reusing the created path for port chain {} with five tuple {}",
-                        portChainId, fiveTuple);
-                id = LoadBalanceId.of((byte) ((paths + 1) % MAX_LOAD_BALANCE_ID));
-                portChain.addLoadBalancePath(fiveTuple, id, portChain.getLoadBalancePath(id));
-            }
-
-            // Get the list of port pair groups from port chain
-            Iterable<PortPairGroupId> portPairGroups = portChain.portPairGroups();
-            for (final PortPairGroupId portPairGroupId : portPairGroups) {
-                PortPairGroup portPairGroup = portPairGroupService.getPortPairGroup(portPairGroupId);
-
-                // Get the list of port pair ids from port pair group.
-                Iterable<PortPairId> portPairs = portPairGroup.portPairs();
-                int minLoad = 0xFFF;
-                PortPairId minLoadPortPairId = null;
-                for (final PortPairId portPairId : portPairs) {
-                    int load = portPairGroup.getLoad(portPairId);
-                    if (load == 0) {
-                        minLoadPortPairId = portPairId;
-                        break;
-                    } else {
-                        // Check the port pair which has min load.
-                        if (load < minLoad) {
-                            minLoad = load;
-                            minLoadPortPairId = portPairId;
-                        }
-                    }
-                }
-                if (minLoadPortPairId != null) {
-                    loadBalancePath.add(minLoadPortPairId);
-                    portPairGroup.addLoad(minLoadPortPairId);
-                }
-            }
-
-            // Check if the path already exists, if not create a new id
-            Optional<LoadBalanceId> output = portChain.matchPath(loadBalancePath);
-            if (output.isPresent()) {
-                id = output.get();
-            } else {
-                id = LoadBalanceId.of((byte) (paths + 1));
-            }
-
-            portChain.addLoadBalancePath(fiveTuple, id, loadBalancePath);
-            return id;
-        }
-
-        /**
          * Get the tenant id for the given mac address.
          *
          * @param mac mac address
@@ -561,7 +518,7 @@
                     TCP tcpPacket = (TCP) ipv4Packet.getPayload();
                     portSrc = tcpPacket.getSourcePort();
                     portDst = tcpPacket.getDestinationPort();
-                } else  if (protocol == IPv4.PROTOCOL_UDP) {
+                } else if (protocol == IPv4.PROTOCOL_UDP) {
                     UDP udpPacket = (UDP) ipv4Packet.getPayload();
                     portSrc = udpPacket.getSourcePort();
                     portDst = udpPacket.getDestinationPort();
@@ -571,7 +528,7 @@
                     // No need to process other packets received by controller.
                     return;
                 }
-            } else if (ethType == Ethernet.TYPE_IPV6) {
+            } else {
                 return;
             }
 
@@ -587,11 +544,11 @@
             PortChainId portChainId = findPortChainFromFiveTuple(fiveTuple);
 
             if (portChainId == null) {
-                log.error("Packet does not match with any classifier");
                 return;
             }
 
             // Once the 5 tuple and port chain are identified, give this input for load balancing
+            addToPortChainIdFiveTupleMap(portChainId, fiveTuple);
             LoadBalanceId id = loadBalanceSfc(portChainId, fiveTuple);
             // Get nsh service path index
             NshServicePathId nshSpi;
@@ -611,11 +568,9 @@
             }
             // download the required flow rules for classifier and forwarding
             // install in OVS.
-            ConnectPoint connectPoint = flowClassifierInstaller.installLoadBalancedFlowClassifier(portChain,
-                                                                                                  fiveTuple, nshSpi);
-            serviceFunctionForwarder.installLoadBalancedForwardingRule(portChain.getLoadBalancePath(fiveTuple),
-                                                                       nshSpi);
-            sendPacket(context, connectPoint);
+            SfcFlowRuleInstallerImpl flowRuleInstaller = new SfcFlowRuleInstallerImpl(appId);
+            flowRuleInstaller.installLoadBalancedFlowRules(portChain, fiveTuple, nshSpi);
+            sendPacket(context);
         }
 
         /**
@@ -624,11 +579,13 @@
          * @param context packet context
          * @param connectPoint connect point of first service function
          */
-        private void sendPacket(PacketContext context, ConnectPoint connectPoint) {
+        private void sendPacket(PacketContext context) {
 
-            TrafficTreatment treatment = DefaultTrafficTreatment.builder().setOutput(connectPoint.port()).build();
-            OutboundPacket packet = new DefaultOutboundPacket(connectPoint.deviceId(), treatment,
-                                                              context.inPacket().unparsed());
+            ConnectPoint sourcePoint = context.inPacket().receivedFrom();
+
+            TrafficTreatment treatment = DefaultTrafficTreatment.builder().setOutput(sourcePoint.port()).build();
+            OutboundPacket packet = new DefaultOutboundPacket(sourcePoint.deviceId(), treatment, context.inPacket()
+                    .unparsed());
             packetService.emit(packet);
             log.trace("Sending packet: {}", packet);
         }
@@ -646,4 +603,71 @@
         nshSpiNew = nshSpiNew | id.loadBalanceId();
         return nshSpiNew;
     }
+
+    private void addToPortChainIdFiveTupleMap(PortChainId portChainId, FiveTuple fiveTuple) {
+        List<FiveTuple> list = portChainFiveTupleMap.get(portChainId);
+        list.add(fiveTuple);
+        portChainFiveTupleMap.put(portChainId, list);
+    }
+
+    /**
+     * Find the load balanced path set it to port chain for the given five
+     * tuple.
+     *
+     * @param portChainId port chain id
+     * @param fiveTuple five tuple info
+     * @return load balance id
+     */
+    private LoadBalanceId loadBalanceSfc(PortChainId portChainId, FiveTuple fiveTuple) {
+
+        // Get the port chain
+        PortChain portChain = portChainService.getPortChain(portChainId);
+        List<PortPairId> loadBalancePath = Lists.newArrayList();
+        LoadBalanceId id;
+        int paths = portChain.getLoadBalancePathSize();
+        if (paths >= MAX_LOAD_BALANCE_ID) {
+            log.info("Max limit reached for load balance paths. "
+                    + "Reusing the created path for port chain {} with five tuple {}", portChainId, fiveTuple);
+            id = LoadBalanceId.of((byte) ((paths + 1) % MAX_LOAD_BALANCE_ID));
+            portChain.addLoadBalancePath(fiveTuple, id, portChain.getLoadBalancePath(id));
+        }
+
+        // Get the list of port pair groups from port chain
+        Iterable<PortPairGroupId> portPairGroups = portChain.portPairGroups();
+        for (final PortPairGroupId portPairGroupId : portPairGroups) {
+            PortPairGroup portPairGroup = portPairGroupService.getPortPairGroup(portPairGroupId);
+
+            // Get the list of port pair ids from port pair group.
+            Iterable<PortPairId> portPairs = portPairGroup.portPairs();
+            int minLoad = 0xFFF;
+            PortPairId minLoadPortPairId = null;
+            for (final PortPairId portPairId : portPairs) {
+                int load = portPairGroup.getLoad(portPairId);
+                if (load == 0) {
+                    minLoadPortPairId = portPairId;
+                    break;
+                } else {
+                    // Check the port pair which has min load.
+                    if (load < minLoad) {
+                        minLoad = load;
+                        minLoadPortPairId = portPairId;
+                    }
+                }
+            }
+            if (minLoadPortPairId != null) {
+                loadBalancePath.add(minLoadPortPairId);
+                portPairGroup.addLoad(minLoadPortPairId);
+            }
+        }
+
+        // Check if the path already exists, if not create a new id
+        id = portChain.matchPath(loadBalancePath);
+        if (id == null) {
+            id = LoadBalanceId.of((byte) (paths + 1));
+        }
+
+        portChain.addLoadBalancePath(fiveTuple, id, loadBalancePath);
+        return id;
+    }
+
 }
diff --git a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/forwarder/impl/ServiceFunctionForwarderImplTest.java b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/forwarder/impl/ServiceFunctionForwarderImplTest.java
deleted file mode 100644
index 06b3585..0000000
--- a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/forwarder/impl/ServiceFunctionForwarderImplTest.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.sfc.forwarder.impl;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.hamcrest.Matchers.instanceOf;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.junit.Test;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.DefaultApplicationId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.NshServicePathId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.device.DeviceServiceAdapter;
-import org.onosproject.net.driver.DriverHandler;
-import org.onosproject.net.driver.DriverService;
-import org.onosproject.net.flow.criteria.Criterion;
-import org.onosproject.net.flow.criteria.PortCriterion;
-import org.onosproject.net.flow.instructions.Instruction;
-import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
-import org.onosproject.net.flowobjective.FlowObjectiveService;
-import org.onosproject.net.flowobjective.ForwardingObjective;
-import org.onosproject.net.host.HostService;
-import org.onosproject.net.host.HostServiceAdapter;
-import org.onosproject.sfc.util.FlowClassifierAdapter;
-import org.onosproject.sfc.util.FlowObjectiveAdapter;
-import org.onosproject.sfc.util.MockDriverHandler;
-import org.onosproject.sfc.util.PortPairAdapter;
-import org.onosproject.sfc.util.PortPairGroupAdapter;
-import org.onosproject.sfc.util.VirtualPortAdapter;
-import org.onosproject.sfc.util.VtnRscAdapter;
-import org.onosproject.vtnrsc.AllowedAddressPair;
-import org.onosproject.vtnrsc.BindingHostId;
-import org.onosproject.vtnrsc.DefaultPortPair;
-import org.onosproject.vtnrsc.DefaultVirtualPort;
-import org.onosproject.vtnrsc.FixedIp;
-import org.onosproject.vtnrsc.PortPair;
-import org.onosproject.vtnrsc.PortPairId;
-import org.onosproject.vtnrsc.SecurityGroup;
-import org.onosproject.vtnrsc.SubnetId;
-import org.onosproject.vtnrsc.TenantId;
-import org.onosproject.vtnrsc.TenantNetworkId;
-import org.onosproject.vtnrsc.VirtualPort;
-import org.onosproject.vtnrsc.VirtualPortId;
-import org.onosproject.vtnrsc.flowclassifier.FlowClassifierService;
-import org.onosproject.vtnrsc.portpair.PortPairService;
-import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
-import org.onosproject.vtnrsc.service.VtnRscService;
-import org.onosproject.vtnrsc.virtualport.VirtualPortService;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-public class ServiceFunctionForwarderImplTest {
-
-    FlowObjectiveService flowObjectiveService = new FlowObjectiveAdapter();
-    DeviceService deviceService = new DeviceServiceAdapter();
-    HostService hostService = new HostServiceAdapter();
-    VirtualPortService virtualPortService = new VirtualPortAdapter();
-    VtnRscService vtnRscService = new VtnRscAdapter();
-    PortPairService portPairService = new PortPairAdapter();
-    PortPairGroupService portPairGroupService = new PortPairGroupAdapter();
-    FlowClassifierService flowClassifierService = new FlowClassifierAdapter();
-
-    final DriverService driverService = createMock(DriverService.class);
-
-    DeviceId deviceId = DeviceId.deviceId("of:000000000000001");
-    final TenantId tenantId = TenantId.tenantId("1");
-
-    final DriverHandler driverHandler = new MockDriverHandler();
-
-    private VirtualPort createVirtualPort(VirtualPortId id) {
-        Set<FixedIp> fixedIps;
-        Map<String, String> propertyMap;
-        Set<AllowedAddressPair> allowedAddressPairs;
-        Set<SecurityGroup> securityGroups = Sets.newHashSet();
-
-        String macAddressStr = "fa:12:3e:56:ee:a2";
-        String ipAddress = "10.1.1.1";
-        String tenantNetworkId = "1234567";
-        String subnet = "1212";
-        String hostIdStr = "fa:e2:3e:56:ee:a2";
-        String deviceOwner = "james";
-        propertyMap = Maps.newHashMap();
-        propertyMap.putIfAbsent("deviceOwner", deviceOwner);
-
-        TenantNetworkId networkId = TenantNetworkId.networkId(tenantNetworkId);
-        MacAddress macAddress = MacAddress.valueOf(macAddressStr);
-        BindingHostId bindingHostId = BindingHostId.bindingHostId(hostIdStr);
-        FixedIp fixedIp = FixedIp.fixedIp(SubnetId.subnetId(subnet),
-                                          IpAddress.valueOf(ipAddress));
-        fixedIps = Sets.newHashSet();
-        fixedIps.add(fixedIp);
-
-        allowedAddressPairs = Sets.newHashSet();
-        AllowedAddressPair allowedAddressPair = AllowedAddressPair
-                .allowedAddressPair(IpAddress.valueOf(ipAddress),
-                                    MacAddress.valueOf(macAddressStr));
-        allowedAddressPairs.add(allowedAddressPair);
-
-        VirtualPort d1 = new DefaultVirtualPort(id, networkId, true,
-                                                propertyMap,
-                                                VirtualPort.State.ACTIVE,
-                                                macAddress, tenantId, deviceId,
-                                                fixedIps, bindingHostId,
-                                                allowedAddressPairs,
-                                                securityGroups);
-        return d1;
-    }
-
-    @Test
-    public void testInstallFlowClassifier() {
-
-        PortPairId portPairId1 = PortPairId.of("73333333-fc23-aeb6-f44b-56dc5e2fb3ae");
-        PortPairId portPairId2 = PortPairId.of("74444444-fc23-aeb6-f44b-56dc5e2fb3ae");
-
-        final String ppName1 = "PortPair1";
-        final String ppDescription1 = "PortPair1";
-        final String ingress1 = "d3333333-24fc-4fae-af4b-321c5e2eb3d1";
-        final String egress1 = "a4444444-4a56-2a6e-cd3a-9dee4e2ec345";
-        DefaultPortPair.Builder portPairBuilder = new DefaultPortPair.Builder();
-        PortPair portPair1 = portPairBuilder.setId(portPairId1).setName(ppName1).setTenantId(tenantId)
-                .setDescription(ppDescription1).setIngress(ingress1).setEgress(egress1).build();
-
-        final String ppName2 = "PortPair2";
-        final String ppDescription2 = "PortPair2";
-        final String ingress2 = "d5555555-24fc-4fae-af4b-321c5e2eb3d1";
-        final String egress2 = "a6666666-4a56-2a6e-cd3a-9dee4e2ec345";
-        PortPair portPair2 = portPairBuilder.setId(portPairId2).setName(ppName2).setTenantId(tenantId)
-                .setDescription(ppDescription2).setIngress(ingress2).setEgress(egress2).build();
-
-        ApplicationId appId = new DefaultApplicationId(1, "test");
-        ServiceFunctionForwarderImpl serviceFunctionForwarder = new ServiceFunctionForwarderImpl();
-        serviceFunctionForwarder.virtualPortService = virtualPortService;
-        serviceFunctionForwarder.vtnRscService = vtnRscService;
-        serviceFunctionForwarder.portPairService = portPairService;
-        serviceFunctionForwarder.portPairGroupService = portPairGroupService;
-        serviceFunctionForwarder.flowClassifierService = flowClassifierService;
-        serviceFunctionForwarder.driverService = driverService;
-        serviceFunctionForwarder.hostService = hostService;
-        serviceFunctionForwarder.flowObjectiveService = flowObjectiveService;
-        serviceFunctionForwarder.appId = appId;
-
-        NshServicePathId nshSpiId = NshServicePathId.of(10);
-
-        portPairService.createPortPair(portPair1);
-        portPairService.createPortPair(portPair2);
-
-        List<PortPairId> path = Lists.newArrayList();
-        path.add(portPairId1);
-        path.add(portPairId2);
-
-        List<VirtualPort> virtualPortList = Lists.newArrayList();
-        virtualPortList.add(createVirtualPort(VirtualPortId.portId(egress1)));
-        virtualPortList.add(createVirtualPort(VirtualPortId.portId(ingress2)));
-        virtualPortService.createPorts(virtualPortList);
-
-        expect(driverService.createHandler(deviceId)).andReturn(driverHandler).anyTimes();
-        replay(driverService);
-
-        serviceFunctionForwarder.installLoadBalancedForwardingRule(path, nshSpiId);
-
-        ForwardingObjective forObj = ((FlowObjectiveAdapter) flowObjectiveService).forwardingObjective();
-
-        // Check for Selector
-        assertThat(forObj.selector().getCriterion(Criterion.Type.IN_PORT), instanceOf(PortCriterion.class));
-
-        // Check for treatment
-        List<Instruction> instructions = forObj.treatment().allInstructions();
-        for (Instruction instruction : instructions) {
-            if (instruction.type() == Instruction.Type.OUTPUT) {
-                assertThat(((OutputInstruction) instruction).port(), is(PortNumber.P0));
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/installer/impl/FlowClassifierInstallerImplTest.java b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/installer/impl/SfcFlowRuleInstallerImplTest.java
similarity index 61%
rename from apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/installer/impl/FlowClassifierInstallerImplTest.java
rename to apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/installer/impl/SfcFlowRuleInstallerImplTest.java
index a51ea21..61ad4e8 100644
--- a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/installer/impl/FlowClassifierInstallerImplTest.java
+++ b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/installer/impl/SfcFlowRuleInstallerImplTest.java
@@ -18,48 +18,74 @@
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
+import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
+import static org.onosproject.net.Device.Type.SWITCH;
+import static org.onosproject.net.Port.Type.COPPER;
 
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.junit.Test;
+import org.onlab.packet.ChassisId;
+import org.onlab.packet.IPv4;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.DefaultApplicationId;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.Annotations;
 import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DefaultDevice;
+import org.onosproject.net.DefaultPort;
+import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.HostLocation;
 import org.onosproject.net.NshServicePathId;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
+import org.onosproject.net.flow.criteria.Criterion;
+import org.onosproject.net.flow.criteria.PortCriterion;
+import org.onosproject.net.flow.instructions.Instruction;
+import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.host.HostServiceAdapter;
+import org.onosproject.net.provider.ProviderId;
 import org.onosproject.sfc.util.FlowClassifierAdapter;
 import org.onosproject.sfc.util.FlowObjectiveAdapter;
 import org.onosproject.sfc.util.MockDriverHandler;
 import org.onosproject.sfc.util.PortPairAdapter;
 import org.onosproject.sfc.util.PortPairGroupAdapter;
+import org.onosproject.sfc.util.TenantNetworkAdapter;
 import org.onosproject.sfc.util.VirtualPortAdapter;
 import org.onosproject.sfc.util.VtnRscAdapter;
 import org.onosproject.vtnrsc.AllowedAddressPair;
 import org.onosproject.vtnrsc.BindingHostId;
+import org.onosproject.vtnrsc.DefaultFiveTuple;
 import org.onosproject.vtnrsc.DefaultFlowClassifier;
 import org.onosproject.vtnrsc.DefaultPortChain;
 import org.onosproject.vtnrsc.DefaultPortPair;
 import org.onosproject.vtnrsc.DefaultPortPairGroup;
+import org.onosproject.vtnrsc.DefaultTenantNetwork;
 import org.onosproject.vtnrsc.DefaultVirtualPort;
+import org.onosproject.vtnrsc.FiveTuple;
 import org.onosproject.vtnrsc.FixedIp;
 import org.onosproject.vtnrsc.FlowClassifier;
 import org.onosproject.vtnrsc.FlowClassifierId;
+import org.onosproject.vtnrsc.LoadBalanceId;
+import org.onosproject.vtnrsc.PhysicalNetwork;
 import org.onosproject.vtnrsc.PortChain;
 import org.onosproject.vtnrsc.PortChainId;
 import org.onosproject.vtnrsc.PortPair;
@@ -67,8 +93,10 @@
 import org.onosproject.vtnrsc.PortPairGroupId;
 import org.onosproject.vtnrsc.PortPairId;
 import org.onosproject.vtnrsc.SecurityGroup;
+import org.onosproject.vtnrsc.SegmentationId;
 import org.onosproject.vtnrsc.SubnetId;
 import org.onosproject.vtnrsc.TenantId;
+import org.onosproject.vtnrsc.TenantNetwork;
 import org.onosproject.vtnrsc.TenantNetworkId;
 import org.onosproject.vtnrsc.VirtualPort;
 import org.onosproject.vtnrsc.VirtualPortId;
@@ -76,25 +104,30 @@
 import org.onosproject.vtnrsc.portpair.PortPairService;
 import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
 import org.onosproject.vtnrsc.service.VtnRscService;
+import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
-public class FlowClassifierInstallerImplTest {
+public class SfcFlowRuleInstallerImplTest {
 
     FlowObjectiveService flowObjectiveService = new FlowObjectiveAdapter();
-    DeviceService deviceService = new DeviceServiceAdapter();
+    DeviceService deviceService = new DeviceServiceAdapter(createPortList());
+
     HostService hostService = new HostServiceAdapter();
     VirtualPortService virtualPortService = new VirtualPortAdapter();
     VtnRscService vtnRscService = new VtnRscAdapter();
     PortPairService portPairService = new PortPairAdapter();
     PortPairGroupService portPairGroupService = new PortPairGroupAdapter();
     FlowClassifierService flowClassifierService = new FlowClassifierAdapter();
+    TenantNetworkService tenantNetworkService = new TenantNetworkAdapter();
 
     final DriverService driverService = createMock(DriverService.class);
 
+    private final String networkIdStr = "123";
+
     final PortChainId portChainId = PortChainId.of("78888888-fc23-aeb6-f44b-56dc5e2fb3ae");
     final TenantId tenantId = TenantId.tenantId("1");
     final String name = "PortChain";
@@ -115,7 +148,6 @@
     final String ingress = "d3333333-24fc-4fae-af4b-321c5e2eb3d1";
     final String egress = "a4444444-4a56-2a6e-cd3a-9dee4e2ec345";
 
-
     final String ppgName = "PortPairGroup";
     final String ppgDescription = "PortPairGroup";
     final List<PortPairId> portPairList = new LinkedList<PortPairId>();
@@ -127,7 +159,21 @@
 
     final DriverHandler driverHandler = new MockDriverHandler();
 
-    private PortPair createPortPair(PortPairId  ppId) {
+    private List<Port> createPortList() {
+        List<Port> portList = Lists.newArrayList();
+        long sp1 = 1_000_000;
+        ProviderId pid = new ProviderId("of", "foo");
+        ChassisId cid = new ChassisId();
+        Device device = new DefaultDevice(pid, deviceId, SWITCH, "whitebox", "1.1.x", "3.9.1", "43311-12345", cid);
+        Annotations annotations = DefaultAnnotations
+                .builder()
+                .set(AnnotationKeys.PORT_NAME, "vxlan-0.0.0.0").build();
+        Port p1 = new DefaultPort(device, PortNumber.ANY, true, COPPER, sp1, annotations);
+        portList.add(p1);
+        return portList;
+    }
+
+    private PortPair createPortPair(PortPairId ppId) {
         DefaultPortPair.Builder portPairBuilder = new DefaultPortPair.Builder();
         PortPair portPair = portPairBuilder.setId(ppId).setName(ppName).setTenantId(tenantId)
                 .setDescription(ppDescription).setIngress(ingress).setEgress(egress).build();
@@ -193,7 +239,7 @@
         return flowClassifier;
     }
 
-    private VirtualPort createVirtualPort() {
+    private VirtualPort createVirtualPort(VirtualPortId id) {
         Set<FixedIp> fixedIps;
         Map<String, String> propertyMap;
         Set<AllowedAddressPair> allowedAddressPairs;
@@ -201,14 +247,13 @@
 
         String macAddressStr = "fa:12:3e:56:ee:a2";
         String ipAddress = "10.1.1.1";
-        String tenantNetworkId = "1234567";
         String subnet = "1212";
         String hostIdStr = "fa:e2:3e:56:ee:a2";
         String deviceOwner = "james";
         propertyMap = Maps.newHashMap();
         propertyMap.putIfAbsent("deviceOwner", deviceOwner);
 
-        TenantNetworkId networkId = TenantNetworkId.networkId(tenantNetworkId);
+        TenantNetworkId networkId = TenantNetworkId.networkId(networkIdStr);
         MacAddress macAddress = MacAddress.valueOf(macAddressStr);
         BindingHostId bindingHostId = BindingHostId.bindingHostId(hostIdStr);
         FixedIp fixedIp = FixedIp.fixedIp(SubnetId.subnetId(subnet),
@@ -222,7 +267,7 @@
                                     MacAddress.valueOf(macAddressStr));
         allowedAddressPairs.add(allowedAddressPair);
 
-        VirtualPort d1 = new DefaultVirtualPort(id1, networkId, true,
+        VirtualPort d1 = new DefaultVirtualPort(id, networkId, true,
                                                 propertyMap,
                                                 VirtualPort.State.ACTIVE,
                                                 macAddress, tenantId, deviceId,
@@ -236,7 +281,7 @@
     public void testInstallFlowClassifier() {
 
         ApplicationId appId = new DefaultApplicationId(1, "test");
-        FlowClassifierInstallerImpl flowClassifierInstaller = new FlowClassifierInstallerImpl();
+        SfcFlowRuleInstallerImpl flowClassifierInstaller = new SfcFlowRuleInstallerImpl();
         flowClassifierInstaller.virtualPortService = virtualPortService;
         flowClassifierInstaller.vtnRscService = vtnRscService;
         flowClassifierInstaller.portPairService = portPairService;
@@ -261,7 +306,7 @@
         flowClassifierService.createFlowClassifier(fc2);
 
         List<VirtualPort> virtualPortList = Lists.newArrayList();
-        virtualPortList.add(createVirtualPort());
+        virtualPortList.add(createVirtualPort(VirtualPortId.portId(ingress)));
         virtualPortService.createPorts(virtualPortList);
 
         expect(driverService.createHandler(deviceId)).andReturn(driverHandler).anyTimes();
@@ -271,4 +316,102 @@
 
         assertThat(connectPoint, is(HostLocation.NONE));
     }
-}
\ No newline at end of file
+
+    @Test
+    public void testInstallLoadBalancedFlowRules() {
+        ApplicationId appId = new DefaultApplicationId(1, "test");
+        SfcFlowRuleInstallerImpl flowRuleInstaller = new SfcFlowRuleInstallerImpl();
+        flowRuleInstaller.virtualPortService = virtualPortService;
+        flowRuleInstaller.vtnRscService = vtnRscService;
+        flowRuleInstaller.portPairService = portPairService;
+        flowRuleInstaller.portPairGroupService = portPairGroupService;
+        flowRuleInstaller.flowClassifierService = flowClassifierService;
+        flowRuleInstaller.driverService = driverService;
+        flowRuleInstaller.deviceService = deviceService;
+        flowRuleInstaller.hostService = hostService;
+        flowRuleInstaller.flowObjectiveService = flowObjectiveService;
+        flowRuleInstaller.tenantNetworkService = tenantNetworkService;
+        flowRuleInstaller.appId = appId;
+
+        final PortChain portChain = createPortChain();
+
+        final String ppName1 = "PortPair1";
+        final String ppDescription1 = "PortPair1";
+        final String ingress1 = "d3333333-24fc-4fae-af4b-321c5e2eb3d1";
+        final String egress1 = "a4444444-4a56-2a6e-cd3a-9dee4e2ec345";
+        DefaultPortPair.Builder portPairBuilder = new DefaultPortPair.Builder();
+        PortPair portPair1 = portPairBuilder.setId(portPairId1).setName(ppName1).setTenantId(tenantId)
+                .setDescription(ppDescription1).setIngress(ingress1).setEgress(egress1).build();
+
+        final String ppName2 = "PortPair2";
+        final String ppDescription2 = "PortPair2";
+        final String ingress2 = "d5555555-24fc-4fae-af4b-321c5e2eb3d1";
+        final String egress2 = "a6666666-4a56-2a6e-cd3a-9dee4e2ec345";
+        PortPair portPair2 = portPairBuilder.setId(portPairId2).setName(ppName2).setTenantId(tenantId)
+                .setDescription(ppDescription2).setIngress(ingress2).setEgress(egress2).build();
+
+        portPairService.createPortPair(portPair1);
+        portPairService.createPortPair(portPair2);
+
+        FlowClassifier fc1 = createFlowClassifier(flowClassifierId1);
+        FlowClassifier fc2 = createFlowClassifier(flowClassifierId2);
+        flowClassifierService.createFlowClassifier(fc1);
+        flowClassifierService.createFlowClassifier(fc2);
+
+        NshServicePathId nshSpiId = NshServicePathId.of(10);
+        FiveTuple fiveTuple = DefaultFiveTuple.builder().setIpSrc(IpAddress.valueOf("3.3.3.3"))
+                .setIpDst(IpAddress.valueOf("4.4.4.4"))
+                .setPortSrc(PortNumber.portNumber(1500))
+                .setPortDst(PortNumber.portNumber(2000))
+                .setProtocol(IPv4.PROTOCOL_UDP)
+                .setTenantId(TenantId.tenantId("bbb"))
+                .build();
+        LoadBalanceId id = LoadBalanceId.of((byte) 1);
+
+        List<PortPairId> path = Lists.newArrayList();
+        path.add(portPairId1);
+        path.add(portPairId2);
+
+        List<VirtualPort> virtualPortList = Lists.newArrayList();
+        virtualPortList.add(createVirtualPort(VirtualPortId.portId(ingress1)));
+        virtualPortList.add(createVirtualPort(VirtualPortId.portId(egress1)));
+        virtualPortList.add(createVirtualPort(VirtualPortId.portId(ingress2)));
+        virtualPortList.add(createVirtualPort(VirtualPortId.portId(egress2)));
+        virtualPortService.createPorts(virtualPortList);
+
+        portChain.addLoadBalancePath(fiveTuple, id, path);
+
+        String physicalNetworkStr = "1234";
+        String segmentationIdStr = "1";
+        SegmentationId segmentationID = SegmentationId
+                .segmentationId(segmentationIdStr);
+        TenantNetworkId networkid1 = TenantNetworkId.networkId(networkIdStr);
+        PhysicalNetwork physicalNetwork = PhysicalNetwork
+                .physicalNetwork(physicalNetworkStr);
+        TenantNetwork p1 = new DefaultTenantNetwork(networkid1, name, false,
+                                                    TenantNetwork.State.ACTIVE,
+                                                    false, tenantId, false,
+                                                    TenantNetwork.Type.LOCAL,
+                                                    physicalNetwork,
+                                                    segmentationID);
+        tenantNetworkService.createNetworks(Collections.singletonList(p1));
+
+        expect(driverService.createHandler(deviceId)).andReturn(driverHandler).anyTimes();
+        replay(driverService);
+
+        flowRuleInstaller.installLoadBalancedFlowRules(portChain, fiveTuple, nshSpiId);
+
+        ForwardingObjective forObj = ((FlowObjectiveAdapter) flowObjectiveService).forwardingObjective();
+
+        // Check for Selector
+        assertThat(forObj.selector().getCriterion(Criterion.Type.IN_PORT), instanceOf(PortCriterion.class));
+
+        // Check for treatment
+        List<Instruction> instructions = forObj.treatment().allInstructions();
+        for (Instruction instruction : instructions) {
+            if (instruction.type() == Instruction.Type.OUTPUT) {
+                assertThat(((OutputInstruction) instruction).port(), is(PortNumber.P0));
+            }
+        }
+    }
+}
diff --git a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionSelector.java b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionSelector.java
index a59c37b..6b8ca07f 100644
--- a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionSelector.java
+++ b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionSelector.java
@@ -23,6 +23,12 @@
 
 public class MockExtensionSelector implements ExtensionSelector {
 
+    private ExtensionSelectorType type;
+
+    public MockExtensionSelector(ExtensionSelectorType type) {
+        this.type = type;
+    }
+
     @Override
     public <T> void setPropertyValue(String key, T value) throws ExtensionPropertyException {
     }
@@ -48,6 +54,6 @@
 
     @Override
     public ExtensionSelectorType type() {
-        return null;
+        return type;
     }
 }
\ No newline at end of file
diff --git a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionSelectorResolver.java b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionSelectorResolver.java
index f7d90ad..1c2f46c 100644
--- a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionSelectorResolver.java
+++ b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionSelectorResolver.java
@@ -43,6 +43,6 @@
 
     @Override
     public ExtensionSelector getExtensionSelector(ExtensionSelectorType type) {
-        return new MockExtensionSelector();
+        return new MockExtensionSelector(type);
     }
 }
\ No newline at end of file
diff --git a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionTreatment.java b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionTreatment.java
index 3106e0f..b782133 100644
--- a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionTreatment.java
+++ b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionTreatment.java
@@ -23,6 +23,12 @@
 
 public class MockExtensionTreatment implements ExtensionTreatment {
 
+    private ExtensionTreatmentType type;
+
+    public MockExtensionTreatment(ExtensionTreatmentType type) {
+        this.type = type;
+    }
+
     @Override
     public <T> void setPropertyValue(String key, T value) throws ExtensionPropertyException {
     }
@@ -48,7 +54,7 @@
 
     @Override
     public ExtensionTreatmentType type() {
-        return null;
+        return type;
     }
 
 }
\ No newline at end of file
diff --git a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionTreatmentResolver.java b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionTreatmentResolver.java
index 6cbb413..c58804c 100644
--- a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionTreatmentResolver.java
+++ b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/MockExtensionTreatmentResolver.java
@@ -43,7 +43,7 @@
 
     @Override
     public ExtensionTreatment getExtensionInstruction(ExtensionTreatmentType type) {
-        return new MockExtensionTreatment();
+        return new MockExtensionTreatment(type);
     }
 
 }
\ No newline at end of file
diff --git a/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/TenantNetworkAdapter.java b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/TenantNetworkAdapter.java
new file mode 100644
index 0000000..f4fa9e8
--- /dev/null
+++ b/apps/vtn/sfcmgr/src/test/java/org/onosproject/sfc/util/TenantNetworkAdapter.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.sfc.util;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.onosproject.vtnrsc.TenantNetwork;
+import org.onosproject.vtnrsc.TenantNetworkId;
+import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Provides implementation of the VtnRsc service.
+ */
+public class TenantNetworkAdapter implements TenantNetworkService {
+
+    private final ConcurrentMap<TenantNetworkId, TenantNetwork> tenantNetworkStore = new ConcurrentHashMap<>();
+
+    @Override
+    public boolean exists(TenantNetworkId networkId) {
+        return tenantNetworkStore.containsKey(networkId);
+    }
+
+    @Override
+    public int getNetworkCount() {
+        return tenantNetworkStore.size();
+    }
+
+    @Override
+    public Iterable<TenantNetwork> getNetworks() {
+        return ImmutableList.copyOf(tenantNetworkStore.values());
+    }
+
+    @Override
+    public TenantNetwork getNetwork(TenantNetworkId networkId) {
+        return tenantNetworkStore.get(networkId);
+    }
+
+    @Override
+    public boolean createNetworks(Iterable<TenantNetwork> networks) {
+        for (TenantNetwork network : networks) {
+            tenantNetworkStore.put(network.id(), network);
+            if (!tenantNetworkStore.containsKey(network.id())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public boolean updateNetworks(Iterable<TenantNetwork> networks) {
+        return false;
+    }
+
+    @Override
+    public boolean removeNetworks(Iterable<TenantNetworkId> networksIds) {
+        return false;
+    }
+
+}
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java
index 7301a46..e4b0767 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java
@@ -45,6 +45,20 @@
         {
             put("key", "flow");
             put("remote_ip", "flow");
+            put("dst_port", "4790");
+            put("in_nsi", "flow");
+            put("in_nsp", "flow");
+            put("out_nsi", "flow");
+            put("out_nsp", "flow");
+            put("in_nshc1", "flow");
+            put("out_nshc1", "flow");
+            put("in_nshc2", "flow");
+            put("out_nshc2", "flow");
+            put("in_nshc3", "flow");
+            put("out_nshc3", "flow");
+            put("in_nshc4", "flow");
+            put("out_nshc4", "flow");
+            put("exts", "gpe");
         }
     };
     /**
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFlowClassifier.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFlowClassifier.java
index 4f3a5a0..27b3a22 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFlowClassifier.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFlowClassifier.java
@@ -48,7 +48,7 @@
     private static final String TENANT_ID_NOT_NULL = "Tenant id can not be null.";
     private static final String NAME_NOT_NULL = "Name can not be null.";
     private static final String ETHER_TYPE_NOT_NULL = "Ether Type can not be null.";
-    private static final int DEFAULT_CLASSIFIER_PRIORITY = 0xFFFF;
+    private static final int DEFAULT_CLASSIFIER_PRIORITY = 0xCB20;
 
     /**
      * Constructor to create default flow classifier.
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultPortChain.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultPortChain.java
index 879c7ea..9d66de3 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultPortChain.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultPortChain.java
@@ -22,7 +22,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -42,11 +41,13 @@
     private final String description;
     private final List<PortPairGroupId> portPairGroupList;
     private final List<FlowClassifierId> flowClassifierList;
+    private final PortChain oldPortChain;
 
     private final Map<FiveTuple, LoadBalanceId> sfcLoadBalanceIdMap = new ConcurrentHashMap<>();
     private final Map<LoadBalanceId, List<PortPairId>> sfcLoadBalancePathMap = new ConcurrentHashMap<>();
     private final Map<LoadBalanceId, List<DeviceId>> sfcClassifiersMap = new ConcurrentHashMap<>();
     private final Map<LoadBalanceId, List<DeviceId>> sfcForwardersMap = new ConcurrentHashMap<>();
+
     /**
      * Default constructor to create port chain.
      *
@@ -58,9 +59,10 @@
      * @param flowClassifierList flow classifier list
      */
     private DefaultPortChain(PortChainId portChainId, TenantId tenantId,
-                             String name, String description,
-                             List<PortPairGroupId> portPairGroupList,
-                             List<FlowClassifierId> flowClassifierList) {
+            String name, String description,
+            List<PortPairGroupId> portPairGroupList,
+            List<FlowClassifierId> flowClassifierList,
+            PortChain portChain) {
 
         this.portChainId = portChainId;
         this.tenantId = tenantId;
@@ -68,6 +70,20 @@
         this.description = description;
         this.portPairGroupList = portPairGroupList;
         this.flowClassifierList = flowClassifierList;
+        this.oldPortChain = portChain;
+    }
+
+    /**
+     * To create port chain for update with old port chain.
+     *
+     * @param newPortChain updated port chain
+     * @param oldPortChain old port chain
+     * @return port chain
+     */
+    public static PortChain create(PortChain newPortChain, PortChain oldPortChain) {
+        return new DefaultPortChain(newPortChain.portChainId(), newPortChain.tenantId(),
+                                    newPortChain.name(), newPortChain.description(),
+                                    newPortChain.portPairGroups(), newPortChain.flowClassifiers(), oldPortChain);
     }
 
     /**
@@ -109,7 +125,7 @@
 
     @Override
     public List<PortPairGroupId> portPairGroups() {
-        return  ImmutableList.copyOf(portPairGroupList);
+        return ImmutableList.copyOf(portPairGroupList);
     }
 
     @Override
@@ -118,6 +134,11 @@
     }
 
     @Override
+    public PortChain oldPortChain() {
+        return oldPortChain;
+    }
+
+    @Override
     public void addLoadBalancePath(FiveTuple fiveTuple, LoadBalanceId id,
                                    List<PortPairId> path) {
         this.sfcLoadBalanceIdMap.put(fiveTuple, id);
@@ -136,14 +157,14 @@
 
     @Override
     public void removeSfcClassifiers(LoadBalanceId id, List<DeviceId> classifierList) {
-        List<DeviceId> list = getSfcClassifiers(id);
+        List<DeviceId> list = sfcClassifiersMap.get(id);
         list.removeAll(classifierList);
         this.sfcForwardersMap.put(id, list);
     }
 
     @Override
     public void removeSfcForwarders(LoadBalanceId id, List<DeviceId> forwarderList) {
-        List<DeviceId> list = getSfcForwarders(id);
+        List<DeviceId> list = sfcForwardersMap.get(id);
         list.removeAll(forwarderList);
         this.sfcForwardersMap.put(id, list);
     }
@@ -192,7 +213,7 @@
     }
 
     @Override
-    public Optional<LoadBalanceId> matchPath(List<PortPairId> path) {
+    public LoadBalanceId matchPath(List<PortPairId> path) {
 
         LoadBalanceId id = null;
         for (Map.Entry<LoadBalanceId, List<PortPairId>> entry : sfcLoadBalancePathMap.entrySet()) {
@@ -202,7 +223,7 @@
                 break;
             }
         }
-        return Optional.of(id);
+        return id;
     }
 
     @Override
@@ -267,6 +288,7 @@
         private String description;
         private List<PortPairGroupId> portPairGroupList;
         private List<FlowClassifierId> flowClassifierList;
+        private PortChain portChain;
 
         @Override
         public Builder setId(PortChainId portChainId) {
@@ -312,7 +334,7 @@
             checkNotNull(portPairGroupList, "Port pair groups cannot be null");
 
             return new DefaultPortChain(portChainId, tenantId, name, description,
-                                        portPairGroupList, flowClassifierList);
+                                        portPairGroupList, flowClassifierList, portChain);
         }
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultPortPairGroup.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultPortPairGroup.java
index 9817b0a..af929dd 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultPortPairGroup.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultPortPairGroup.java
@@ -95,6 +95,13 @@
     }
 
     @Override
+    public void resetLoad() {
+        for (PortPairId portPairId : portPairList) {
+            portPairLoadMap.put(portPairId, new Integer(0));
+        }
+    }
+
+    @Override
     public int getLoad(PortPairId portPairId) {
         return portPairLoadMap.get(portPairId);
     }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortChain.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortChain.java
index 2906411..c431c7a 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortChain.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortChain.java
@@ -16,7 +16,6 @@
 package org.onosproject.vtnrsc;
 
 import java.util.List;
-import java.util.Optional;
 import java.util.Set;
 
 import org.onosproject.net.DeviceId;
@@ -74,6 +73,13 @@
     List<FlowClassifierId> flowClassifiers();
 
     /**
+     * Returns the old port chain.
+     *
+     * @return old port chain
+     */
+    PortChain oldPortChain();
+
+    /**
      * Adds a new load balanced path.
      *
      * @param fiveTuple five tuple from the packet
@@ -182,7 +188,7 @@
      * @param path load balanced path
      * @return load balance id if the path matches, null otherwise.
      */
-    Optional<LoadBalanceId> matchPath(List<PortPairId> path);
+    LoadBalanceId matchPath(List<PortPairId> path);
 
     /**
      * Returns whether this port chain is an exact match to the port chain given
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairGroup.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairGroup.java
index bdcfd1d..0114470 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairGroup.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/PortPairGroup.java
@@ -67,6 +67,11 @@
     void addLoad(PortPairId portPairId);
 
     /**
+     * Reset the load for all the port pairs in the group.
+     */
+    void resetLoad();
+
+    /**
      * Get the load on the given port pair id.
      *
      * @param portPairId port pair id
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java
index 25fca33..5521d2e 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.vtnrsc.flowclassifier.impl;
 
-import static org.slf4j.LoggerFactory.getLogger;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.UUID;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -24,6 +26,7 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.IpPrefix;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -33,8 +36,11 @@
 import org.onosproject.store.service.MultiValuedTimestamp;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
-import org.onosproject.vtnrsc.FlowClassifierId;
+import org.onosproject.vtnrsc.DefaultFlowClassifier;
 import org.onosproject.vtnrsc.FlowClassifier;
+import org.onosproject.vtnrsc.FlowClassifierId;
+import org.onosproject.vtnrsc.TenantId;
+import org.onosproject.vtnrsc.VirtualPortId;
 import org.onosproject.vtnrsc.flowclassifier.FlowClassifierEvent;
 import org.onosproject.vtnrsc.flowclassifier.FlowClassifierListener;
 import org.onosproject.vtnrsc.flowclassifier.FlowClassifierService;
@@ -71,7 +77,8 @@
         KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
                 .register(KryoNamespaces.API)
                 .register(MultiValuedTimestamp.class)
-                .register(FlowClassifier.class);
+                .register(FlowClassifier.class, FlowClassifierId.class, UUID.class, IpPrefix.class,
+                          VirtualPortId.class, DefaultFlowClassifier.class, TenantId.class);
         flowClassifierStore = storageService
                 .<FlowClassifierId, FlowClassifier>eventuallyConsistentMapBuilder()
                 .withName("flowclassifierstore").withSerializer(serializer)
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java
index 21c848b..21a3d2d 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java
@@ -19,6 +19,7 @@
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.util.Collections;
+import java.util.UUID;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -28,6 +29,7 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.event.AbstractListenerManager;
+import org.onosproject.net.DeviceId;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.EventuallyConsistentMap;
 import org.onosproject.store.service.EventuallyConsistentMapEvent;
@@ -35,8 +37,15 @@
 import org.onosproject.store.service.MultiValuedTimestamp;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+import org.onosproject.vtnrsc.DefaultPortChain;
+import org.onosproject.vtnrsc.FiveTuple;
+import org.onosproject.vtnrsc.FlowClassifierId;
+import org.onosproject.vtnrsc.LoadBalanceId;
 import org.onosproject.vtnrsc.PortChain;
 import org.onosproject.vtnrsc.PortChainId;
+import org.onosproject.vtnrsc.PortPairGroupId;
+import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.TenantId;
 import org.onosproject.vtnrsc.portchain.PortChainEvent;
 import org.onosproject.vtnrsc.portchain.PortChainListener;
 import org.onosproject.vtnrsc.portchain.PortChainService;
@@ -71,7 +80,9 @@
         KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
                 .register(KryoNamespaces.API)
                 .register(MultiValuedTimestamp.class)
-                .register(PortChain.class);
+                .register(PortChain.class, PortChainId.class, UUID.class, PortPairGroupId.class,
+                          FlowClassifierId.class, FiveTuple.class, LoadBalanceId.class, DeviceId.class,
+                          DefaultPortChain.class, PortPairId.class, TenantId.class);
 
         portChainStore = storageService
                 .<PortChainId, PortChain>eventuallyConsistentMapBuilder()
@@ -118,7 +129,7 @@
 
         portChainStore.put(portChain.portChainId(), portChain);
         if (!portChainStore.containsKey(portChain.portChainId())) {
-            log.debug("The portChain is created failed which identifier was {}", portChain.portChainId()
+            log.error("The portChain created is failed which identifier was {}", portChain.portChainId()
                       .toString());
             return false;
         }
@@ -128,18 +139,20 @@
     @Override
     public boolean updatePortChain(PortChain portChain) {
         checkNotNull(portChain, PORT_CHAIN_NULL);
-
+        PortChain oldPortChain = null;
         if (!portChainStore.containsKey(portChain.portChainId())) {
-            log.debug("The portChain is not exist whose identifier was {} ",
-                      portChain.portChainId().toString());
+            log.warn("The portChain is not exist whose identifier was {} ",
+                     portChain.portChainId().toString());
             return false;
+        } else {
+            oldPortChain = portChainStore.get(portChain.portChainId());
         }
+        PortChain newPortChain = DefaultPortChain.create(portChain, oldPortChain);
+        portChainStore.put(newPortChain.portChainId(), newPortChain);
 
-        portChainStore.put(portChain.portChainId(), portChain);
-
-        if (!portChain.equals(portChainStore.get(portChain.portChainId()))) {
+        if (!newPortChain.equals(portChainStore.get(newPortChain.portChainId()))) {
             log.debug("The portChain is updated failed whose identifier was {} ",
-                      portChain.portChainId().toString());
+                      newPortChain.portChainId().toString());
             return false;
         }
         return true;
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchainsfmap/impl/PortChainSfMapManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchainsfmap/impl/PortChainSfMapManager.java
index 2df0ee6..c769092 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchainsfmap/impl/PortChainSfMapManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchainsfmap/impl/PortChainSfMapManager.java
@@ -38,6 +38,7 @@
 import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
 import org.slf4j.Logger;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
 /**
@@ -86,13 +87,13 @@
         List<PortPairGroupId> portPairGrpList = portChain.portPairGroups();
         ListIterator<PortPairGroupId> listGrpIterator = portPairGrpList.listIterator();
 
-        while (listGrpIterator.next() != null) {
+        while (listGrpIterator.hasNext()) {
             PortPairGroupId portPairGroupId = listGrpIterator.next();
             PortPairGroup portPairGroup = portPairGroupService.getPortPairGroup(portPairGroupId);
             ServiceFunctionGroup sfg = new ServiceFunctionGroup(portPairGroup.name(), portPairGroup.description(),
                                                                 portPairGroup.portPairLoadMap());
             serviceFunctionGroupList.add(sfg);
         }
-        return serviceFunctionGroupList;
+        return ImmutableList.copyOf(serviceFunctionGroupList);
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java
index 4547764..18105b2 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java
@@ -19,6 +19,7 @@
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.util.Collections;
+import java.util.UUID;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -35,8 +36,10 @@
 import org.onosproject.store.service.MultiValuedTimestamp;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+import org.onosproject.vtnrsc.DefaultPortPair;
 import org.onosproject.vtnrsc.PortPair;
 import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.TenantId;
 import org.onosproject.vtnrsc.portpair.PortPairEvent;
 import org.onosproject.vtnrsc.portpair.PortPairListener;
 import org.onosproject.vtnrsc.portpair.PortPairService;
@@ -72,7 +75,7 @@
         KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
                 .register(KryoNamespaces.API)
                 .register(MultiValuedTimestamp.class)
-                .register(PortPair.class);
+                .register(PortPair.class, PortPairId.class, UUID.class, DefaultPortPair.class, TenantId.class);
 
         portPairStore = storageService.<PortPairId, PortPair>eventuallyConsistentMapBuilder()
                 .withName("portpairstore")
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java
index eca172c..7ef6999 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java
@@ -19,6 +19,7 @@
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.util.Collections;
+import java.util.UUID;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -35,8 +36,11 @@
 import org.onosproject.store.service.MultiValuedTimestamp;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+import org.onosproject.vtnrsc.DefaultPortPairGroup;
 import org.onosproject.vtnrsc.PortPairGroup;
 import org.onosproject.vtnrsc.PortPairGroupId;
+import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.TenantId;
 import org.onosproject.vtnrsc.portpairgroup.PortPairGroupEvent;
 import org.onosproject.vtnrsc.portpairgroup.PortPairGroupListener;
 import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
@@ -71,7 +75,8 @@
         KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
                 .register(KryoNamespaces.API)
                 .register(MultiValuedTimestamp.class)
-                .register(PortPairGroup.class);
+                .register(PortPairGroup.class, PortPairGroupId.class, UUID.class, DefaultPortPairGroup.class,
+                          TenantId.class, PortPairId.class);
 
         portPairGroupStore = storageService
                 .<PortPairGroupId, PortPairGroup>eventuallyConsistentMapBuilder()
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainDeviceMapWebResource.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainDeviceMapWebResource.java
new file mode 100644
index 0000000..b391ae4
--- /dev/null
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainDeviceMapWebResource.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2014-2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.vtnweb.resources;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsNotFound;
+
+import java.util.Set;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.onosproject.codec.CodecContext;
+import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.vtnrsc.LoadBalanceId;
+import org.onosproject.vtnrsc.PortChain;
+import org.onosproject.vtnrsc.PortChainId;
+import org.onosproject.vtnrsc.portchain.PortChainService;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * Query and program port chain.
+ */
+
+@Path("portChainDeviceMap")
+public class PortChainDeviceMapWebResource extends AbstractWebResource {
+
+    public static final String PORT_CHAIN_NOT_FOUND = "Port chain not found";
+    public static final String PORT_CHAIN_ID_EXIST = "Port chain exists";
+    public static final String PORT_CHAIN_ID_NOT_EXIST = "Port chain does not exist with identifier";
+
+    private static final String NAME = "name";
+    private static final String ID = "id";
+    private static final String CLASSIFIERS = "classifiers";
+    private static final String FORWARDERS = "forwarders";
+    private static final String LOADBALANCEID = "loadBalanceId";
+
+    /**
+     * Get details of a specified port chain id.
+     *
+     * @param id port chain id
+     * @return 200 OK, 404 if given identifier does not exist
+     */
+    @GET
+    @Path("{chain_id}")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response getPortChainDeviceMap(@PathParam("chain_id") String id) {
+
+        PortChain portChain = nullIsNotFound(get(PortChainService.class).getPortChain(PortChainId.of(id)),
+                                             PORT_CHAIN_NOT_FOUND);
+        ObjectNode result = mapper().createObjectNode();
+        result.set("portChainDeviceMap", encode(portChain, this));
+
+        return ok(result.toString()).build();
+    }
+
+    private ObjectNode encode(PortChain portChain, CodecContext context) {
+        checkNotNull(portChain, "portChain cannot be null");
+        ObjectNode result = context.mapper().createObjectNode();
+        result.put(ID, portChain.portChainId().toString())
+        .put(NAME, portChain.name());
+
+        Set<LoadBalanceId> loadBalanceIds = portChain.getLoadBalancePathMapKeys();
+        for (LoadBalanceId id : loadBalanceIds) {
+            result.put(LOADBALANCEID, id.toString())
+            .put(CLASSIFIERS, portChain.getSfcClassifiers(id).toString())
+            .put(FORWARDERS, portChain.getSfcForwarders(id).toString());
+        }
+        return result;
+    }
+}
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainSfMapWebResource.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainSfMapWebResource.java
new file mode 100644
index 0000000..b644786
--- /dev/null
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/PortChainSfMapWebResource.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.vtnweb.resources;
+
+import static org.onlab.util.Tools.nullIsNotFound;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.vtnrsc.PortChainId;
+import org.onosproject.vtnrsc.ServiceFunctionGroup;
+import org.onosproject.vtnrsc.portchainsfmap.PortChainSfMapService;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * Query service function and load details by port chain.
+ */
+
+@Path("portChainSfMap")
+public class PortChainSfMapWebResource extends AbstractWebResource {
+
+    public static final String PORT_CHAIN_NOT_FOUND = "Port chain not found";
+    public static final String PORT_CHAIN_ID_EXIST = "Port chain exists";
+    public static final String PORT_CHAIN_ID_NOT_EXIST = "Port chain does not exist with identifier";
+
+    /**
+     * Get service function details of a specified port chain id.
+     *
+     * @param id port chain id
+     * @return 200 OK, 404 if given identifier does not exist
+     */
+    @GET
+    @Path("{chainId}")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response getPortChainSfMap(@PathParam("chainId") String id) {
+
+        Iterable<ServiceFunctionGroup> serviceFunctionGroups = nullIsNotFound(get(PortChainSfMapService.class)
+                .getServiceFunctions(PortChainId.of(id)),
+                                                                              PORT_CHAIN_NOT_FOUND);
+        ObjectNode result = mapper().createObjectNode();
+        ArrayNode portChainSfMap = result.putArray("portChainSfMap");
+        if (serviceFunctionGroups != null) {
+            for (final ServiceFunctionGroup serviceFunctionGroup : serviceFunctionGroups) {
+                portChainSfMap.add(codec(ServiceFunctionGroup.class).encode(serviceFunctionGroup, this));
+            }
+        }
+        return ok(result.toString()).build();
+    }
+}
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/VtnWebApplication.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/VtnWebApplication.java
index f22f6df..142be79 100644
--- a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/VtnWebApplication.java
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/VtnWebApplication.java
@@ -35,7 +35,9 @@
                           PortPairWebResource.class,
                           FloatingIpWebResource.class,
                           RouterWebResource.class,
-                          ClassifierWebResource.class);
+                          ClassifierWebResource.class,
+                          PortChainSfMapWebResource.class,
+                          PortChainDeviceMapWebResource.class);
     }
 }
 
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java
index 94e02db..e4d4b93 100644
--- a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/FlowClassifierCodec.java
@@ -80,8 +80,10 @@
             resultBuilder.setProtocol(protocol);
         }
 
-        int priority = (json.get(PRIORITY)).asInt();
-        resultBuilder.setPriority(priority);
+        if (json.get(PRIORITY) != null && !(json.get(PRIORITY)).asText().equals("null")) {
+            int priority = (json.get(PRIORITY)).asInt();
+            resultBuilder.setPriority(priority);
+        }
 
         int minSrcPortRange = (json.get(MIN_SRC_PORT_RANGE)).asInt();
         resultBuilder.setMinSrcPortRange(minSrcPortRange);
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/ServiceFunctionCodec.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/ServiceFunctionCodec.java
new file mode 100644
index 0000000..f847b10
--- /dev/null
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/ServiceFunctionCodec.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.vtnweb.web;
+
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.vtnrsc.ServiceFunctionGroup;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * Service function JSON codec.
+ */
+public final class ServiceFunctionCodec extends JsonCodec<ServiceFunctionGroup> {
+
+    private static final String NAME = "name";
+    private static final String DESCRIPTION = "description";
+    private static final String PORT_PAIR_LOAD = "port_pair_load";
+    @Override
+    public ObjectNode encode(ServiceFunctionGroup serviceFunction, CodecContext context) {
+        checkNotNull(serviceFunction, "service cannot be null");
+        ObjectNode result = context.mapper().createObjectNode()
+                .put(NAME, serviceFunction.name())
+                .put(DESCRIPTION, serviceFunction.description())
+                .put(PORT_PAIR_LOAD, serviceFunction.portPairLoadMap().toString());
+        return result;
+    }
+}
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java
index 3330c25..84ac4a8 100644
--- a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java
@@ -25,6 +25,7 @@
 import org.onosproject.vtnrsc.PortChain;
 import org.onosproject.vtnrsc.PortPair;
 import org.onosproject.vtnrsc.PortPairGroup;
+import org.onosproject.vtnrsc.ServiceFunctionGroup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,7 +46,7 @@
         codecService.registerCodec(PortPairGroup.class, new PortPairGroupCodec());
         codecService.registerCodec(FlowClassifier.class, new FlowClassifierCodec());
         codecService.registerCodec(PortChain.class, new PortChainCodec());
-
+        codecService.registerCodec(ServiceFunctionGroup.class, new ServiceFunctionCodec());
         log.info("Started");
     }
 
diff --git a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainDeviceMapResourceTest.java b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainDeviceMapResourceTest.java
new file mode 100644
index 0000000..e173051
--- /dev/null
+++ b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainDeviceMapResourceTest.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.vtnweb.resources;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import javax.ws.rs.client.WebTarget;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.osgi.TestServiceDirectory;
+import org.onlab.rest.BaseResource;
+import org.onosproject.codec.CodecService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.vtnrsc.FiveTuple;
+import org.onosproject.vtnrsc.FlowClassifierId;
+import org.onosproject.vtnrsc.LoadBalanceId;
+import org.onosproject.vtnrsc.PortChain;
+import org.onosproject.vtnrsc.PortChainId;
+import org.onosproject.vtnrsc.PortPairGroupId;
+import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.TenantId;
+import org.onosproject.vtnrsc.portchain.PortChainService;
+import org.onosproject.vtnweb.web.SfcCodecContext;
+
+import com.eclipsesource.json.Json;
+import com.eclipsesource.json.JsonObject;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
+/**
+ * Unit tests for port chain device map REST APIs.
+ */
+public class PortChainDeviceMapResourceTest extends VtnResourceTest {
+
+    final PortChainService portChainService = createMock(PortChainService.class);
+
+    PortChainId portChainId1 = PortChainId.of("78dcd363-fc23-aeb6-f44b-56dc5e2fb3ae");
+    TenantId tenantId1 = TenantId.tenantId("d382007aa9904763a801f68ecf065cf5");
+    private final List<PortPairGroupId> portPairGroupList1 = Lists.newArrayList();
+    private final List<FlowClassifierId> flowClassifierList1 = Lists.newArrayList();
+
+    final MockPortChain portChain1 = new MockPortChain(portChainId1, tenantId1, "portChain1",
+                                                       "Mock port chain", portPairGroupList1,
+                                                       flowClassifierList1);
+
+    /**
+     * Mock class for a port chain.
+     */
+    private static class MockPortChain implements PortChain {
+
+        private final PortChainId portChainId;
+        private final TenantId tenantId;
+        private final String name;
+        private final String description;
+        private final List<PortPairGroupId> portPairGroupList;
+        private final List<FlowClassifierId> flowClassifierList;
+
+        public MockPortChain(PortChainId portChainId, TenantId tenantId,
+                String name, String description,
+                List<PortPairGroupId> portPairGroupList,
+                List<FlowClassifierId> flowClassifierList) {
+
+            this.portChainId = portChainId;
+            this.tenantId = tenantId;
+            this.name = name;
+            this.description = description;
+            this.portPairGroupList = portPairGroupList;
+            this.flowClassifierList = flowClassifierList;
+        }
+
+        @Override
+        public PortChainId portChainId() {
+            return portChainId;
+        }
+
+        @Override
+        public TenantId tenantId() {
+            return tenantId;
+        }
+
+        @Override
+        public String name() {
+            return name;
+        }
+
+        @Override
+        public String description() {
+            return description;
+        }
+
+        @Override
+        public List<PortPairGroupId> portPairGroups() {
+            return ImmutableList.copyOf(portPairGroupList);
+        }
+
+        @Override
+        public List<FlowClassifierId> flowClassifiers() {
+            return ImmutableList.copyOf(flowClassifierList);
+        }
+
+        @Override
+        public boolean exactMatch(PortChain portChain) {
+            return this.equals(portChain) &&
+                    Objects.equals(this.portChainId, portChain.portChainId()) &&
+                    Objects.equals(this.tenantId, portChain.tenantId());
+        }
+
+        @Override
+        public void addLoadBalancePath(FiveTuple fiveTuple, LoadBalanceId id, List<PortPairId> path) {
+        }
+
+        @Override
+        public LoadBalanceId getLoadBalanceId(FiveTuple fiveTuple) {
+            return null;
+        }
+
+        @Override
+        public Set<FiveTuple> getLoadBalanceIdMapKeys() {
+            return null;
+        }
+
+        @Override
+        public List<PortPairId> getLoadBalancePath(LoadBalanceId id) {
+            return null;
+        }
+
+        @Override
+        public List<PortPairId> getLoadBalancePath(FiveTuple fiveTuple) {
+            return null;
+        }
+
+        @Override
+        public LoadBalanceId matchPath(List<PortPairId> path) {
+            return null;
+        }
+
+        @Override
+        public int getLoadBalancePathSize() {
+            return 0;
+        }
+
+        @Override
+        public void addSfcClassifiers(LoadBalanceId id, List<DeviceId> classifierList) {
+        }
+
+        @Override
+        public void addSfcForwarders(LoadBalanceId id, List<DeviceId> forwarderList) {
+        }
+
+        @Override
+        public void removeSfcClassifiers(LoadBalanceId id, List<DeviceId> classifierList) {
+        }
+
+        @Override
+        public void removeSfcForwarders(LoadBalanceId id, List<DeviceId> forwarderList) {
+        }
+
+        @Override
+        public List<DeviceId> getSfcClassifiers(LoadBalanceId id) {
+            DeviceId deviceId1 = DeviceId.deviceId("of:000000000000001");
+            List<DeviceId> classifierList = Lists.newArrayList();
+            classifierList.add(deviceId1);
+            return classifierList;
+        }
+
+        @Override
+        public List<DeviceId> getSfcForwarders(LoadBalanceId id) {
+            DeviceId deviceId1 = DeviceId.deviceId("of:000000000000002");
+            DeviceId deviceId2 = DeviceId.deviceId("of:000000000000003");
+            List<DeviceId> forwarderList = Lists.newArrayList();
+            forwarderList.add(deviceId1);
+            forwarderList.add(deviceId2);
+            return forwarderList;
+        }
+
+        @Override
+        public Set<LoadBalanceId> getLoadBalancePathMapKeys() {
+            LoadBalanceId id = LoadBalanceId.of((byte) 1);
+            Set<LoadBalanceId> set = new HashSet<LoadBalanceId>();
+            set.add(id);
+            return set;
+        }
+
+        @Override
+        public PortChain oldPortChain() {
+            return null;
+        }
+    }
+
+    /**
+     * Sets up the global values for all the tests.
+     */
+    @Before
+    public void setUpTest() {
+        SfcCodecContext context = new SfcCodecContext();
+        ServiceDirectory testDirectory = new TestServiceDirectory()
+        .add(PortChainService.class, portChainService)
+        .add(CodecService.class, context.codecManager());
+        BaseResource.setServiceDirectory(testDirectory);
+    }
+
+    /**
+     * Cleans up.
+     */
+    @After
+    public void tearDownTest() {
+    }
+
+    /**
+     * Tests the result of a rest api GET for port chain id.
+     */
+    @Test
+    public void testGetPortChainDeviceMap() {
+
+        expect(portChainService.getPortChain(anyObject())).andReturn(portChain1).anyTimes();
+        replay(portChainService);
+
+        final WebTarget wt = target();
+        final String response = wt.path("portChainDeviceMap/1278dcd4-459f-62ed-754b-87fc5e4a6751").request()
+                .get(String.class);
+        final JsonObject result = Json.parse(response).asObject();
+        assertThat(result, notNullValue());
+        assertThat(result.names().get(0), is("portChainDeviceMap"));
+
+    }
+}
diff --git a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainResourceTest.java b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainResourceTest.java
index deac05f..8e96a3f 100644
--- a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainResourceTest.java
+++ b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainResourceTest.java
@@ -15,10 +15,29 @@
  */
 package org.onosproject.vtnweb.resources;
 
-import com.eclipsesource.json.Json;
-import com.eclipsesource.json.JsonObject;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -38,28 +57,10 @@
 import org.onosproject.vtnrsc.portchain.PortChainService;
 import org.onosproject.vtnweb.web.SfcCodecContext;
 
-import javax.ws.rs.NotFoundException;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
+import com.eclipsesource.json.Json;
+import com.eclipsesource.json.JsonObject;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 
 /**
  * Unit tests for port chain REST APIs.
@@ -165,7 +166,7 @@
         }
 
         @Override
-        public Optional<LoadBalanceId> matchPath(List<PortPairId> path) {
+        public LoadBalanceId matchPath(List<PortPairId> path) {
             return null;
         }
 
@@ -204,6 +205,11 @@
         public Set<LoadBalanceId> getLoadBalancePathMapKeys() {
             return null;
         }
+
+        @Override
+        public PortChain oldPortChain() {
+            return null;
+        }
     }
 
     /**
diff --git a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainSfMapResourceTest.java b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainSfMapResourceTest.java
new file mode 100644
index 0000000..b95817c
--- /dev/null
+++ b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortChainSfMapResourceTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.vtnweb.resources;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.ws.rs.client.WebTarget;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.osgi.TestServiceDirectory;
+import org.onlab.rest.BaseResource;
+import org.onosproject.codec.CodecService;
+import org.onosproject.vtnrsc.PortPairId;
+import org.onosproject.vtnrsc.ServiceFunctionGroup;
+import org.onosproject.vtnrsc.portchainsfmap.PortChainSfMapService;
+import org.onosproject.vtnweb.web.SfcCodecContext;
+
+import com.eclipsesource.json.Json;
+import com.eclipsesource.json.JsonObject;
+import com.google.common.collect.Lists;
+
+/**
+ * Unit tests for port chain sf map REST APIs.
+ */
+public class PortChainSfMapResourceTest extends VtnResourceTest {
+
+    final PortChainSfMapService portChainSfMapService = createMock(PortChainSfMapService.class);
+
+    String name1 = "Firewall";
+    String description1 = "Firewall service function";
+    Map<PortPairId, Integer> portPairLoadMap1 = new ConcurrentHashMap<>();
+
+    ServiceFunctionGroup serviceFunction1 = new ServiceFunctionGroup(name1, description1,
+                                                                     portPairLoadMap1);
+
+    /**
+     * Sets up the global values for all the tests.
+     */
+    @Before
+    public void setUpTest() {
+        SfcCodecContext context = new SfcCodecContext();
+        ServiceDirectory testDirectory = new TestServiceDirectory()
+                .add(PortChainSfMapService.class, portChainSfMapService)
+                .add(CodecService.class, context.codecManager());
+        BaseResource.setServiceDirectory(testDirectory);
+    }
+
+    /**
+     * Cleans up.
+     */
+    @After
+    public void tearDownTest() {
+    }
+
+    /**
+     * Tests the result of a rest api GET for port chain id.
+     */
+    @Test
+    public void testGetPortChainId() {
+
+        final List<ServiceFunctionGroup> serviceFunctions = Lists.newArrayList();
+        serviceFunctions.add(serviceFunction1);
+
+        expect(portChainSfMapService.getServiceFunctions(anyObject())).andReturn(serviceFunctions).anyTimes();
+        replay(portChainSfMapService);
+
+        final WebTarget wt = target();
+        final String response = wt.path("portChainSfMap/1278dcd4-459f-62ed-754b-87fc5e4a6751").request()
+                .get(String.class);
+        final JsonObject result = Json.parse(response).asObject();
+        assertThat(result, notNullValue());
+        assertThat(result.names().get(0), is("portChainSfMap"));
+    }
+}
diff --git a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortPairGroupResourceTest.java b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortPairGroupResourceTest.java
index c33d929..94aab56 100644
--- a/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortPairGroupResourceTest.java
+++ b/apps/vtn/vtnweb/src/test/java/org/onosproject/vtnweb/resources/PortPairGroupResourceTest.java
@@ -136,6 +136,10 @@
                     Objects.equals(this.portPairGroupId, portPairGroup.portPairGroupId()) &&
                     Objects.equals(this.tenantId, portPairGroup.tenantId());
         }
+
+        @Override
+        public void resetLoad() {
+        }
     }
 
     /**
