diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
index 6250ffd..a0fc532 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.segmentrouting;
 
-
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableMap;
@@ -559,11 +559,12 @@
                                          String cP1InnerVlan, String cP1OuterVlan, String cP2,
                                          String cP2InnerVlan, String cP2OuterVlan,
                                          String mode, String sdTag) {
-
+        // Try to inject an empty Pwaas config if it is not found for the first time
         PwaasConfig config = cfgService.getConfig(appId(), PwaasConfig.class);
         if (config == null) {
-            log.warn("Configuration for Pwaas class could not be found!");
-            return L2TunnelHandler.Result.CONFIG_NOT_FOUND;
+            log.debug("Pwaas config not found. Try to create an empty one.");
+            cfgService.applyConfig(appId(), PwaasConfig.class, new ObjectMapper().createObjectNode());
+            config = cfgService.getConfig(appId(), PwaasConfig.class);
         }
 
         ObjectNode object = config.addPseudowire(tunnelId, pwLabel,
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/cli/PseudowireAddCommand.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/cli/PseudowireAddCommand.java
index d612475..d916823 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/cli/PseudowireAddCommand.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/cli/PseudowireAddCommand.java
@@ -98,7 +98,7 @@
                 print("Configuration for pwaas was not found! Initialize the configuration first through netcfg.");
                 break;
             default:
-                print("Pseudowire was added to the configuration succesfully, please do check logs for any errors!");
+                break;
         }
 
     }
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/cli/PseudowireRemoveCommand.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/cli/PseudowireRemoveCommand.java
index 782b339..098bbf9 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/cli/PseudowireRemoveCommand.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/cli/PseudowireRemoveCommand.java
@@ -54,7 +54,7 @@
                 error("Could not fetch pseudowire class configuration!");
                 break;
             default:
-                return;
+                break;
             }
     }
 }
\ No newline at end of file
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/pwaas/L2TunnelHandler.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/pwaas/L2TunnelHandler.java
index 8b334ea..c56af04 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/pwaas/L2TunnelHandler.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/pwaas/L2TunnelHandler.java
@@ -62,6 +62,7 @@
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static org.onosproject.net.flowobjective.ForwardingObjective.Flag.VERSATILE;
 import static org.onosproject.segmentrouting.pwaas.L2TunnelHandler.Pipeline.INITIATION;
 import static org.onosproject.segmentrouting.pwaas.L2TunnelHandler.Pipeline.TERMINATION;
