Merge "update all inprogress checks in apih handler"
diff --git a/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/nwrest/CreateNetworkRequest.java b/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/nwrest/CreateNetworkRequest.java
index 3e4d18c..153ee78 100644
--- a/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/nwrest/CreateNetworkRequest.java
+++ b/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/nwrest/CreateNetworkRequest.java
@@ -54,7 +54,7 @@
 	private String networkType;
 	private String networkTypeVersion;
 	private String modelCustomizationUuid;
-	private NetworkTechnology networkTechnology = NetworkTechnology.NEUTRON;
+	private String networkTechnology = "NEUTRON";
 	private List<Subnet> subnets;
 	private ProviderVlanNetwork providerVlanNetwork;
 	private ContrailNetwork contrailNetwork;
@@ -62,7 +62,6 @@
 	private Boolean backout = true;
 	private Map<String,String> networkParams = new HashMap<>();
 	private MsoRequest msoRequest = new MsoRequest();
-	@JsonProperty
 	private boolean contrailRequest;
 
 	public CreateNetworkRequest() {
@@ -125,13 +124,12 @@
 		this.networkTypeVersion = networkTypeVersion;
 	}
 
-	public NetworkTechnology getNetworkTechnology() {
+	public String getNetworkTechnology() {
 		return networkTechnology;
 	}
 
-	public void setNetworkTechnology(NetworkTechnology networkTechnology) {
+	public void setNetworkTechnology(String networkTechnology) {
 		this.networkTechnology = networkTechnology;
-		this.contrailRequest = determineContrail();
 	}
 
 	public List<Subnet> getSubnets() {
@@ -156,7 +154,6 @@
 
 	public void setContrailNetwork(ContrailNetwork contrailNetwork) {
 		this.contrailNetwork = contrailNetwork;
-		this.contrailRequest = determineContrail();
 	}
 
 	public Boolean getFailIfExists() {
@@ -195,12 +192,8 @@
 		return this.contrailRequest;
 	}
 	
-	@JsonIgnore
-	protected void setContrailRequest(boolean contrailRequest) {
+	public void setContrailRequest(boolean contrailRequest) {
 		this.contrailRequest = contrailRequest;
 	}
 	
-	private boolean determineContrail() {
-		return (networkTechnology == NetworkTechnology.CONTRAIL && (contrailNetwork != null));
-	}
 }
diff --git a/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/nwrest/UpdateNetworkRequest.java b/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/nwrest/UpdateNetworkRequest.java
index a797684..5956622 100644
--- a/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/nwrest/UpdateNetworkRequest.java
+++ b/adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/nwrest/UpdateNetworkRequest.java
@@ -52,7 +52,7 @@
 	private String networkType;
 	private String networkTypeVersion;
 	private String modelCustomizationUuid;
-	private NetworkTechnology networkTechnology = NetworkTechnology.NEUTRON;
+	private String networkTechnology = "NEUTRON";
 	private List<Subnet> subnets;
 	private ProviderVlanNetwork providerVlanNetwork;
 	private ContrailNetwork contrailNetwork;
@@ -130,13 +130,12 @@
 		this.networkTypeVersion = networkTypeVersion;
 	}
 
-	public NetworkTechnology getNetworkTechnology() {
+	public String getNetworkTechnology() {
 		return networkTechnology;
 	}
 
-	public void setNetworkTechnology(NetworkTechnology networkTechnology) {
+	public void setNetworkTechnology(String networkTechnology) {
 		this.networkTechnology = networkTechnology;
-		this.contrailRequest = determineContrail();
 	}
 
 	public List<Subnet> getSubnets() {
@@ -161,7 +160,6 @@
 
 	public void setContrailNetwork(ContrailNetwork contrailNetwork) {
 		this.contrailNetwork = contrailNetwork;
-		this.contrailRequest = determineContrail();
 	}
 
 	public Boolean getBackout() {
@@ -195,8 +193,4 @@
 		return contrailRequest;
 	}
 	
-	private boolean determineContrail() {
-		return (networkTechnology == NetworkTechnology.CONTRAIL && (contrailNetwork != null));
-	}
-	
 }
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/onap/so/adapters/nwrest/NetworkRequestTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/onap/so/adapters/nwrest/NetworkRequestTest.java
index 08851c2..5e04fc4 100644
--- a/adapters/mso-adapters-rest-interface/src/test/java/org/onap/so/adapters/nwrest/NetworkRequestTest.java
+++ b/adapters/mso-adapters-rest-interface/src/test/java/org/onap/so/adapters/nwrest/NetworkRequestTest.java
@@ -38,13 +38,4 @@
 		assertEquals(true, networkResponse.isSynchronous());
 	}
 	
-	@Test
-	public void isContrailRequest() {
-		CreateNetworkRequest networkResponse = new CreateNetworkRequest();
-		assertEquals(false, networkResponse.isContrailRequest());
-		networkResponse.setNetworkTechnology(NetworkTechnology.CONTRAIL);
-		assertEquals(false, networkResponse.isContrailRequest());
-		networkResponse.setContrailNetwork(new ContrailNetwork());
-		assertEquals(true, networkResponse.isContrailRequest());
-	}
 }
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapter.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapter.java
index 27829a6..6e2fcb0 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapter.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapter.java
@@ -55,9 +55,12 @@
 							@WebParam(name="networkName") @XmlElement(required=true) String networkName,
 							@WebParam(name="physicalNetworkName") String physicalNetworkName,
 							@WebParam(name="vlans") List<Integer> vlans,
+							@WebParam(name="shared") String shared,
+							@WebParam(name="external") String external,
 							@WebParam(name="failIfExists") Boolean failIfExists,
 							@WebParam(name="backout") Boolean backout,
 							@WebParam(name="subnets") List<Subnet> subnets,
+							@WebParam(name="networkParams") Map<String, String> networkParams,
 							@WebParam(name="request") MsoRequest msoRequest,
 							@WebParam(name="networkId", mode=Mode.OUT) Holder<String> networkId,
 							@WebParam(name="neutronNetworkId", mode=Mode.OUT) Holder<String> neutronNetworkId,
@@ -77,6 +80,7 @@
 							@WebParam(name="failIfExists") Boolean failIfExists,
 							@WebParam(name="backout") Boolean backout,
 							@WebParam(name="subnets") List<Subnet> subnets,
+							@WebParam(name="networkParams") Map<String, String> networkParams,
 							@WebParam(name="policyFqdns") List<String> policyFqdns,
 							@WebParam(name="routeTableFqdns") List<String> routeTableFqdns,
 							@WebParam(name="request") MsoRequest msoRequest,
@@ -100,7 +104,10 @@
 							@WebParam(name="networkName") @XmlElement(required=true) String networkName,
 							@WebParam(name="physicalNetworkName") @XmlElement(required=true) String physicalNetworkName,
 							@WebParam(name="vlans") @XmlElement(required=true) List<Integer> vlans,
+							@WebParam(name="shared") String shared,
+							@WebParam(name="external") String external,
 							@WebParam(name="subnets") List<Subnet> subnets,
+							@WebParam(name="networkParams") Map<String,String> networkParams,
 							@WebParam(name="request") MsoRequest msoRequest,
 							@WebParam(name="subnetIdMap", mode=Mode.OUT) Holder<Map<String, String>> subnetIdMap,
 							@WebParam(name="rollback", mode=Mode.OUT) Holder<NetworkRollback> rollback )
@@ -117,6 +124,7 @@
 							@WebParam(name="shared") String shared,
 							@WebParam(name="external") String external,
 							@WebParam(name="subnets") List<Subnet> subnets,
+							@WebParam(name="networkParams") Map<String,String> networkParams,
 							@WebParam(name="policyFqdns") List<String> policyFqdns,
 							@WebParam(name="routeTableFqdns") List<String> routeTableFqdns,
 							@WebParam(name="request") MsoRequest msoRequest,
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterAsync.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterAsync.java
index 99f590b..a85da58 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterAsync.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterAsync.java
@@ -22,6 +22,7 @@
 
 
 import java.util.List;
+import java.util.Map;
 
 import javax.jws.Oneway;
 import javax.jws.WebMethod;
@@ -56,6 +57,7 @@
 							@WebParam(name="failIfExists") Boolean failIfExists,
 							@WebParam(name="backout") Boolean backout,
 							@WebParam(name="subnets") List<Subnet> subnets,
+							@WebParam(name="networkParams") Map<String, String> networkParams,
 							@WebParam(name="messageId") @XmlElement(required=true) String messageId,
 							@WebParam(name="request") MsoRequest msoRequest,
 							@WebParam(name="notificationUrl") @XmlElement(required=true) String notificationUrl );
@@ -71,6 +73,7 @@
 						@WebParam(name="physicalNetworkName") @XmlElement(required=true) String physicalNetworkName,
 						@WebParam(name="vlans") @XmlElement(required=true) List<Integer> vlans,
 						@WebParam(name="subnets") List<Subnet> subnets,
