add a setup phase between desgin and implementation of a network for intermediary steps
diff --git a/api/src/main/java/com/cloud/network/guru/NetworkGuru.java b/api/src/main/java/com/cloud/network/guru/NetworkGuru.java
index a0e856d..cbadbb1 100644
--- a/api/src/main/java/com/cloud/network/guru/NetworkGuru.java
+++ b/api/src/main/java/com/cloud/network/guru/NetworkGuru.java
@@ -96,6 +96,8 @@
      */
     Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, String name, Long vpcId, Account owner);
 
+    void setup(Network network, long networkId);
+
     /**
      * For guest networks that are in Allocated state after the design stage,
      * resources are allocated when the guest network is actually being used
diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index 3231930..70176eb 100644
--- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -812,6 +812,7 @@
                         }
                     }
                 });
+                guru.setup(network, relatedFile);
             }
 
             if (networks.size() < 1) {
diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxGuestNetworkGuru.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxGuestNetworkGuru.java
index e5b80fb..70102ec 100644
--- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxGuestNetworkGuru.java
+++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxGuestNetworkGuru.java
@@ -133,17 +133,23 @@
             implemented.setName(name);
         }
         implemented.setBroadcastUri(Networks.BroadcastDomainType.NSX.toUri("nsx"));
+
+        return network;
+    }
+
+    @Override
+    public void setup(Network network, long networkId) {
         try {
+            NetworkVO designedNetwork  = _networkDao.findById(networkId);
             long zoneId = network.getDataCenterId();
             DataCenter zone = _dcDao.findById(zoneId);
             if (isNull(zone)) {
                 throw new CloudRuntimeException(String.format("Failed to find zone with id: %s", zoneId));
             }
-            createNsxSegment(implemented, zone);
+            createNsxSegment(designedNetwork, zone);
         } catch (Exception ex) {
             throw new CloudRuntimeException("unable to create NSX network " + network.getUuid() + "due to: " + ex.getMessage());
         }
-        return network;
     }
 
     @Override