@@ -214,6 +215,8 @@
      * @param event network config add event
      */
     public void processPwaasConfigAdded(NetworkConfigEvent event) {
+        checkArgument(event.config().isPresent(),
+                "Config is not presented in PwaasConfigAdded event {}", event);
 
         log.info("Network event : Pseudowire configuration added!");
         PwaasConfig config = (PwaasConfig) event.config().get();
@@ -241,7 +244,7 @@
      * @param egressInner  vlanid of egress inner
      * @return returns the vlan id which will be installed at vlan table 1.
      */
-    public VlanId determineEgressVlan(VlanId ingressOuter, VlanId ingressInner,
+    private VlanId determineEgressVlan(VlanId ingressOuter, VlanId ingressInner,
                                       VlanId egressOuter, VlanId egressInner) {
 
         // validity of vlan combinations was checked at verifyPseudowire
@@ -255,14 +258,16 @@
     }
 
     /**
-     * Adds a single pseudowire. This method can be called from cli commands
+     * Adds a single pseudowire from leaf to a leaf.
+     * This method can be called from cli commands
      * without configration updates, thus it does not check for mastership
      * of the ingress pseudowire device.
      *
      * @param pw The pseudowire
-     * @return
+     * @param spinePw True if pseudowire is from leaf to spine
+     * @return result of pseudowire deployment
      */
-    private Result deployPseudowire(DefaultL2TunnelDescription pw) {
+    private Result deployPseudowire(DefaultL2TunnelDescription pw, boolean spinePw) {
 
         Result result;
         long l2TunnelId;
@@ -283,11 +288,31 @@
             return WRONG_PARAMETERS;
         }
 
+        Link fwdNextHop;
+        Link revNextHop;
+        if (!spinePw) {
+            if (path.size() != 2) {
+                log.info("Deploying process : Path between two leafs should have size of 2, for pseudowire {}",
+                         l2TunnelId);
+                return INTERNAL_ERROR;
+            }
+
+            fwdNextHop = path.get(0);
+            revNextHop = reverseLink(path.get(1));
+        } else {
+            if (path.size() != 1) {
+                log.info("Deploying process : Path between leaf spine should equal to 2, for pseudowire {}",
+                         l2TunnelId);
+                return INTERNAL_ERROR;
+            }
+
+            fwdNextHop = path.get(0);
+            revNextHop = reverseLink(path.get(0));
+        }
+
         pw.l2Tunnel().setPath(path);
 
         // next hops for next objectives
-        Link fwdNextHop = path.get(0);
-        Link revNextHop = reverseLink(path.get(1));
 
         log.info("Deploying process : Establishing forward direction for pseudowire {}", l2TunnelId);
 
@@ -297,7 +322,8 @@
                                       pw.l2TunnelPolicy().cP1(),
                                       pw.l2TunnelPolicy().cP2(),
                                       FWD,
-                                      fwdNextHop);
+                                      fwdNextHop,
+                                      spinePw);
         if (result != SUCCESS) {
             log.info("Deploying process : Error in deploying pseudowire initiation for CP1");
             return Result.ADDITION_ERROR;
@@ -324,7 +350,8 @@
         result = deployPseudoWireTerm(pw.l2Tunnel(),
                                        pw.l2TunnelPolicy().cP2(),
                                        pw.l2TunnelPolicy().cP2OuterTag(),
-                                       FWD);
+                                       FWD,
+                                      spinePw);
 
         if (result != SUCCESS) {
             log.info("Deploying process : Error in deploying pseudowire termination for CP1");
@@ -339,7 +366,8 @@
                                        pw.l2TunnelPolicy().cP2(),
                                        pw.l2TunnelPolicy().cP1(),
                                        REV,
-                                       revNextHop);
+                                       revNextHop,
+                                       spinePw);
         if (result != SUCCESS) {
             log.info("Deploying process : Error in deploying pseudowire initiation for CP2");
             return Result.ADDITION_ERROR;
@@ -363,7 +391,8 @@
         result = deployPseudoWireTerm(pw.l2Tunnel(),
                                        pw.l2TunnelPolicy().cP1(),
                                        pw.l2TunnelPolicy().cP1OuterTag(),
-                                       REV);
+                                       REV,
+                                      spinePw);
 
         if (result != SUCCESS) {
             log.info("Deploying process : Error in deploying pseudowire termination for CP2");
@@ -394,27 +423,48 @@
         Result result;
 
         for (DefaultL2TunnelDescription currentL2Tunnel : pwToAdd) {
+            ConnectPoint cp1 = currentL2Tunnel.l2TunnelPolicy().cP1();
+            ConnectPoint cp2 = currentL2Tunnel.l2TunnelPolicy().cP2();
+            long tunnelId = currentL2Tunnel.l2TunnelPolicy().tunnelId();
 
             // only the master of CP1 will program this pseudowire
-            if (!srManager.isMasterOf(currentL2Tunnel.l2TunnelPolicy().cP1())) {
+            if (!srManager.isMasterOf(cp1)) {
+                log.debug("Not the master of {}. Ignore pseudo wire deployment id={}", cp1, tunnelId);
                 continue;
             }
 
-            log.info("Deploying pseudowire {}", currentL2Tunnel.l2Tunnel().tunnelId());
+            try {
+                // differentiate between leaf-leaf pseudowires and leaf-spine
+                // and pass the appropriate flag in them.
+                if (!srManager.deviceConfiguration().isEdgeDevice(cp1.deviceId()) &&
+                    !srManager.deviceConfiguration().isEdgeDevice(cp2.deviceId())) {
+                    log.warn("Can not deploy pseudowire from spine to spine!");
+                    result = Result.INTERNAL_ERROR;
+                } else if (srManager.deviceConfiguration().isEdgeDevice(cp1.deviceId()) &&
+                     srManager.deviceConfiguration().isEdgeDevice(cp2.deviceId())) {
+                    log.info("Deploying a leaf-leaf pseudowire {}", tunnelId);
+                    result = deployPseudowire(currentL2Tunnel, false);
+                } else {
+                    log.info("Deploying a leaf-spine pseudowire {}", tunnelId);
+                    result = deployPseudowire(currentL2Tunnel, true);
+                }
+            } catch (DeviceConfigNotFoundException e) {
+                log.error("Exception caught when deploying pseudowire", e.toString());
+                result = Result.INTERNAL_ERROR;
+            }
 
-            result = deployPseudowire(currentL2Tunnel);
             switch (result) {
+                case INTERNAL_ERROR:
+                    log.warn("Could not deploy pseudowire {}, internal error!", tunnelId);
+                    break;
                 case WRONG_PARAMETERS:
-                    log.warn("Could not deploy pseudowire {}, wrong parameters!",
-                             currentL2Tunnel.l2Tunnel().tunnelId());
+                    log.warn("Could not deploy pseudowire {}, wrong parameters!", tunnelId);
                     break;
                 case ADDITION_ERROR:
-                    log.warn("Could not deploy pseudowire {}, error in populating rules!",
-                             currentL2Tunnel.l2Tunnel().tunnelId());
+                    log.warn("Could not deploy pseudowire {}, error in populating rules!", tunnelId);
                     break;
                 default:
-                    log.info("Pseudowire with {} succesfully deployed!",
-                             currentL2Tunnel.l2Tunnel().tunnelId());
+                    log.info("Pseudowire with {} succesfully deployed!", tunnelId);
                     break;
             }
         }
@@ -426,6 +476,10 @@
      * @param event network config updated event
      */
     public void processPwaasConfigUpdated(NetworkConfigEvent event) {
+        checkArgument(event.config().isPresent(),
+                "Config is not presented in PwaasConfigUpdated event {}", event);
+        checkArgument(event.prevConfig().isPresent(),
+                "PrevConfig is not presented in PwaasConfigUpdated event {}", event);
 
         log.info("Pseudowire configuration updated.");
 
@@ -485,13 +539,32 @@
      * @param oldPw the pseudo wire to remove
      * @param newPw the pseudo wire to add
      */
-    public void updatePw(DefaultL2TunnelDescription oldPw, DefaultL2TunnelDescription newPw) {
+    private void updatePw(DefaultL2TunnelDescription oldPw,
+                         DefaultL2TunnelDescription newPw) {
+        ConnectPoint oldCp1 = oldPw.l2TunnelPolicy().cP1();
         long tunnelId = oldPw.l2Tunnel().tunnelId();
 
         // only the master of CP1 will update this pseudowire
         if (!srManager.isMasterOf(oldPw.l2TunnelPolicy().cP1())) {
+            log.debug("Not the master of {}. Ignore pseudo wire update id={}", oldCp1, tunnelId);
             return;
         }
+        // only determine if the new pseudowire is leaf-spine, because
+        // removal process is the same for both leaf-leaf and leaf-spine
+        // pws.
+        boolean newPwSpine;
+        try {
+            newPwSpine = !srManager.deviceConfiguration().isEdgeDevice(newPw.l2TunnelPolicy().cP1().deviceId()) ||
+                    !srManager.deviceConfiguration().isEdgeDevice(newPw.l2TunnelPolicy().cP2().deviceId());
+        } catch (DeviceConfigNotFoundException e) {
+            // if exception is caught treat the newpw as leaf-leaf
+            newPwSpine = false;
+        }
+
+        // copy the variable here because we need to
+        // use it in lambda thus it needs to be final
+        boolean finalNewPwSpine = newPwSpine;
+
 
         log.info("Updating pseudowire {}", oldPw.l2Tunnel().tunnelId());
 
@@ -525,7 +598,6 @@
                       FWD);
 
         log.debug("Update process : Start deleting rev policy for {}", tunnelId);
-
         egressVlan = determineEgressVlan(oldPw.l2TunnelPolicy().cP2OuterTag(),
                                           oldPw.l2TunnelPolicy().cP2InnerTag(),
                                           oldPw.l2TunnelPolicy().cP1OuterTag(),
@@ -542,40 +614,28 @@
             if (status == null) {
                 log.debug("Update process : Fwd policy removed. " +
                                   "Now remove fwd {} for {}", INITIATION, tunnelId);
-                tearDownPseudoWireInit(tunnelId,
-                                        oldPw.l2TunnelPolicy().cP1(),
-                                        fwdTermNextFuture,
-                                        FWD);
+                tearDownPseudoWireInit(tunnelId, oldPw.l2TunnelPolicy().cP1(), fwdTermNextFuture, FWD);
             }
         });
         revInitNextFuture.thenAcceptAsync(status -> {
             if (status == null) {
                 log.debug("Update process : Rev policy removed. " +
                                   "Now remove rev {} for {}", INITIATION, tunnelId);
-                tearDownPseudoWireInit(tunnelId,
-                                        oldPw.l2TunnelPolicy().cP2(),
-                                        revTermNextFuture,
-                                        REV);
+                tearDownPseudoWireInit(tunnelId, oldPw.l2TunnelPolicy().cP2(), revTermNextFuture, REV);
             }
         });
         fwdTermNextFuture.thenAcceptAsync(status -> {
             if (status == null) {
                 log.debug("Update process : Fwd {} removed. " +
                                   "Now remove fwd {} for {}", INITIATION, TERMINATION, tunnelId);
-                tearDownPseudoWireTerm(oldPw.l2Tunnel(),
-                                        oldPw.l2TunnelPolicy().cP2(),
-                                        fwdPwFuture,
-                                        FWD);
+                tearDownPseudoWireTerm(oldPw.l2Tunnel(), oldPw.l2TunnelPolicy().cP2(),  fwdPwFuture, FWD);
             }
         });
         revTermNextFuture.thenAcceptAsync(status -> {
             if (status == null) {
                 log.debug("Update process : Rev {} removed. " +
                                   "Now remove rev {} for {}", INITIATION, TERMINATION, tunnelId);
-                tearDownPseudoWireTerm(oldPw.l2Tunnel(),
-                                        oldPw.l2TunnelPolicy().cP1(),
-                                        revPwFuture,
-                                        REV);
+                tearDownPseudoWireTerm(oldPw.l2Tunnel(), oldPw.l2TunnelPolicy().cP1(), revPwFuture, REV);
             }
         });
 
@@ -588,10 +648,28 @@
             return;
         }
 
+        Link fwdNextHop, revNextHop;
+        if (!finalNewPwSpine) {
+            if (path.size() != 2) {
+                log.info("Update process : Error, path between two leafs should have size of 2, for pseudowire {}",
+                         newPw.l2Tunnel().tunnelId());
+                return;
+            }
+
+            fwdNextHop = path.get(0);
+            revNextHop = reverseLink(path.get(1));
+        } else {
+            if (path.size() != 1) {
+                log.info("Update process : Error, path between leaf spine should equal to 2, for pseudowire {}",
+                         newPw.l2Tunnel().tunnelId());
+                return;
+            }
+
+            fwdNextHop = path.get(0);
+            revNextHop = reverseLink(path.get(0));
+        }
+
         newPw.l2Tunnel().setPath(path);
-        // next hops for next objectives
-        Link fwdNextHop = path.get(0);
-        Link revNextHop = reverseLink(path.get(1));
 
         // At the end we install the updated PW.
         fwdPwFuture.thenAcceptAsync(status -> {
@@ -603,37 +681,30 @@
                 l2TunnelStore.put(Long.toString(tunnelId), newPw.l2Tunnel());
 
                 log.debug("Update process : Deploying new fwd pw for {}", tunnelId);
-                Result lamdaResult = deployPseudoWireInit(newPw.l2Tunnel(),
-                                                           newPw.l2TunnelPolicy().cP1(),
-                                                           newPw.l2TunnelPolicy().cP2(),
-                                                           FWD,
-                                                           fwdNextHop);
+                Result lamdaResult = deployPseudoWireInit(newPw.l2Tunnel(), newPw.l2TunnelPolicy().cP1(),
+                                                           newPw.l2TunnelPolicy().cP2(), FWD,
+                                                           fwdNextHop, finalNewPwSpine);
                 if (lamdaResult != SUCCESS) {
                     return;
                 }
 
                 VlanId egressVlanId = determineEgressVlan(newPw.l2TunnelPolicy().cP1OuterTag(),
-                                                           newPw.l2TunnelPolicy().cP1InnerTag(),
+                                                          newPw.l2TunnelPolicy().cP1InnerTag(),
                                                            newPw.l2TunnelPolicy().cP2OuterTag(),
-                                                           newPw.l2TunnelPolicy().cP2InnerTag());
+                                                          newPw.l2TunnelPolicy().cP2InnerTag());
 
-                lamdaResult = deployPolicy(tunnelId,
-                                            newPw.l2TunnelPolicy().cP1(),
+                lamdaResult = deployPolicy(tunnelId, newPw.l2TunnelPolicy().cP1(),
                                             newPw.l2TunnelPolicy().cP1InnerTag(),
-                                            newPw.l2TunnelPolicy().cP1OuterTag(),
-                                            egressVlanId,
-                                            lamdaResult.nextId);
+                                           newPw.l2TunnelPolicy().cP1OuterTag(),
+                                            egressVlanId, lamdaResult.nextId);
                 if (lamdaResult != SUCCESS) {
                     return;
                 }
-                deployPseudoWireTerm(newPw.l2Tunnel(),
-                                      newPw.l2TunnelPolicy().cP2(),
-                                      newPw.l2TunnelPolicy().cP2OuterTag(),
-                                      FWD);
+                deployPseudoWireTerm(newPw.l2Tunnel(), newPw.l2TunnelPolicy().cP2(),
+                                      newPw.l2TunnelPolicy().cP2OuterTag(), FWD, finalNewPwSpine);
 
             }
         });