+						@WebParam(name="networkParams") Map<String, String> networkParams,
 						@WebParam(name="messageId") @XmlElement(required=true) String messageId,
 						@WebParam(name="request") MsoRequest msoRequest,
 						@WebParam(name="notificationUrl") @XmlElement(required=true) String notificationUrl );
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterAsyncImpl.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterAsyncImpl.java
index 608f39a..8181714 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterAsyncImpl.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterAsyncImpl.java
@@ -122,6 +122,7 @@
                                 Boolean failIfExists,
                                 Boolean backout,
                                 List <Subnet> subnets,
+                                Map<String,String> networkParams,
                                 String messageId,
                                 MsoRequest msoRequest,
                                 String notificationUrl) {
@@ -145,6 +146,16 @@
         Holder <String> neutronNetworkId = new Holder <> ();
         Holder <NetworkRollback> networkRollback = new Holder <> ();
         Holder <Map <String, String>> subnetIdMap = new Holder <> ();
+        
+        HashMap<String, String> params = (HashMap<String,String>) networkParams;
+        if (params == null)
+        	params = new HashMap<String,String>();
+        String shared = null;
+        String external = null;
+        if (params.containsKey("shared"))
+        	shared = params.get("shared");
+        if (params.containsKey("external"))
+        	external = params.get("external");
 
         try {
             networkAdapter.createNetwork (cloudSiteId,
@@ -154,9 +165,12 @@
                                           networkName,
                                           physicalNetworkName,
                                           vlans,
+                                          shared,
+                                          external,
                                           failIfExists,
                                           backout,
                                           subnets,
+                                          params,
                                           msoRequest,
                                           networkId,
                                           neutronNetworkId,
@@ -239,6 +253,7 @@
                                 String physicalNetworkName,
                                 List <Integer> vlans,
                                 List <Subnet> subnets,
+                                Map <String,String> networkParams,
                                 String messageId,
                                 MsoRequest msoRequest,
                                 String notificationUrl) {
@@ -261,6 +276,16 @@
         // Synchronous Web Service Outputs
         Holder <NetworkRollback> networkRollback = new Holder <> ();
         Holder <Map <String, String>> subnetIdMap = new Holder <> ();
+        
+        HashMap<String, String> params = (HashMap<String,String>) networkParams;
+        if (params == null)
+        	params = new HashMap<String,String>();
+        String shared = null;
+        String external = null;
+        if (params.containsKey("shared"))
+        	shared = params.get("shared");
+        if (params.containsKey("external"))
+        	external = params.get("external");
 
         try {
             networkAdapter.updateNetwork (cloudSiteId,
@@ -271,7 +296,10 @@
                                           networkName,
                                           physicalNetworkName,
                                           vlans,
+                                          shared,
+                                          external,
                                           subnets,
+                                          params,
                                           msoRequest,
                                           subnetIdMap,
                                           networkRollback);
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java
index 45285d0..d250561 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/MsoNetworkAdapterImpl.java
@@ -138,9 +138,12 @@
                                String networkName,
                                String physicalNetworkName,
                                List <Integer> vlans,
+                               String shared,
+                               String external,
                                Boolean failIfExists,
                                Boolean backout,
                                List <Subnet> subnets,
+                               Map<String, String> networkParams,
                                MsoRequest msoRequest,
                                Holder <String> networkId,
                                Holder <String> neutronNetworkId,
@@ -155,8 +158,8 @@
                        physicalNetworkName,
                        vlans,
                        null,
-                       null,
-                       null,
+                       shared,
+                       external,
                        failIfExists,
                        backout,
                        subnets,
@@ -182,6 +185,7 @@
                                        Boolean failIfExists,
                                        Boolean backout,
                                        List <Subnet> subnets,
+                                       Map<String, String> networkParams,
                                        List <String> policyFqdns,
                                        List<String> routeTableFqdns,
                                        MsoRequest msoRequest,
@@ -660,7 +664,10 @@
                                String networkName,
                                String physicalNetworkName,
                                List <Integer> vlans,
+                               String shared,
+                               String external,
                                List <Subnet> subnets,
+                               Map<String,String> networkParams,
                                MsoRequest msoRequest,
                                Holder <Map <String, String>> subnetIdMap,
                                Holder <NetworkRollback> rollback) throws NetworkException {
@@ -673,8 +680,8 @@
                        physicalNetworkName,
                        vlans,
                        null,
-                       null,
-                       null,
+                       shared,
+                       external,
                        subnets,
                        null,
                        null,
@@ -695,6 +702,7 @@
                                        String shared,
                                        String external,
                                        List <Subnet> subnets,
+                                       Map<String, String> networkParams,
                                        List <String> policyFqdns,
                                        List<String> routeTableFqdns,
                                        MsoRequest msoRequest,
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/NetworkAdapterRest.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/NetworkAdapterRest.java
index effe7a8..8d08b3b 100644
--- a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/NetworkAdapterRest.java
+++ b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/network/NetworkAdapterRest.java
@@ -168,6 +168,13 @@
 				Holder<String> networkFqdn = new Holder<>();
 				Holder<Map<String, String>> subnetIdMap = new Holder<>();
 				Holder<NetworkRollback> rollback = new Holder<>();
+				
+				HashMap<String, String> params = (HashMap<String, String>) req.getNetworkParams();
+				if (params == null) {
+					params = new HashMap<String,String>();
+				}
+				String shared = null;
+				String external = null;
 
 				String cloudsite = req.getCloudSiteId();
 				if (cloudsite != null && cloudsite.equals(TESTING_KEYWORD)) {
@@ -186,6 +193,20 @@
 						ctn = new ContrailNetwork();
 						req.setContrailNetwork(ctn);
 					}
+					if (params.containsKey("shared")) {
+						shared = params.get("shared");
+					} else {
+						if (ctn.getShared() != null) {
+							shared = ctn.getShared();
+						}
+					}
+					if (params.containsKey("external")) {
+						external = params.get("external");
+					} else {
+						if (ctn.getExternal() != null) {
+							external = ctn.getExternal();
+						}
+					}
 					adapter.createNetworkContrail(
 						req.getCloudSiteId(),
 						req.getTenantId(),
@@ -193,11 +214,12 @@
 						req.getModelCustomizationUuid(),
 						req.getNetworkName(),
                         req.getContrailNetwork().getRouteTargets(),
-                        req.getContrailNetwork().getShared(),
-                        req.getContrailNetwork().getExternal(),
+                        shared,
+                        external,
                         req.getFailIfExists(),
                         req.getBackout(),
                         req.getSubnets(),
+                        params,
                         req.getContrailNetwork().getPolicyFqdns(),
                         req.getContrailNetwork().getRouteTableFqdns(),
               			req.getMsoRequest(),
@@ -212,6 +234,10 @@
 						pvn = new ProviderVlanNetwork();
 						req.setProviderVlanNetwork(pvn);
 					}
+					if (params.containsKey("shared"))
+						shared = params.get("shared");
+					if (params.containsKey("external"))
+						external = params.get("external");
 					adapter.createNetwork(
 						req.getCloudSiteId(),
 						req.getTenantId(),
@@ -220,9 +246,12 @@
 						req.getNetworkName(),
 						req.getProviderVlanNetwork().getPhysicalNetworkName(),
 						req.getProviderVlanNetwork().getVlans(),
+						shared,
+						external,
                         req.getFailIfExists(),
                         req.getBackout(),
                         req.getSubnets(),
+                        params,
                         req.getMsoRequest(),
     					networkId,
     					neutronNetworkId,
@@ -593,6 +622,12 @@
 			try {
 				Holder<Map<String, String>> subnetIdMap = new Holder<>();
 				Holder<NetworkRollback> rollback = new Holder<> ();
+				HashMap<String, String> params = (HashMap<String, String>) req.getNetworkParams();
+				if (params == null) {
+					params = new HashMap<String,String>();
+				}
+				String shared = null;
+				String external = null;
 
 				if (req.getCloudSiteId().equals(TESTING_KEYWORD)) {
 					subnetIdMap.value = testMap();
@@ -607,6 +642,20 @@
 						ctn = new ContrailNetwork();
 						req.setContrailNetwork(ctn);
 					}
+					if (params.containsKey("shared")) {
+						shared = params.get("shared");
+					} else {
+						if (ctn.getShared() != null) {
+							shared = ctn.getShared();
+						}
+					}
+					if (params.containsKey("external")) {
+						external = params.get("external");
+					} else {
+						if (ctn.getExternal() != null) {
+							external = ctn.getExternal();
+						}
+					}
 					adapter.updateNetworkContrail(
 						req.getCloudSiteId(),
 						req.getTenantId(),
@@ -615,9 +664,10 @@
 						req.getNetworkStackId(),
 						req.getNetworkName(),
 						req.getContrailNetwork().getRouteTargets(),
-	                    req.getContrailNetwork().getShared(),
-	                    req.getContrailNetwork().getExternal(),
+						shared,
+						external,
 	                    req.getSubnets(),
+	                    params,
 	                    req.getContrailNetwork().getPolicyFqdns(),
 	                    req.getContrailNetwork().getRouteTableFqdns(),
 	                    req.getMsoRequest(),
@@ -629,6 +679,12 @@
 						pvn = new ProviderVlanNetwork();
 						req.setProviderVlanNetwork(pvn);
 					}
+					if (params.containsKey("shared")) {
+						shared = params.get("shared");
+					} 
+					if (params.containsKey("external")) {
+						external = params.get("external");
+					} 
 					adapter.updateNetwork(
 						req.getCloudSiteId(),
 						req.getTenantId(),
@@ -638,7 +694,10 @@
 						req.getNetworkName(),
 						req.getProviderVlanNetwork().getPhysicalNetworkName(),
 						req.getProviderVlanNetwork().getVlans(),
+						shared,
+						external,
 						req.getSubnets(),
+						params,
 						req.getMsoRequest(),
 						subnetIdMap,
 						rollback);
diff --git a/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/network/MsoNetworkAdapterAsyncImplTest.java b/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/network/MsoNetworkAdapterAsyncImplTest.java
index 094d308..f8dcddd 100644
--- a/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/network/MsoNetworkAdapterAsyncImplTest.java
+++ b/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/network/MsoNetworkAdapterAsyncImplTest.java
@@ -25,10 +25,12 @@
 import org.onap.so.adapters.vnf.BaseRestTestUtils;
 import org.onap.so.entity.MsoRequest;
 import org.onap.so.openstack.beans.NetworkRollback;
+import org.onap.so.openstack.beans.Subnet;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
 
 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
 import static com.github.tomakehurst.wiremock.client.WireMock.containing;
@@ -184,8 +186,11 @@
 								"   </soapenv:Body>\n" +
 								"</soapenv:Envelope>")
 						.withStatus(HttpStatus.SC_OK)));
+		HashMap<String,String> networkParams = new HashMap<String,String>();
+		networkParams.put("shared", "true");
+		networkParams.put("external", "false");
 		impl.updateNetworkA("mtn13", "tenantId", "networkType", "3bdbb104-476c-483e-9f8b-c095b3d3068c", "dvspg-VCE_VPE-mtjnj40avbc",
-				"dvspg-VCE_VPE-mtjnj40avbc", "physicalNetworkName", new ArrayList<>(), new ArrayList<>(), "messageId",
+				"dvspg-VCE_VPE-mtjnj40avbc", "physicalNetworkName", new ArrayList<>(), new ArrayList<Subnet>(), networkParams, "messageId",
 				new MsoRequest(), "http://localhost:"+wireMockPort+"/notificationUrl");
 	}
 
@@ -199,14 +204,17 @@
 		mockOpenStackGetStackCreated_200("OpenstackResponse_Stack_Created.json", "dvspg-VCE_VPE-mtjnj40avbc");
 		mockOpenStackGetStackDeleteOrUpdateComplete_200("OpenstackResponse_Stack_UpdateComplete.json");
 		mockOpenStackPutPublicUrlStackByNameAndID_NETWORK2_200();
+		HashMap<String,String> networkParams = new HashMap<String,String>();
+		networkParams.put("shared", "true");
+		networkParams.put("external", "false");
 		impl.updateNetworkA("mtn13", "tenantId", "networkType", "3bdbb104-476c-483e-9f8b-c095b3d3068c", "dvspg-VCE_VPE-mtjnj40avbc",
-				"dvspg-VCE_VPE-mtjnj40avbc", "physicalNetworkName", new ArrayList<>(), new ArrayList<>(), "messageId",
+				"dvspg-VCE_VPE-mtjnj40avbc", "physicalNetworkName", new ArrayList<>(), new ArrayList<>(), networkParams, "messageId",
 				new MsoRequest(), "http://localhost:"+wireMockPort+"/notificationUrl");	}
 
 	@Test
 	public void updateNetworkATest_NetworkException() {
 		impl.updateNetworkA("cloudSiteId", "tenantId", "networkType", "3bdbb104-476c-483e-9f8b-c095b3d3068c", "networkId",
-				"dvspg-VCE_VPE-mtjnj40avbc", "physicalNetworkName", new ArrayList<>(), new ArrayList<>(), "messageId",
+				"dvspg-VCE_VPE-mtjnj40avbc", "physicalNetworkName", new ArrayList<>(), new ArrayList<>(), new HashMap<String,String>(), "messageId",
 				new MsoRequest(), "http://localhost:"+wireMockPort+"/notificationUrl");
 	}
 
@@ -237,8 +245,10 @@
 						.withStatus(HttpStatus.SC_OK)));
 		mockOpenStackGetStackCreatedVUSP_200();
 		mockOpenStackPostStacks_200();
