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
index 069cfd1..aa60f64 100644
--- 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
@@ -15,37 +15,48 @@
  */
 package org.onosproject.sfc.forwarder;
 
-import org.onosproject.net.flowobjective.Objective;
+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.
+ * Abstraction of an entity which provides service function forwarder.
  */
 public interface ServiceFunctionForwarderService {
 
     /**
-     * Install Forwarding rule.
+     * Install forwarding rule.
      *
      * @param portChain port-chain
      * @param nshSpi nsh spi
      */
+    @Deprecated
     void installForwardingRule(PortChain portChain, NshServicePathId nshSpi);
 
     /**
-     * Uninstall Forwarding rule.
+     * Uninstall forwarding rule.
      *
      * @param portChain port-chain
      * @param nshSpi nsh spi
      */
+    @Deprecated
     void unInstallForwardingRule(PortChain portChain, NshServicePathId nshSpi);
 
     /**
-     * Prepare forwarding object for Service Function.
+     * Install load balanced forwarding rules.
      *
-     * @param portChain port-chain
-     * @param nshSpi nsh spi
-     * @param type forwarding objective operation type
+     * @param path load balanced path of port pairs
+     * @param nshSpi nsh service path index
      */
-    void prepareServiceFunctionForwarder(PortChain portChain, NshServicePathId nshSpi, Objective.Operation type);
+    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
index 4eab2bf..e59b3a7 100644
--- 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
@@ -15,13 +15,17 @@
  */
 package org.onosproject.sfc.forwarder.impl;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
+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;
@@ -46,8 +50,6 @@
 import org.onosproject.sfc.forwarder.ServiceFunctionForwarderService;
 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;
@@ -58,46 +60,25 @@
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
 import org.slf4j.Logger;
 
-import java.util.List;
-import java.util.ListIterator;
-
-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;
-
 /**
- * Provides Service Function Forwarder implementation.
+ * Provides service function forwarder implementation.
  */
-@Component(immediate = true)
-@Service
 public class ServiceFunctionForwarderImpl implements ServiceFunctionForwarderService {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected HostService hostService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DriverService driverService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected VirtualPortService virtualPortService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected VtnRscService vtnRscService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected PortPairService portPairService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected PortPairGroupService portPairGroupService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected FlowClassifierService flowClassifierService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected PortChainService portChainService;
-
     private final Logger log = getLogger(getClass());
-    protected ApplicationId appId;
+    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 DRIVER_NAME = "onosfw";
-    private static final String PORT_CHAIN_NOT_NULL = "Port-Chain cannot be null";
-    private static final String PORT_CHAIN_ID_NOT_NULL = "Port-Chain-Id cannot be null";
+    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";
-    private static final int NULL = 0;
 
     /**
      * Default constructor.
@@ -108,129 +89,118 @@
     /**
      * Explicit constructor.
      *
-     * @param appId Application id
+     * @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) {
-        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
-        prepareServiceFunctionForwarder(portChain, nshSpi, Objective.Operation.ADD);
+        //TODO this method will be removed
     }
 
     @Override
     public void unInstallForwardingRule(PortChain portChain, NshServicePathId nshSpi) {
-        checkNotNull(portChain, PORT_CHAIN_NOT_NULL);
-        prepareServiceFunctionForwarder(portChain, nshSpi, Objective.Operation.REMOVE);
+        //TODO this method will be removed
     }
 
     @Override
-    public void prepareServiceFunctionForwarder(PortChain portChain, NshServicePathId nshSpi,
-                                                Objective.Operation type) {
+    public void installLoadBalancedForwardingRule(List<PortPairId> path, NshServicePathId nshSpi) {
+        checkNotNull(path, PATH_NOT_NULL);
+        processForwardingRule(path, nshSpi, Objective.Operation.ADD);
+    }
 
-        // Go through the port pair group list
-        List<PortPairGroupId> portPairGrpList = portChain.portPairGroups();
-        ListIterator<PortPairGroupId> listGrpIterator = portPairGrpList.listIterator();
-
-        // Get source port pair group
-        if (!listGrpIterator.hasNext()) {
-            return;
-        }
-        PortPairGroupId portPairGrpId = listGrpIterator.next();
-        PortPairGroup currentPortPairGroup = portPairGroupService.getPortPairGroup(portPairGrpId);
-
-        // Get destination port pair group
-        if (!listGrpIterator.hasNext()) {
-            return;
-        }
-        portPairGrpId = listGrpIterator.next();
-        PortPairGroup nextPortPairGroup = portPairGroupService.getPortPairGroup(portPairGrpId);
-
-        // push SFF to OVS
-        pushServiceFunctionForwarder(currentPortPairGroup, nextPortPairGroup, listGrpIterator, nshSpi, type);
+    @Override
+    public void unInstallLoadBalancedForwardingRule(List<PortPairId> path, NshServicePathId nshSpi) {
+        checkNotNull(path, PATH_NOT_NULL);
+        processForwardingRule(path, nshSpi, Objective.Operation.REMOVE);
     }
 
     /**
-     * Push service-function-forwarder to OVS.
+     * Process the required forwarding rules for the given path.
      *
-     * @param currentPortPairGroup current port-pair-group
-     * @param nextPortPairGroup next port-pair-group
-     * @param listGrpIterator pointer to port-pair-group list
-     * @param nshSpi nsh service path id
-     * @param type objective type
+     * @param path list of port pair ids
+     * @param nshSpi service path index
+     * @param type operation type ADD/REMOVE
      */
-    public void pushServiceFunctionForwarder(PortPairGroup currentPortPairGroup, PortPairGroup nextPortPairGroup,
-            ListIterator<PortPairGroupId> listGrpIterator, NshServicePathId nshSpi, Objective.Operation type) {
-        DeviceId deviceId = null;
+    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;
-        PortPairGroupId portPairGrpId = null;
 
         // Travel from SF to SF.
         do {
-            // Get the required information on port pairs from source port pair
-            // group
-            List<PortPairId> portPairList = currentPortPairGroup.portPairs();
-            ListIterator<PortPairId> portPLIterator = portPairList.listIterator();
-            if (!portPLIterator.hasNext()) {
-                break;
-            }
-
-            PortPairId portPairId = portPLIterator.next();
-            PortPair portPair = portPairService.getPortPair(portPairId);
-
-            currentDeviceId = vtnRscService.getSfToSffMaping(VirtualPortId.portId(portPair.ingress()));
-            if (deviceId == null) {
-                deviceId = currentDeviceId;
-            }
-
+            currentDeviceId = vtnRscService.getSfToSffMaping(VirtualPortId.portId(currentPortPair.egress()));
+            nextDeviceId = vtnRscService.getSfToSffMaping(VirtualPortId.portId(nextPortPair.ingress()));
             // pack traffic selector
-            TrafficSelector.Builder selector = packTrafficSelector(deviceId, portPair, nshSpi);
+            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);
 
-            // Get the required information on port pairs from destination port
-            // pair group
-            portPairList = nextPortPairGroup.portPairs();
-            portPLIterator = portPairList.listIterator();
-            if (!portPLIterator.hasNext()) {
-                break;
+                // 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);
             }
 
-            portPairId = portPLIterator.next();
-            portPair = portPairService.getPortPair(portPairId);
-
-            nextDeviceId = vtnRscService.getSfToSffMaping(VirtualPortId.portId(portPair.ingress()));
-
-            // pack traffic treatment
-            TrafficTreatment.Builder treatment = packTrafficTreatment(currentDeviceId, nextDeviceId, portPair);
-
-            // Send SFF to OVS
-            sendServiceFunctionForwarder(selector, treatment, deviceId, type);
-
-            // Replace source port pair group with destination port pair group
-            // for moving to next SFF processing.
-            currentPortPairGroup = nextPortPairGroup;
-            if (!listGrpIterator.hasNext()) {
+            // Move to next service function
+            currentPortPair = nextPortPair;
+            if (!portPairListIterator.hasNext()) {
                 break;
             }
-            portPairGrpId = listGrpIterator.next();
-            nextPortPairGroup = portPairGroupService.getPortPairGroup(portPairGrpId);
+            nextPortPair = portPairService.getPortPair(portPairListIterator.next());
         } while (true);
     }
 
     /**
-     * Pack Traffic selector.
+     * Pack traffic selector.
      *
      * @param deviceId device id
      * @param portPair port-pair
-     * @param nshSpi nsh spi
-     * @return traffic treatment
+     * @param nshSpi nsh service path index
+     * @return traffic selector
      */
-    public TrafficSelector.Builder packTrafficSelector(DeviceId deviceId, PortPair portPair, NshServicePathId nshSpi) {
+    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();
@@ -252,29 +222,30 @@
     }
 
     /**
-     * Pack Traffic treatment.
+     * Pack traffic treatment.
      *
-     * @param currentDeviceId current device id
-     * @param nextDeviceId next device id
-     * @param portPair port-pair
+     * @param portPair port pair
+     * @param isSameOvs whether the next port pair is in the same ovs
      * @return traffic treatment
      */
-    public TrafficTreatment.Builder packTrafficTreatment(DeviceId currentDeviceId, DeviceId nextDeviceId,
-            PortPair portPair) {
+    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 (currentDeviceId.equals(nextDeviceId)) {
+        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;
@@ -289,7 +260,9 @@
      * @param type operation type
      */
     public void sendServiceFunctionForwarder(TrafficSelector.Builder selector, TrafficTreatment.Builder treatment,
-            DeviceId deviceId, Objective.Operation type) {
+                                             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)) {