-
         revPwFuture.thenAcceptAsync(status -> {
             if (status == null) {
                 log.debug("Update process : Deploying new rev pw for {}", tunnelId);
@@ -641,7 +712,7 @@
                                                            newPw.l2TunnelPolicy().cP2(),
                                                            newPw.l2TunnelPolicy().cP1(),
                                                            REV,
-                                                           revNextHop);
+                                                           revNextHop, finalNewPwSpine);
                 if (lamdaResult != SUCCESS) {
                     return;
                 }
@@ -662,7 +733,7 @@
                 deployPseudoWireTerm(newPw.l2Tunnel(),
                                       newPw.l2TunnelPolicy().cP1(),
                                       newPw.l2TunnelPolicy().cP1OuterTag(),
-                                      REV);
+                                      REV, finalNewPwSpine);
             }
         });
     }
@@ -673,6 +744,8 @@
      * @param event network config removed event
      */
     public void processPwaasConfigRemoved(NetworkConfigEvent event) {
+        checkArgument(event.prevConfig().isPresent(),
+                "PrevConfig is not presented in PwaasConfigRemoved event {}", event);
 
         log.info("Network event : Pseudowire configuration removed!");
         PwaasConfig config = (PwaasConfig) event.prevConfig().get();
@@ -697,7 +770,7 @@
      * @return Returns SUCCESS if no error is obeserved or an appropriate
      * error on a failure
      */
-    public Result tearDownPseudowire(long l2TunnelId) {
+    private Result tearDownPseudowire(long l2TunnelId) {
 
         CompletableFuture<ObjectiveError> fwdInitNextFuture = new CompletableFuture<>();
         CompletableFuture<ObjectiveError> fwdTermNextFuture = new CompletableFuture<>();
@@ -810,26 +883,31 @@
 
         // We remove all the pw in the configuration file.
         for (DefaultL2TunnelDescription currentL2Tunnel : pwToRemove) {
+            ConnectPoint cp1 = currentL2Tunnel.l2TunnelPolicy().cP1();
+            ConnectPoint cp2 = currentL2Tunnel.l2TunnelPolicy().cP2();
+            long tunnelId = currentL2Tunnel.l2TunnelPolicy().tunnelId();
 
             // only the master of CP1 will program this pseudowire
-            if (!srManager.isMasterOf(currentL2Tunnel.l2TunnelPolicy().cP1())) {
+            if (!srManager.isMasterOf(cp1)) {
+                log.debug("Not the master of {}. Ignore pseudo wire removal id={}", cp1, tunnelId);
                 continue;
             }
 
-            log.info("Removing pseudowire {}", currentL2Tunnel.l2Tunnel().tunnelId());
+            // no need to differentiate here between leaf-leaf and leaf-spine, because
+            // the only change is in the groups, which we do not remove either way
+            log.info("Removing pseudowire {}", tunnelId);
 
-            result = tearDownPseudowire(currentL2Tunnel.l2Tunnel().tunnelId());
+            result = tearDownPseudowire(tunnelId);
             switch (result) {
                 case WRONG_PARAMETERS:
                     log.warn("Error in supplied parameters for the pseudowire removal with tunnel id {}!",
-                             currentL2Tunnel.l2Tunnel().tunnelId());
+                            tunnelId);
                     break;
                 case REMOVAL_ERROR:
-                    log.warn("Error in pseudowire removal with tunnel id {}!", currentL2Tunnel.l2Tunnel().tunnelId());
+                    log.warn("Error in pseudowire removal with tunnel id {}!", tunnelId);
                     break;
                 default:
-                    log.warn("Pseudowire with tunnel id {} was removed successfully",
-                             currentL2Tunnel.l2Tunnel().tunnelId());
+                    log.warn("Pseudowire with tunnel id {} was removed successfully", tunnelId);
             }
         }
     }
@@ -903,10 +981,11 @@
      * @param ingress   the ingress connect point
      * @param egress    the egress connect point
      * @param direction the direction of the pw
+     * @param spinePw if the pseudowire involves a spine switch
      * @return the result of the operation
      */
     private Result deployPseudoWireInit(DefaultL2Tunnel l2Tunnel, ConnectPoint ingress,
-                                        ConnectPoint egress, Direction direction, Link nextHop) {
+                                        ConnectPoint egress, Direction direction, Link nextHop, boolean spinePw) {
 
         if (nextHop == null) {
             log.warn("No path between ingress and egress cps for tunnel {}", l2Tunnel.tunnelId());
@@ -920,7 +999,8 @@
                                                                          nextHop.src(),
                                                                          nextHop.dst(),
                                                                          l2Tunnel,
-                                                                         egress.deviceId());
+                                                                         egress.deviceId(),
+                                                                         spinePw);
 
         if (nextObjectiveBuilder == null) {
             return INTERNAL_ERROR;
@@ -965,14 +1045,16 @@
      * @param egress     the egress point
      * @param egressVlan the expected vlan at egress
      * @param direction  the direction
+     * @param spinePw if the pseudowire involves a spine switch
      * @return the result of the operation
      */
     private Result deployPseudoWireTerm(DefaultL2Tunnel l2Tunnel, ConnectPoint egress,
-                                        VlanId egressVlan, Direction direction) {
+                                        VlanId egressVlan, Direction direction, boolean spinePw) {
 
         // We create the group relative to the termination.
         NextObjective.Builder nextObjectiveBuilder = createNextObjective(TERMINATION, egress, null,
-                                                                         null, egress.deviceId());
+                                                                         null, egress.deviceId(),
+                                                                         spinePw);
         if (nextObjectiveBuilder == null) {
             return INTERNAL_ERROR;
         }
@@ -1114,11 +1196,12 @@
      * @param dstCp    the destination port
      * @param l2Tunnel the tunnel to support
      * @param egressId the egress device id
+     * @param spinePw if the pw involves a spine switch
      * @return the next objective to support the pipeline
      */
     private NextObjective.Builder createNextObjective(Pipeline pipeline, ConnectPoint srcCp,
                                                       ConnectPoint dstCp,  DefaultL2Tunnel l2Tunnel,
-                                                      DeviceId egressId) {
+                                                      DeviceId egressId, boolean spinePw) {
         NextObjective.Builder nextObjBuilder;
         TrafficTreatment.Builder treatmentBuilder = DefaultTrafficTreatment.builder();
         if (pipeline == INITIATION) {
@@ -1136,6 +1219,7 @@
             treatmentBuilder.setMpls(l2Tunnel.pwLabel());
             treatmentBuilder.setMplsBos(true);
             treatmentBuilder.copyTtlOut();
+
             // If the inter-co label is present we have to set the label.
             if (l2Tunnel.interCoLabel().toInt() != MplsLabel.MAX_MPLS) {
                 treatmentBuilder.pushMpls();
@@ -1143,22 +1227,28 @@
                 treatmentBuilder.setMplsBos(false);
                 treatmentBuilder.copyTtlOut();
             }
-            // We retrieve the sr label from the config
-            // specific for pseudowire traffic
-            // using the egress leaf device id.
-            MplsLabel srLabel;
-            try {
-                srLabel = MplsLabel.mplsLabel(srManager.deviceConfiguration().getPWRoutingLabel(egressId));
 
-            } catch (DeviceConfigNotFoundException e) {
-                log.warn("Sr label for pw traffic not configured");
-                return null;
+            // if pw is leaf-to-leaf we need to
+            // add the routing label also
+            if (!spinePw) {
+                // We retrieve the sr label from the config
+                // specific for pseudowire traffic
+                // using the egress leaf device id.
+                MplsLabel srLabel;
+                try {
+                    srLabel = MplsLabel.mplsLabel(srManager.deviceConfiguration().getPWRoutingLabel(egressId));
+
+                } catch (DeviceConfigNotFoundException e) {
+                    log.warn("Sr label for pw traffic not configured");
+                    return null;
+                }
+
+                treatmentBuilder.pushMpls();
+                treatmentBuilder.setMpls(srLabel);
+                treatmentBuilder.setMplsBos(false);
+                treatmentBuilder.copyTtlOut();
             }
 
-            treatmentBuilder.pushMpls();
-            treatmentBuilder.setMpls(srLabel);
-            treatmentBuilder.setMplsBos(false);
-            treatmentBuilder.copyTtlOut();
             // We have to rewrite the src and dst mac address.
             MacAddress ingressMac;
             try {
@@ -1192,8 +1282,8 @@
     /**
      * Reverses a link.
      *
-     * @param link
-     * @return The reversed link
+     * @param link link to be reversed
+     * @return the reversed link
      */
     private Link reverseLink(Link link) {
 
@@ -1210,9 +1300,9 @@
     /**
      * Returns the path betwwen two connect points.
      *
-     * @param srcCp
-     * @param dstCp
-     * @return The path
+     * @param srcCp source connect point
+     * @param dstCp destination connect point
+     * @return the path
      */
     private List<Link> getPath(ConnectPoint srcCp, ConnectPoint dstCp) {
 