+		mockOpenStackPostStacks_200();
+		HashMap<String,String> networkParams = new HashMap<String,String>();
 		impl.createNetworkA("mtn13", "tenantId", "networkType", "3bdbb104-476c-483e-9f8b-c095b3d3068c", "vUSP-23804-T-01-dpa2b_EVUSP-CORE-VIF-TSIG0_net_0",
-				"physicalNetworkName", new ArrayList<>(), false, false, new ArrayList<>(), "messageId",
+				"physicalNetworkName", new ArrayList<>(), false, false, new ArrayList<>(), networkParams, "messageId",
 				new MsoRequest(), "http://localhost:"+wireMockPort+"/notificationUrl");
 	}
 
@@ -251,15 +261,18 @@
 						.withStatus(HttpStatus.SC_OK)));
 		mockOpenStackGetStackCreatedVUSP_200();
 		mockOpenStackPostStacks_200();
+		HashMap<String,String> networkParams = new HashMap<String,String>();
+		networkParams.put("shared", "true");
+		networkParams.put("external", "false");
 		impl.createNetworkA("mtn13", "tenantId", "networkType", "3bdbb104-476c-483e-9f8b-c095b3d3068c", "vUSP-23804-T-01-dpa2b_EVUSP-CORE-VIF-TSIG0_net_0",
-				"physicalNetworkName", new ArrayList<>(), false, false, new ArrayList<>(), "messageId",
+				"physicalNetworkName", new ArrayList<>(), false, false, new ArrayList<>(), networkParams, "messageId",
 				new MsoRequest(), "http://localhost:"+wireMockPort+"/notificationUrl");
 	}
 
 	@Test
 	public void createNetworkATest_NetworkException()  {
 		impl.createNetworkA("mtn13", "tenantId", "networkType", "3bdbb104-476c-483e-9f8b-c095b3d3068c", "vUSP-23804-T-01-dpa2b_EVUSP-CORE-VIF-TSIG0_net_0",
-				"physicalNetworkName", new ArrayList<>(), false, false, new ArrayList<>(), "messageId",
+				"physicalNetworkName", new ArrayList<>(), false, false, new ArrayList<>(), new HashMap<String,String>(), "messageId",
 				new MsoRequest(), "http://localhost:"+wireMockPort+"/notificationUrl");
 	}
 }
diff --git a/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/network/NetworkAdapterRestTest.java b/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/network/NetworkAdapterRestTest.java
index 6123415..3910d9e 100644
--- a/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/network/NetworkAdapterRestTest.java
+++ b/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/network/NetworkAdapterRestTest.java
@@ -88,7 +88,7 @@
 		request.setSkipAAI(true);
 		request.setFailIfExists(false);
 		MsoRequest msoReq = new MsoRequest();
-		NetworkTechnology networkTechnology = NetworkTechnology.CONTRAIL;
+		String networkTechnology = "CONTRAIL";
 
 		msoReq.setRequestId(MSO_REQUEST_ID);
 		msoReq.setServiceInstanceId(MSO_SERVICE_INSTANCE_ID);
@@ -296,6 +296,33 @@
 		assertThat(response.getBody(), sameBeanAs(expectedResponse));
 	}
 	
+	@Test
+	public void testCreateNetworkNC_Shared_JSON() throws JSONException, JsonParseException, JsonMappingException, IOException {
+		
+		mockOpenStackResponseAccess(wireMockPort);
+
+		mockOpenStackPostPublicUrlWithBodyFile_200();
+
+		mockOpenStackGetStackCreatedAppC_200();
+		
+		mockOpenStackGetStackAppC_404();
+		
+		headers.add("Content-Type", MediaType.APPLICATION_JSON);
+		headers.add("Accept", MediaType.APPLICATION_JSON);
+		
+		String request = readJsonFileAsString("src/test/resources/CreateNetwork4.json");
+		HttpEntity<String> entity = new HttpEntity<String>(request, headers);
+
+		ResponseEntity<CreateNetworkResponse> response = restTemplate.exchange(
+				createURLWithPort("/services/rest/v1/networks"), HttpMethod.POST, entity, CreateNetworkResponse.class);
+
+		CreateNetworkResponse expectedResponse = jettisonTypeObjectMapper.getMapper().readValue(
+				new File("src/test/resources/__files/CreateNetworkResponse4.json"), CreateNetworkResponse.class);
+		
+		assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode().value());
+		assertThat(response.getBody(), sameBeanAs(expectedResponse));
+	}
+	
 	@Override
 	protected String readJsonFileAsString(String fileLocation) throws JsonParseException, JsonMappingException, IOException{
 		return new String(Files.readAllBytes(Paths.get(fileLocation)));
diff --git a/adapters/mso-openstack-adapters/src/test/resources/CreateNetwork4.json b/adapters/mso-openstack-adapters/src/test/resources/CreateNetwork4.json
new file mode 100644
index 0000000..3a116a6
--- /dev/null
+++ b/adapters/mso-openstack-adapters/src/test/resources/CreateNetwork4.json
@@ -0,0 +1,46 @@
+{
+	"createNetworkRequest": {
+		"skipAAI": true,
+		"messageId": "c4c44af4-4310-4d8b-a1eb-656fc99fe709",
+		"synchronous": true,
+		"cloudSiteId": "mtn13",
+		"tenantId": "ba38bc24a2ef4fb2ad2810c894f1938f",
+		"networkId": "da886914-efb2-4917-b335-c8381528d90b",
+		"networkName": "APP-C-24595-T-IST-04AShared_untrusted_vDBE_net_3",
+		"networkType": "CONTRAIL30_BASIC",
+		"modelCustomizationUuid": "3bdbb104-ffff-483e-9f8b-c095b3d30844",
+		"networkTechnology": "NEUTRON",
+		"subnets": [{
+			"subnetName": "APP-C-24595-T-IST-04AShared_untrusted_vDBE_net_3_subnet_1",
+			"subnetId": "da60501d-9aa8-48d2-99b7-26644fa01093",
+			"cidr": "20",
+			"gatewayIp": "",
+			"ipVersion": "4",
+			"enableDHCP": false,
+			"addrFromStart": true,
+			"hostRoutes": []
+		}],
+		"providerVlanNetwork": {
+			"physicalNetworkName": "FALSE",
+			"vlans": []
+		},
+		"contrailNetwork": {
+			"shared": "false",
+			"external": "false",
+			"routeTargets": [],
+			"policyFqdns": [],
+			"routeTableFqdns": []
+		},
+		"failIfExists": true,
+		"backout": false,
+		"networkParams": {
+			"shared": "true",
+			"external": "false"
+		},
+		"msoRequest": {
+			"requestId": "5349f419-b3e9-4546-b3a1-094bd568d6b7",
+			"serviceInstanceId": "cf965caf-a003-4189-abf9-e0ed77056dd6"
+		},
+		"contrailRequest": false
+	}
+}
\ No newline at end of file
diff --git a/adapters/mso-openstack-adapters/src/test/resources/__files/CreateNetworkResponse4.json b/adapters/mso-openstack-adapters/src/test/resources/__files/CreateNetworkResponse4.json
new file mode 100644
index 0000000..2e5517c
--- /dev/null
+++ b/adapters/mso-openstack-adapters/src/test/resources/__files/CreateNetworkResponse4.json
@@ -0,0 +1,25 @@
+{
+	"createNetworkResponse": {
+		"networkId": "da886914-efb2-4917-b335-c8381528d90b",
+		"neutronNetworkId": null,
+		"networkStackId": "stackname/stackId",
+		"networkFqdn": null,
+		"networkCreated": true,
+		"subnetMap": {
+
+		},
+		"rollback": {
+			"networkStackId": "stackname/stackId",
+			"tenantId": "ba38bc24a2ef4fb2ad2810c894f1938f",
+			"cloudId": "mtn13",
+			"networkType": "CONTRAIL30_BASIC",
+			"modelCustomizationUuid": "3bdbb104-ffff-483e-9f8b-c095b3d30844",
+			"networkCreated": true,
+			"msoRequest": {
+				"requestId": "5349f419-b3e9-4546-b3a1-094bd568d6b7",
+				"serviceInstanceId": "cf965caf-a003-4189-abf9-e0ed77056dd6"
+			}
+		},
+		"messageId": "c4c44af4-4310-4d8b-a1eb-656fc99fe709"
+	}
+}
\ No newline at end of file
diff --git a/asdc-controller/pom.xml b/asdc-controller/pom.xml
index 2a20b96..50fbdd4 100644
--- a/asdc-controller/pom.xml
+++ b/asdc-controller/pom.xml
@@ -192,12 +192,12 @@
 		<dependency>
   			<groupId>org.onap.sdc.sdc-tosca</groupId>
 			<artifactId>sdc-tosca</artifactId>
-			<version>1.4.4</version>
+			<version>1.4.8</version>
 		</dependency> 
 		<dependency>
   			<groupId>org.onap.sdc.jtosca</groupId>
   			<artifactId>jtosca</artifactId>
-  			<version>1.4.4</version>
+  			<version>1.4.8</version>
 		</dependency> 
 		<dependency>
 			<groupId>org.onap.so</groupId>
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
index 722e159..e455d2d 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/installer/heat/ToscaResourceInstaller.java
@@ -35,8 +35,8 @@
 import org.onap.sdc.api.notification.IArtifactInfo;
 import org.onap.sdc.api.notification.IResourceInstance;
 import org.onap.sdc.api.notification.IStatusData;
+import org.onap.sdc.tosca.parser.enums.SdcTypes;
 import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
-import org.onap.sdc.tosca.parser.impl.SdcTypes;
 import org.onap.sdc.toscaparser.api.CapabilityAssignment;
 import org.onap.sdc.toscaparser.api.CapabilityAssignments;
 import org.onap.sdc.toscaparser.api.Group;
diff --git a/asdc-controller/src/main/java/org/onap/so/asdc/util/ASDCNotificationLogging.java b/asdc-controller/src/main/java/org/onap/so/asdc/util/ASDCNotificationLogging.java
index f7c761f..24304ba 100644
--- a/asdc-controller/src/main/java/org/onap/so/asdc/util/ASDCNotificationLogging.java
+++ b/asdc-controller/src/main/java/org/onap/so/asdc/util/ASDCNotificationLogging.java
@@ -28,8 +28,8 @@
 import org.onap.sdc.api.notification.INotificationData;
 import org.onap.sdc.api.notification.IResourceInstance;
 import org.onap.sdc.tosca.parser.api.ISdcCsarHelper;
+import org.onap.sdc.tosca.parser.enums.SdcTypes;
 import org.onap.sdc.tosca.parser.impl.SdcPropertyNames;
-import org.onap.sdc.tosca.parser.impl.SdcTypes;
 import org.onap.sdc.toscaparser.api.Group;
 import org.onap.sdc.toscaparser.api.NodeTemplate;
 import org.onap.sdc.toscaparser.api.elements.Metadata;
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/exception/ExceptionBuilder.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/exception/ExceptionBuilder.java
index 42da725..adffee6 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/exception/ExceptionBuilder.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/exception/ExceptionBuilder.java
@@ -61,6 +61,35 @@
 			msg = msg.concat(exception.getMessage());
 		buildAndThrowWorkflowException(execution, errorCode, msg);
 	}
+	
+	public void buildAndThrowWorkflowException(DelegateExecution execution, int errorCode, Exception exception) {
+		String msg = "Exception in %s.%s ";
+		try{
+			msoLogger.error(exception);
+
+			String errorVariable = "Error%s%s";
+
+			StackTraceElement[] trace = Thread.currentThread().getStackTrace();
+			for (StackTraceElement traceElement : trace) {
+				if (!traceElement.getClassName().equals(this.getClass().getName()) && !traceElement.getClassName().equals(Thread.class.getName())) {
+					msg = String.format(msg, traceElement.getClassName(), traceElement.getMethodName());
+					String shortClassName = traceElement.getClassName().substring(traceElement.getClassName().lastIndexOf(".") + 1);
+					errorVariable = String.format(errorVariable,  shortClassName, traceElement.getMethodName());
+					break;
+				}
+			}
+
+			msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, msg, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, msg.toString());
+			execution.setVariable(errorVariable, exception.getMessage());
+		} catch (Exception ex){
+			//log trace, allow process to complete gracefully
+			msoLogger.error(ex);
+		}
+
+		if (exception.getMessage() != null)
+			msg = msg.concat(exception.getMessage());
+		buildAndThrowWorkflowException(execution, errorCode, msg);
+	}
 
 	public void buildAndThrowWorkflowException(BuildingBlockExecution execution, int errorCode, String errorMessage) {
 		if (execution instanceof DelegateExecutionImpl) {
@@ -74,6 +103,7 @@
 
 		WorkflowException exception = new WorkflowException(processKey, errorCode, errorMessage);
 		execution.setVariable("WorkflowException", exception);
+		execution.setVariable("WorkflowExceptionErrorMessage", errorMessage);
 		msoLogger.info("Outgoing WorkflowException is " + exception);
 		msoLogger.info("Throwing MSOWorkflowException");
 		throw new BpmnError("MSOWorkflowException");
diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ActivateVfModuleBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ActivateVfModuleBB.bpmn
index ef19e6e..3670676 100644
--- a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ActivateVfModuleBB.bpmn
+++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ActivateVfModuleBB.bpmn
@@ -1,16 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.8.2">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="2.0.3">
   <bpmn:process id="ActivateVfModuleBB" name="ActivateVfModuleBB" isExecutable="true">
     <bpmn:startEvent id="ActivateVfModuleBB_Start">
       <bpmn:outgoing>SequenceFlow_0ieafii</bpmn:outgoing>
     </bpmn:startEvent>
-    <bpmn:sequenceFlow id="SequenceFlow_0ieafii" sourceRef="ActivateVfModuleBB_Start" targetRef="ActivateVfModule" />
+    <bpmn:sequenceFlow id="SequenceFlow_0ieafii" sourceRef="ActivateVfModuleBB_Start" targetRef="SetTimerDuration" />
     <bpmn:endEvent id="ActivateVfModuleBB_End">
       <bpmn:incoming>SequenceFlow_0xsp0pv</bpmn:incoming>
     </bpmn:endEvent>
     <bpmn:serviceTask id="ActivateVfModule" name="&#10;SDNC&#10;Activate&#10;(vf module)&#10;" camunda:expression="${SDNCActivateTasks.activateVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_0ieafii</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1a495wm</bpmn:outgoing>
+      <bpmn:incoming>SequenceFlow_0e44ywc</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1yzril6</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:serviceTask id="UpdateVfModuleActiveStatus" name="&#10;AAI&#10;Update&#10;(vf module)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusActivateVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_1j4x1ej</bpmn:incoming>
@@ -24,11 +24,24 @@
         <camunda:out source="WorkflowException" target="WorkflowException" />
         <camunda:in source="mso-request-id" target="mso-request-id" />
       </bpmn:extensionElements>
-      <bpmn:incoming>SequenceFlow_1a495wm</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1yzril6</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_1j4x1ej</bpmn:outgoing>
     </bpmn:callActivity>
-    <bpmn:sequenceFlow id="SequenceFlow_1a495wm" sourceRef="ActivateVfModule" targetRef="CallActivity_sdncHandler" />
     <bpmn:sequenceFlow id="SequenceFlow_1j4x1ej" sourceRef="CallActivity_sdncHandler" targetRef="UpdateVfModuleActiveStatus" />
+    <bpmn:serviceTask id="SetTimerDuration" name="Set Timer Duration" camunda:expression="${ActivateVfModule.setTimerDuration(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_0ieafii</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0qc2sao</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:intermediateCatchEvent id="Timer" name="Timer">
+      <bpmn:incoming>SequenceFlow_0qc2sao</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0e44ywc</bpmn:outgoing>
+      <bpmn:timerEventDefinition>
+        <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">${execution.getVariable("vfModuleActivateTimerDuration")}</bpmn:timeDuration>
+      </bpmn:timerEventDefinition>
+    </bpmn:intermediateCatchEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_0qc2sao" sourceRef="SetTimerDuration" targetRef="Timer" />
+    <bpmn:sequenceFlow id="SequenceFlow_0e44ywc" sourceRef="Timer" targetRef="ActivateVfModule" />
+    <bpmn:sequenceFlow id="SequenceFlow_1yzril6" sourceRef="ActivateVfModule" targetRef="CallActivity_sdncHandler" />
   </bpmn:process>
   <bpmn:error id="Error_0q258vt" name="gDelegateError" errorCode="7000" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
@@ -40,48 +53,62 @@
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0ieafii_di" bpmnElement="SequenceFlow_0ieafii">
-        <di:waypoint xsi:type="dc:Point" x="209" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="262" y="120" />
+        <di:waypoint x="209" y="120" />
+        <di:waypoint x="274" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="190.5" y="99" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1v967li_di" bpmnElement="ActivateVfModuleBB_End">
-        <dc:Bounds x="736" y="102" width="36" height="36" />
+        <dc:Bounds x="956" y="102" width="36" height="36" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="710" y="142" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0hawa84_di" bpmnElement="ActivateVfModule">
-        <dc:Bounds x="262" y="80" width="100" height="80" />
+        <dc:Bounds x="490" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_175e9ul_di" bpmnElement="UpdateVfModuleActiveStatus">
-        <dc:Bounds x="600" y="80" width="100" height="80" />
+        <dc:Bounds x="770" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0xsp0pv_di" bpmnElement="SequenceFlow_0xsp0pv">
-        <di:waypoint xsi:type="dc:Point" x="700" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="736" y="120" />
+        <di:waypoint x="870" y="120" />
+        <di:waypoint x="956" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="673" y="99" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="CallActivity_03jkesd_di" bpmnElement="CallActivity_sdncHandler">
-        <dc:Bounds x="420" y="80" width="100" height="80" />
+        <dc:Bounds x="639" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1a495wm_di" bpmnElement="SequenceFlow_1a495wm">
-        <di:waypoint xsi:type="dc:Point" x="362" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="420" y="120" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="391" y="99" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1j4x1ej_di" bpmnElement="SequenceFlow_1j4x1ej">
-        <di:waypoint xsi:type="dc:Point" x="520" y="120" />
-        <di:waypoint xsi:type="dc:Point" x="600" y="120" />
+        <di:waypoint x="739" y="120" />
+        <di:waypoint x="770" y="120" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="560" y="99" width="0" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_0tg4hn9_di" bpmnElement="SetTimerDuration">
+        <dc:Bounds x="274" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="IntermediateCatchEvent_17kjdjp_di" bpmnElement="Timer">
+        <dc:Bounds x="417" y="102" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="421" y="145" width="29" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0qc2sao_di" bpmnElement="SequenceFlow_0qc2sao">
+        <di:waypoint x="374" y="120" />
+        <di:waypoint x="417" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0e44ywc_di" bpmnElement="SequenceFlow_0e44ywc">
+        <di:waypoint x="453" y="120" />
+        <di:waypoint x="490" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1yzril6_di" bpmnElement="SequenceFlow_1yzril6">
+        <di:waypoint x="590" y="120" />
+        <di:waypoint x="639" y="120" />
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/WorkflowActionBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/WorkflowActionBB.bpmn
index 70ae02b..a389e80 100644
--- a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/WorkflowActionBB.bpmn
+++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/WorkflowActionBB.bpmn
@@ -22,7 +22,6 @@
         <camunda:out source="orchestrationStatusValidationResult" target="orchestrationStatusValidationResult" />
         <camunda:out source="RetryDuration" target="RetryDuration" />
         <camunda:in source="suppressRollback" target="suppressRollback" />
-        <camunda:out source="WorkflowException" target="WorkflowException" />
       </bpmn:extensionElements>
       <bpmn:incoming>SequenceFlow_0mew9im</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_07h9d4y</bpmn:outgoing>
@@ -563,4 +562,4 @@
       </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
-</bpmn:definitions>
+</bpmn:definitions>
\ No newline at end of file
diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/BaseBPMNTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/BaseBPMNTest.java
index 1e3f175..f501151 100644
--- a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/BaseBPMNTest.java
+++ b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/BaseBPMNTest.java
@@ -50,6 +50,7 @@
 import org.onap.so.bpmn.infrastructure.adapter.vnf.tasks.VnfAdapterDeleteTasks;
 import org.onap.so.bpmn.infrastructure.adapter.vnf.tasks.VnfAdapterImpl;
 import org.onap.so.bpmn.infrastructure.appc.tasks.AppcRunTasks;
+import org.onap.so.bpmn.infrastructure.flowspecific.tasks.ActivateVfModule;
 import org.onap.so.bpmn.infrastructure.flowspecific.tasks.AssignNetwork;
 import org.onap.so.bpmn.infrastructure.flowspecific.tasks.AssignNetworkBBUtils;
 import org.onap.so.bpmn.infrastructure.flowspecific.tasks.AssignVnf;
@@ -171,6 +172,9 @@
 	protected AAICommonTasks aaiCommonTasks;
 
 	@MockBean
+	protected ActivateVfModule activateVfModule;
+	
+	@MockBean
 	protected AssignVnf assignVnf;
 
 	@MockBean
diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/ActivateVfModuleBBTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/ActivateVfModuleBBTest.java
index 2c27771..1bce605 100644
--- a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/ActivateVfModuleBBTest.java
+++ b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/ActivateVfModuleBBTest.java
@@ -22,22 +22,30 @@
 import static org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareAssertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doThrow;
-
 import java.io.IOException;
-
 import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.runtime.ProcessInstance;
+import org.junit.Before;
 import org.junit.Test;
 import org.onap.so.bpmn.BaseBPMNTest;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 
 public class ActivateVfModuleBBTest extends BaseBPMNTest{
+	
+	@Before
+	public void before() {
+		variables.put("vfModuleActivateTimerDuration", "PT2S");
+	}
+
 	@Test
 	public void sunnyDay() throws InterruptedException, IOException {
 		mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
 		ProcessInstance pi = runtimeService.startProcessInstanceByKey("ActivateVfModuleBB", variables);
+		while(runtimeService.createProcessInstanceQuery().processInstanceId(pi.getId()).singleResult() != null) {
+			Thread.sleep(1000);
+		}
 		assertThat(pi).isNotNull();
-		assertThat(pi).isStarted().hasPassedInOrder("ActivateVfModuleBB_Start", "ActivateVfModule", "CallActivity_sdncHandler",
+		assertThat(pi).isStarted().hasPassedInOrder("ActivateVfModuleBB_Start", "SetTimerDuration", "Timer", "ActivateVfModule", "CallActivity_sdncHandler",
 				"UpdateVfModuleActiveStatus", "ActivateVfModuleBB_End");
 		assertThat(pi).isEnded();
 	}
@@ -47,8 +55,11 @@
 		mockSubprocess("SDNCHandler", "My Mock Process Name", "GenericStub");
 		doThrow(BpmnError.class).when(aaiUpdateTasks).updateOrchestrationStatusActivateVfModule(any(BuildingBlockExecution.class));
 		ProcessInstance pi = runtimeService.startProcessInstanceByKey("ActivateVfModuleBB", variables);
+		while(runtimeService.createProcessInstanceQuery().processInstanceId(pi.getId()).singleResult() != null) {
+			Thread.sleep(1000);
+		}
 		assertThat(pi).isNotNull().isStarted()
-				.hasPassedInOrder("ActivateVfModuleBB_Start", "ActivateVfModule", "UpdateVfModuleActiveStatus")
+				.hasPassedInOrder("ActivateVfModuleBB_Start", "SetTimerDuration", "Timer", "ActivateVfModule", "UpdateVfModuleActiveStatus")
 				.hasNotPassed("ActivateVfModuleBB_End");
 	}
 }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterRestV1.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterRestV1.java
index d821223..d919c53 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterRestV1.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterRestV1.java
@@ -68,8 +68,8 @@
 				throw new Exception("No Network Request was created. networkAdapterRequest was null.");
 			}
 		} catch (Exception ex) {
-			exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, ex.getStackTrace().toString());
-		}	
+			exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, ex);
+		}
 	}
 	
 	public void processCallback (DelegateExecution execution) {
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ActivateVfModule.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ActivateVfModule.java
new file mode 100644
index 0000000..32c852b
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ActivateVfModule.java
@@ -0,0 +1,35 @@
+package org.onap.so.bpmn.infrastructure.flowspecific.tasks;
+
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ActivateVfModule {
+
+    private static final Logger logger = LoggerFactory.getLogger(ActivateVfModule.class);
+	
+	protected static final String VF_MODULE_TIMER_DURATION_PATH = "mso.workflow.vfModuleActivate.timer.duration";
+	protected static final String DEFAULT_TIMER_DURATION = "PT180S";
+	
+	@Autowired
+	private ExceptionBuilder exceptionUtil;
+	
+	@Autowired
+    private Environment environment;
+
+
+	public void setTimerDuration(BuildingBlockExecution execution) {
+		try {
+			String waitDuration = this.environment.getProperty(VF_MODULE_TIMER_DURATION_PATH, DEFAULT_TIMER_DURATION);
+			logger.debug("Sleeping before proceeding with SDNC activate. Timer duration: {}", waitDuration);
+			execution.setVariable("vfModuleActivateTimerDuration", waitDuration);
+		} catch (Exception e) {
+			exceptionUtil.buildAndThrowWorkflowException(execution, 7000, e);
+		}
+	}
+}
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
index d18fd00..bff320a 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
@@ -303,8 +303,9 @@
 				}
 			}
 
-			// If the user set "Homing_Solution" to "none", disable homing, else if "Homing_Solution" is specified, enable it.
-			if (sIRequest.getRequestDetails().getRequestParameters().getUserParams() != null) {
+			// If the user set "Homing_Solution" to "none", disable homing, else if "Homing_Solution" is specified, enable it.			
+			if (sIRequest.getRequestDetails().getRequestParameters() != null && 
+					sIRequest.getRequestDetails().getRequestParameters().getUserParams() != null) {
 				List<Map<String, Object>> userParams = sIRequest.getRequestDetails().getRequestParameters().getUserParams();
 				for (Map<String, Object> params : userParams) {
 					if (params.containsKey(HOMINGSOLUTION)) {
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java
index 794314b..4c84ee4 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapper.java
@@ -22,6 +22,7 @@
 
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -92,14 +93,19 @@
 			networkTechnology = l3Network.getNetworkTechnology();
 			logger.warn("NetworkTechnology was null in CatalogDB. Using field from AAI: " + networkTechnology);
 		}
-		createNetworkRequest.setNetworkTechnology(setNetworkTechnology(networkTechnology));
+		if (networkTechnology != null) {
+			createNetworkRequest.setNetworkTechnology(networkTechnology.toUpperCase());
+			if (createNetworkRequest.getNetworkTechnology().contains("CONTRAIL")) {
+				createNetworkRequest.setContrailRequest(true);
+			}
+		}
 		
 		//build and set Contrail Network
 		ContrailNetwork contrailNetwork = buildContrailNetwork(l3Network, customer);
 		createNetworkRequest.setContrailNetwork(contrailNetwork);
 		
-		//set Network Parameters from VID request
-		createNetworkRequest.setNetworkParams(userInput);
+		//set Network Parameters from VID request, add "shared" and "external" to this map
+		createNetworkRequest.setNetworkParams(addSharedAndExternal(userInput, l3Network));
 		
 		createNetworkRequest = setFlowFlags(createNetworkRequest, orchestrationContext);
 
@@ -112,16 +118,6 @@
 		return createNetworkRequest;
 	}
 
-	protected NetworkTechnology setNetworkTechnology(String networkTechnology) {
-		if(networkTechnology.equalsIgnoreCase("Contrail")) {
-			return NetworkTechnology.CONTRAIL;
-		} else if(networkTechnology.equalsIgnoreCase("Neutron")){
-			return NetworkTechnology.NEUTRON;
-		} else {
-			return NetworkTechnology.VMWARE;
-		}
-	}
-	
 	public DeleteNetworkRequest deleteNetworkRequestMapper(RequestContext requestContext, CloudRegion cloudRegion, ServiceInstance serviceInstance, L3Network l3Network) throws UnsupportedEncodingException {
 		DeleteNetworkRequest deleteNetworkRequest = new DeleteNetworkRequest();
 		
@@ -182,7 +178,7 @@
 		updateNetworkRequest.setSubnets(buildOpenstackSubnetList(l3Network));
 		updateNetworkRequest.setProviderVlanNetwork(buildProviderVlanNetwork(l3Network));
 		updateNetworkRequest.setContrailNetwork(buildContrailNetwork(l3Network, customer));
-		updateNetworkRequest.setNetworkParams(userInput);
+		updateNetworkRequest.setNetworkParams(addSharedAndExternal(userInput, l3Network));
 		updateNetworkRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
 		
 		setFlowFlags(updateNetworkRequest, orchestrationContext);
@@ -371,4 +367,16 @@
 		updateNetworkRequest.setBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
 		//NetworkTechnology(NetworkTechnology.NEUTRON); NOOP - default
 	}
-}
\ No newline at end of file
+	
+	private Map<String, String> addSharedAndExternal(Map<String, String> userInput, L3Network l3Network) {
+		if (userInput == null)
+			userInput = new HashMap<String, String>();
+		if (!userInput.containsKey("shared")) {
+			userInput.put("shared", Optional.ofNullable(l3Network.isIsSharedNetwork()).orElse(false).toString());
+		}
+		if (!userInput.containsKey("external")) {
+			userInput.put("external", Optional.ofNullable(l3Network.isIsExternalNetwork()).orElse(false).toString());
+		}
+		return userInput;
+	}
+}
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ActivateVfModuleTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ActivateVfModuleTest.java
new file mode 100644
index 0000000..57e463c
--- /dev/null
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/ActivateVfModuleTest.java
@@ -0,0 +1,24 @@
+package org.onap.so.bpmn.infrastructure.flowspecific.tasks;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.onap.so.bpmn.BaseTaskTest;
+
+public class ActivateVfModuleTest extends BaseTaskTest {
+	
+	@InjectMocks
+	private ActivateVfModule activateVfModule = new ActivateVfModule();
+	
+	@Test
+	public void setWaitBeforeDurationTest() throws Exception {
+		when(env.getProperty(ActivateVfModule.VF_MODULE_TIMER_DURATION_PATH, ActivateVfModule.DEFAULT_TIMER_DURATION)).thenReturn("PT300S");
+		activateVfModule.setTimerDuration(execution);
+		verify(env, times(1)).getProperty(ActivateVfModule.VF_MODULE_TIMER_DURATION_PATH, ActivateVfModule.DEFAULT_TIMER_DURATION);
+		assertEquals("PT300S", (String) execution.getVariable("vfModuleActivateTimerDuration"));
+	}
+
+}
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapperTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapperTest.java
index 1a86d71..0a6310b 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapperTest.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/network/mapper/NetworkAdapterObjectMapperTest.java
@@ -30,6 +30,7 @@
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -99,24 +100,6 @@
 	}
 	
 	@Test
-	public void testSetNetworkTechnology() {
-		String networkTechnology = "Contrail";
-		NetworkTechnology expectedNetworkTechnology = NetworkTechnology.CONTRAIL;
-		NetworkTechnology actualNetworkTechnology = SPY_networkAdapterObjectMapper.setNetworkTechnology(networkTechnology);
-		assertEquals("NetworkTechnology matches", expectedNetworkTechnology, actualNetworkTechnology);
-		
-		networkTechnology = "Neutron";
-		expectedNetworkTechnology = NetworkTechnology.NEUTRON;
-		actualNetworkTechnology = SPY_networkAdapterObjectMapper.setNetworkTechnology(networkTechnology);
-		assertEquals("NetworkTechnology matches", expectedNetworkTechnology, actualNetworkTechnology);
-		
-		networkTechnology = "Vmware";
-		expectedNetworkTechnology = NetworkTechnology.VMWARE;
-		actualNetworkTechnology = SPY_networkAdapterObjectMapper.setNetworkTechnology(networkTechnology);
-		assertEquals("NetworkTechnology matches", expectedNetworkTechnology, actualNetworkTechnology);
-		
-	}
-	@Test
 	public void buildCreateNetworkRequestFromBbobjectTest() throws Exception {
 
 		String cloudRegionPo = "cloudRegionPo";
@@ -129,12 +112,17 @@
 		expectedCreateNetworkRequest.setNetworkType(l3Network.getNetworkType());
 		expectedCreateNetworkRequest.setBackout(false);
 		expectedCreateNetworkRequest.setFailIfExists(true);
-		expectedCreateNetworkRequest.setNetworkTechnology(NetworkTechnology.CONTRAIL);
+		expectedCreateNetworkRequest.setNetworkTechnology("CONTRAIL");
 		MsoRequest msoRequest = new MsoRequest();
 		msoRequest.setRequestId(requestContext.getMsoRequestId());
 		msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId());
 		expectedCreateNetworkRequest.setMsoRequest(msoRequest);
 		expectedCreateNetworkRequest.setSkipAAI(true);
+		HashMap<String, String> networkParams = new HashMap<String, String>();
+		networkParams.put("shared", "true");
+		networkParams.put("external", "false");
+		networkParams.put("testUserInputKey", "testUserInputValue");
+		expectedCreateNetworkRequest.setNetworkParams(networkParams);
 		
 		expectedCreateNetworkRequest.setNotificationUrl("endpoint/NetworkAResponse/messageId");
 		
@@ -148,13 +136,15 @@
 		subnetList.add(openstackSubnet);
 		l3Network.getSubnets().add(openstackSubnet);
 		l3Network.setNetworkTechnology("Contrail");
+		l3Network.setIsSharedNetwork(true);
+		l3Network.setIsExternalNetwork(false);
 
 		doReturn("endpoint/").when(SPY_networkAdapterObjectMapper).getEndpoint();
 		doReturn("messageId").when(SPY_networkAdapterObjectMapper).getRandomUuid();
 		
 		CreateNetworkRequest createNetworkRequest  = SPY_networkAdapterObjectMapper.createNetworkRequestMapper(requestContext, cloudRegion, orchestrationContext, serviceInstance, l3Network, userInput, cloudRegionPo, customer);
 		
-		assertThat(createNetworkRequest, sameBeanAs(expectedCreateNetworkRequest).ignoring("contrailRequest").ignoring("contrailNetwork").ignoring("providerVlanNetwork").ignoring("subnets").ignoring("networkParams").ignoring("messageId"));
+		assertThat(createNetworkRequest, sameBeanAs(expectedCreateNetworkRequest).ignoring("contrailRequest").ignoring("contrailNetwork").ignoring("providerVlanNetwork").ignoring("subnets").ignoring("messageId"));
 	}
 	
 	@Test
@@ -243,6 +233,12 @@
 		l3Network.getSubnets().add(actualSubnet);
 		l3Network.getNetworkPolicies().add(networkPolicy);
 		l3Network.getContrailNetworkRouteTableReferences().add(routeTableReference);
+		l3Network.setIsSharedNetwork(false);
+		l3Network.setIsExternalNetwork(false);
+		HashMap<String, String> networkParams = new HashMap<String, String>();
+		networkParams.put("shared", "false");
+		networkParams.put("external", "false");
+		networkParams.put("testUserInputKey", "testUserInputValue");
 				
 		UpdateNetworkRequest expectedUpdateNetworkRequest = new UpdateNetworkRequest();
 		expectedUpdateNetworkRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
@@ -256,7 +252,7 @@
 		expectedUpdateNetworkRequest.setSubnets(subnets);
 		expectedUpdateNetworkRequest.setProviderVlanNetwork(providerVlanNetwork);
 		expectedUpdateNetworkRequest.setContrailNetwork(contrailNetwork);
-		expectedUpdateNetworkRequest.setNetworkParams(userInput);
+		expectedUpdateNetworkRequest.setNetworkParams(networkParams);
 		expectedUpdateNetworkRequest.setMsoRequest(msoRequest);
 		expectedUpdateNetworkRequest.setSkipAAI(true);
 		expectedUpdateNetworkRequest.setBackout(Boolean.TRUE.equals(orchestrationContext.getIsRollbackEnabled()));
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAINetworkResourcesTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAINetworkResourcesTest.java
index 2efdbde..f20c646 100644
--- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAINetworkResourcesTest.java
+++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAINetworkResourcesTest.java
@@ -159,7 +159,7 @@
 		final String content = new String(Files.readAllBytes(Paths.get(JSON_FILE_LOCATION + "queryAaiVpnBinding.json")));
 		AAIResultWrapper aaiResultWrapper = new AAIResultWrapper(content);
 		Optional<VpnBinding> oVpnBinding = Optional.empty();
-		AAIResourceUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.VPN_BINDING, "ModelInvariantUUID", "serviceModelVersionId");
+		AAIResourceUri aaiUri = AAIUriFactory.createResourceUri(AAIObjectType.VPN_BINDING, "ModelInvariantUUID");
 		
 		doReturn(aaiResultWrapper).when(MOCK_aaiResourcesClient).get(isA(AAIResourceUri.class));
 		oVpnBinding = aaiNetworkResources.getVpnBinding(aaiUri);
@@ -176,7 +176,7 @@
 		final String content = new String(Files.readAllBytes(Paths.get(JSON_FILE_LOCATION + "queryAaiNetworkPolicy.json")));
 		AAIResultWrapper aaiResultWrapper = new AAIResultWrapper(content);
 		Optional<NetworkPolicy> oNetPolicy = Optional.empty();
-		AAIResourceUri netPolicyUri = AAIUriFactory.createResourceUri(AAIObjectType.NETWORK_POLICY, "ModelInvariantUUID", "serviceModelVersionId");
+		AAIResourceUri netPolicyUri = AAIUriFactory.createResourceUri(AAIObjectType.NETWORK_POLICY, "ModelInvariantUUID");
 		
 		doReturn(aaiResultWrapper).when(MOCK_aaiResourcesClient).get(isA(AAIResourceUri.class));
 		oNetPolicy = aaiNetworkResources.getNetworkPolicy(netPolicyUri);
@@ -193,7 +193,7 @@
 		final String content = new String(Files.readAllBytes(Paths.get(JSON_FILE_LOCATION + "queryAaiNetworkTableRefs.json")));
 		AAIResultWrapper aaiResultWrapper = new AAIResultWrapper(content);
 		Optional<RouteTableReference> oRtref = Optional.empty();
-		AAIResourceUri rTRefUri = AAIUriFactory.createResourceUri(AAIObjectType.ROUTE_TABLE_REFERENCE, "ModelInvariantUUID", "serviceModelVersionId");
+		AAIResourceUri rTRefUri = AAIUriFactory.createResourceUri(AAIObjectType.ROUTE_TABLE_REFERENCE, "ModelInvariantUUID");
 		
 		doReturn(aaiResultWrapper).when(MOCK_aaiResourcesClient).get(isA(AAIResourceUri.class));
 		oRtref = aaiNetworkResources.getRouteTable(rTRefUri);
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java
index 4f3816a..b3bfcc1 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java
@@ -30,6 +30,7 @@
 
 	CUSTOMER(AAINamespaceConstants.BUSINESS, "/customers"),
 	GENERIC_VNF(AAINamespaceConstants.NETWORK, "/generic-vnfs"),
+	PORT_GROUP(AAIObjectType.VCE.uriTemplate(), "/port-groups"),
 	PSERVER(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/pservers"),
 	P_INTERFACE(AAIObjectType.PSERVER.uriTemplate(), "/p-interfaces"),
 	L3_NETWORK(AAINamespaceConstants.NETWORK, "/l3-networks"),
diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
index f003dc0..0237f91 100644
--- a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
+++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java
@@ -45,9 +45,10 @@
 import org.onap.aai.domain.yang.PInterface;
 import org.onap.aai.domain.yang.PhysicalLink;
 import org.onap.aai.domain.yang.Platform;
+import org.onap.aai.domain.yang.PortGroup;
 import org.onap.aai.domain.yang.Project;
 import org.onap.aai.domain.yang.Pserver;
-import org.onap.aai.domain.yang.RouteTableReferences;
+import org.onap.aai.domain.yang.RouteTableReference;
 import org.onap.aai.domain.yang.ServiceInstance;
 import org.onap.aai.domain.yang.ServiceSubscription;
 import org.onap.aai.domain.yang.SpPartner;
@@ -80,9 +81,10 @@
 	NETWORK_POLICY(AAINamespaceConstants.NETWORK, NetworkPolicy.class),
 	NODES_QUERY("/search", "/nodes-query"),
 	CUSTOM_QUERY("/query", ""),
-	ROUTE_TABLE_REFERENCE(AAINamespaceConstants.NETWORK, RouteTableReferences.class),
+	ROUTE_TABLE_REFERENCE(AAINamespaceConstants.NETWORK, RouteTableReference.class),
 	DEFAULT_TENANT(AAINamespaceConstants.CLOUD_INFRASTRUCTURE + "/cloud-regions/cloud-region/" + Defaults.CLOUD_OWNER + "/AAIAIC25", "/tenants/tenant/{tenant-id}"),
 	VCE(AAINamespaceConstants.NETWORK, Vce.class),
+	PORT_GROUP(AAIObjectType.VCE.uriTemplate(), PortGroup.class),
 	VPN_BINDING(AAINamespaceConstants.NETWORK, VpnBinding.class),
 	CONFIGURATION(AAINamespaceConstants.NETWORK, Configuration.class),
 	PSERVER(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, Pserver.class),
diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/HttpLookupUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/HttpLookupUri.java
index 884f8c6..324bb8a 100644
--- a/common/src/main/java/org/onap/so/client/aai/entities/uri/HttpLookupUri.java
+++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/HttpLookupUri.java
@@ -22,7 +22,6 @@
 
 import java.io.IOException;
 import java.net.URI;
-import java.util.Arrays;
 import java.util.Map;
 import java.util.Optional;
 
@@ -38,6 +37,7 @@
 import org.onap.so.client.graphinventory.exceptions.GraphInventoryPayloadException;
 import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriComputationException;
 import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriNotFoundException;
+import org.onap.so.client.graphinventory.exceptions.IncorrectNumberOfUriKeys;
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -118,6 +118,18 @@
 	@Override
 	public abstract HttpLookupUri clone();
 	
+	@Override
+	public void validateValuesSize(String template, Object... values) {
+		try {
+			super.validateValuesSize(template, values);
+		} catch (IncorrectNumberOfUriKeys e) {
+			if (values.length == 1) {
+				//Special case where we perform an http look up
+			} else {
+				throw e;
+			}
+		}
+	}
 	public AAIResourcesClient getResourcesClient() {
 		return new AAIResourcesClient();
 	}
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java
index 2876f77..93de913 100644
--- a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java
+++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java
@@ -24,11 +24,11 @@
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 import javax.ws.rs.core.UriBuilder;
 
@@ -39,6 +39,7 @@
 import org.onap.so.client.graphinventory.GraphInventoryObjectType;
 import org.onap.so.client.graphinventory.entities.uri.parsers.UriParser;
 import org.onap.so.client.graphinventory.entities.uri.parsers.UriParserSpringImpl;
+import org.onap.so.client.graphinventory.exceptions.IncorrectNumberOfUriKeys;
 import org.springframework.web.util.UriUtils;
 
 public class SimpleUri implements GraphInventoryResourceUri, Serializable {
@@ -56,6 +57,7 @@
 		this.pluralType = null;
 		this.internalURI = UriBuilder.fromPath(this.getTemplate(type));
 		this.values = values;
+		validateValuesSize(this.getTemplate(type), values);
 	}
 	protected SimpleUri(GraphInventoryObjectType type, URI uri) {
 		this.type = type;
@@ -86,12 +88,14 @@
 		this.pluralType = type;
 		this.internalURI = UriBuilder.fromPath(this.getTemplate(type));
 		this.values = values;
+		validateValuesSize(this.getTemplate(type), values);
 	}
 	protected SimpleUri(GraphInventoryResourceUri parentUri, GraphInventoryObjectType childType, Object... childValues) {
 		this.type = childType;
 		this.pluralType = null;
 		this.internalURI = UriBuilder.fromUri(parentUri.build()).path(childType.partialUri());
 		this.values = childValues;
+		validateValuesSize(childType.partialUri(), values);
 	}
 	
 	protected void setInternalURI(UriBuilder builder) {
@@ -232,6 +236,14 @@
 		return this;
 	}
 	
+	public void validateValuesSize(String template, Object... values) {
+		UriParser parser = new UriParserSpringImpl(template);
+		Set<String> variables = parser.getVariables();
+		if (variables.size() != values.length) {
+			throw new IncorrectNumberOfUriKeys(String.format("Expected %s variables: %s", variables.size(), variables));
+		}
+	}
+	
 	protected String getTemplate(GraphInventoryObjectType type) {
 		return type.uriTemplate();
 	}
diff --git a/common/src/main/java/org/onap/so/client/graphinventory/exceptions/IncorrectNumberOfUriKeys.java b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/IncorrectNumberOfUriKeys.java
new file mode 100644
index 0000000..c94e561
--- /dev/null
+++ b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/IncorrectNumberOfUriKeys.java
@@ -0,0 +1,11 @@
+package org.onap.so.client.graphinventory.exceptions;
+
+public class IncorrectNumberOfUriKeys extends RuntimeException {
+
+	private static final long serialVersionUID = 2189285428827817518L;
+	
+	public IncorrectNumberOfUriKeys(String message) {
+		super(message);
+	}
+
+}
diff --git a/common/src/test/java/org/onap/so/client/aai/entities/uri/IncorrectNumberOfUriKeysTest.java b/common/src/test/java/org/onap/so/client/aai/entities/uri/IncorrectNumberOfUriKeysTest.java
new file mode 100644
index 0000000..729f0e5
--- /dev/null
+++ b/common/src/test/java/org/onap/so/client/aai/entities/uri/IncorrectNumberOfUriKeysTest.java
@@ -0,0 +1,50 @@
+package org.onap.so.client.aai.entities.uri;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onap.so.client.aai.AAIObjectPlurals;
+import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.graphinventory.exceptions.IncorrectNumberOfUriKeys;
+
+public class IncorrectNumberOfUriKeysTest {
+
+	@Rule
+	public ExpectedException thrown = ExpectedException.none();
+	
+	@Test
+	public void verifyIncorrectNumberOfKeysSingle() {
+		
+		thrown.expect(IncorrectNumberOfUriKeys.class);
+		thrown.expectMessage(equalTo("Expected 3 variables: [cloud-owner, cloud-region-id, volume-group-id]"));
+		AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VOLUME_GROUP, "volume-group-id");
+		
+	}
+	
+	@Test
+	public void verifyIncorrectNumberOfKeysPlural() {
+		
+		thrown.expect(IncorrectNumberOfUriKeys.class);
+		AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.VOLUME_GROUP, "my-cloud-owner");
+		
+	}
+	
+	@Test
+	public void verifyIncorrectNumberOfKeysFromParent() {
+		
+		thrown.expect(IncorrectNumberOfUriKeys.class);
+		AAIResourceUri parentUri = AAIUriFactory.createResourceUri(AAIObjectType.CLOUD_REGION, "my-cloud-owner", "my-cloud-region-id");
+		AAIResourceUri uri = AAIUriFactory.createResourceFromParentURI(parentUri, AAIObjectType.VOLUME_GROUP);
+	}
+	
+	@Test
+	public void verifyIncorrectNumberOfKeysHttpAware() {
+
+		thrown.expect(IncorrectNumberOfUriKeys.class);
+		AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, "customer-id", "subscription-id");
+	}
+}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/helpers/SDCClientHelper.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/helpers/SDCClientHelper.java
index 4e8e956..5ead7dd 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/helpers/SDCClientHelper.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/tenantisolation/helpers/SDCClientHelper.java
@@ -21,6 +21,7 @@
 package org.onap.so.apihandlerinfra.tenantisolation.helpers;
 
 import java.net.URL;
+import java.util.UUID;
 
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
@@ -92,6 +93,11 @@
 
 			HttpClient httpClient = httpClientFactory.newJsonClient(url, TargetEntity.SDC);
 			httpClient.addBasicAuthHeader(sdcClientAuth, msoKey);
+			httpClient.addAdditionalHeader("X-ECOMP-InstanceID", sdcActivateInstanceId);
+			httpClient.addAdditionalHeader("X-ECOMP-RequestID", UUID.randomUUID().toString());
+			httpClient.addAdditionalHeader("Content-Type", SDCClientHelper.SDC_CONTENT_TYPE);
+			httpClient.addAdditionalHeader("Accept", SDCClientHelper.SDC_ACCEPT_TYPE);
+			httpClient.addAdditionalHeader("USER_ID", sdcActivateUserId);
 
 			Response apiResponse = setHttpPostResponse(httpClient, jsonPayload);
 			int statusCode = apiResponse.getStatus();;