diff --git a/vid-app-common/src/main/webapp/WEB-INF/conf/dev.features.properties b/vid-app-common/src/main/webapp/WEB-INF/conf/dev.features.properties
new file mode 100644
index 0000000..8ff0db2
--- /dev/null
+++ b/vid-app-common/src/main/webapp/WEB-INF/conf/dev.features.properties
@@ -0,0 +1,14 @@
+FLAG_ASYNC_INSTANTIATION = true
+FLAG_ASYNC_JOBS = true
+FLAG_REGION_ID_FROM_REMOTE = true
+CREATE_INSTANCE_TEST = false
+EMPTY_DRAWING_BOARD_TEST = false
+FLAG_ADVANCED_PORTS_FILTER = true
+FLAG_ADD_MSO_TESTAPI_FIELD = true
+FLAG_UNASSIGN_SERVICE = true
+FLAG_COLLECTION_RESOURCE_SUPPORT = true
+FLAG_NETWORK_TO_ASYNC_INSTANTIATION = true
+FLAG_SERVICE_MODEL_CACHE = true
+FLAG_SHOW_ASSIGNMENTS = true
+FLAG_SHOW_VERIFY_SERVICE=false
+FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD = false
diff --git a/vid-app-common/src/main/webapp/WEB-INF/conf/features.properties b/vid-app-common/src/main/webapp/WEB-INF/conf/features.properties
new file mode 100644
index 0000000..de466be
--- /dev/null
+++ b/vid-app-common/src/main/webapp/WEB-INF/conf/features.properties
@@ -0,0 +1,11 @@
+#    features.properties
+#    -------------------
+
+#    This file is, generally, empty.
+
+#    Configure `featureFlags.filename` in system.properties to use
+#    one of the ready-made sets:
+
+#    -  featureFlags.filename = ci.features.properties
+#    -  featureFlags.filename = ist.features.properties
+#    -  featureFlags.filename = e2e.features.properties
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/constants/componentConstants.js b/vid-app-common/src/main/webapp/app/vid/scripts/constants/componentConstants.js
index b08b2b1..e3edf83 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/constants/componentConstants.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/constants/componentConstants.js
@@ -29,6 +29,7 @@
 	CLOUD_REGION_ID : "cloudRegionID",
     COMPONENT_STATUS : "ComponentStatus",
     CREATE_COMPONENT : "createComponent",
+	IFRAME_DIALOG : "iframeDialog",
     DELETE_RESUME_COMPONENT : "deleteResumeComponent",
     DELETE:"Delete",
     RESUME:"Resume",
@@ -46,6 +47,7 @@
 	MODEL_VERSION_1 : "1",
 	MSO_CREATE_REQ : "createInstance",
 	MSO_DELETE_REQ : "deleteInstance",
+	MSO_DELETE_CONFIGURATION_REQ : 'deleteConfiguration',
 	MSO_CHANGE_CONFIG_STATUS_REQ: "changeConfigurationStatus",
 	MSO_CHANGE_PORT_STATUS_REQ: "changePortStatus",
 	MSO_CREATE_ENVIRONMENT: "createEnvironmentInstance",
@@ -81,7 +83,6 @@
 	VNF_TYPE : "vnfType",
 	VOLUME_GROUP : "volumeGroup",
     IS_PERMITTED: "is-permitted",
-    RESUME_STATUS: "PendingActivation",
     PNF : "pnf",
         // IDs
 	CIDR_MASK_1 : "255.255.255.000",
@@ -123,6 +124,8 @@
 	AAI_GET_TENANTS : "aai_get_tenants/",
 	AAI_SUB_DETAILS_PATH : "aai_sub_details/",
     AAI_GET_VERSION_BY_INVARIANT_ID:"aai_get_version_by_invariant_id/",
+    AAI_GET_PORT_MIRRORING_CONFIGS_DATA : "aai_getPortMirroringConfigsData",
+    AAI_GET_PORT_MIRRORING_SOURCE_PORTS : "aai_getPortMirroringSourcePorts",
     SEARCH_SERVICE_INSTANCES:"search_service_instances",
     AAI_GET_VNF_DATA_PATH: "aai_get_vnf_data/",
     AAI_GET_VNF_BY_CUSTOMERID_AND_SERVICETYPE: "get_vnf_data_by_globalid_and_service_type/",
@@ -130,6 +133,7 @@
     AAI_SUB_VIEWEDIT_PATH : "aai_sub_viewedit",
 	AAI_GET_VNF_INFO : "aai_get_vnf_information",
 	AAI_GET_PNF_INSTANCE: "aai_get_service_instance_pnfs",
+	AAI_GET_CR_INSTANCE: "aai_get_network_collection_details",
 	AAI_GET_VNF_INSTANCES_LIST: "aai_get_vnf_instances",
 	AAI_GET_PNF_INSTANCES_LIST: "aai_get_pnf_instances",
 	AAI_GET_BY_URI: "aai_get_by_uri/",
@@ -146,6 +150,7 @@
 	WORKFLOW: "workflow",
 	GET_TIME_SLOTS:"get_time_slots",
 	SUBMIT_VNF_CHANGE_TIMESLOTS:"submit_vnf_change_timeslots",
+        AAI_GET_INSTANCE_GROUPS_BY_VNF_INSTANCE_ID_PATH: 'aai_get_instance_groups_by_vnf_instance_id',
 
 	FORWARD_SLASH : "/",
 	GET_SYSTEM_PROP_VNF_PROV_STATUS_PATH : "get_system_prop_vnf_prov_status",
@@ -174,14 +179,18 @@
 	SERVICES_PATH : "rest/models/services/",
 	SERVICETYPE_SUB_PATH : "&serviceType=",
 	SERVICEINSTANCEID_SUB_PATH : "&serviceInstanceId=",
+	MODELVERSIONID_SUB_PATH : "&aaiModelVersionId=",
 	SERVICEMODELS_INSTANCES_SERVICES_PATH : "serviceModels.htm#/instances/services",
 	SERVICEMODELS_MODELS_SERVICES_PATH : "serviceModels.htm#/models/services",
 	SUBDETAILS_SELECTEDSUBSCRIBER : "#subdetails?selectedSubscriber=",
 	SUBSCRIBERNAME_SUB_PATH : "&subscriberName=",
 	WELCOME_PATH : "welcome.htm",
     IS_PERMITTED_SUB_PATH: "&isPermitted=",
+	SERVICE_POPUP_IFRAME_URL: "app/ui/#/servicePopup?serviceModelId=",
+	SUB_INTERFACE_POPUP_IFRAME_URL: "app/ui/#/vlan?",
+    VERIFY_SERVICE_URL: "rest/models/services/verifyService",
 
-    //Test Environment Urls:
+        //Test Environment Urls:
 	OPERATIONAL_ENVIRONMENT_CREATE : "operationalEnvironment/create",
 	OPERATIONAL_ENVIRONMENT_DEACTIVATE : "operationalEnvironment/deactivate?operationalEnvironment=",
 	OPERATIONAL_ENVIRONMENT_ACTIVATE : "operationalEnvironment/activate?operationalEnvironment=",
@@ -196,7 +205,7 @@
 	INSTANTIATE_URL : "app/vid/scripts/view-models/instantiate.htm",
 	SERVICE_MODELS : "app/vid/scripts/view-models/serviceModels.htm",
 
-
+    ACTIVATE_SERVICE_STATUSES: ['created', 'pendingdelete', 'pending-delete', 'assigned'],
 
 	FULL_NAME_MAP : {
 	    "model-invariant-id" : "Model ID",
@@ -223,7 +232,18 @@
 		update: "update",
 		replace: "replace",
 		vnfScaleOut: "VNF Scale Out"
-	}
+	},
+
+	FEATURE_FLAGS:{
+    	FLAG_ASYNC_INSTANTIATION : "FLAG_ASYNC_INSTANTIATION",
+		FLAG_VLAN_TAGGING_VIEW_EDIT: "FLAG_VLAN_TAGGING_VIEW_EDIT",
+		FLAG_NETWORK_TO_ASYNC_INSTANTIATION : "FLAG_NETWORK_TO_ASYNC_INSTANTIATION",
+        FLAG_REGION_ID_FROM_REMOTE : "FLAG_REGION_ID_FROM_REMOTE",
+        FLAG_ADD_MSO_TESTAPI_FIELD : "FLAG_ADD_MSO_TESTAPI_FIELD",
+        FLAG_COLLECTION_RESOURCE_SUPPORT : "FLAG_COLLECTION_RESOURCE_SUPPORT",
+        FLAG_SHOW_ASSIGNMENTS: "FLAG_SHOW_ASSIGNMENTS",
+        FLAG_SHOW_VERIFY_SERVICE: "FLAG_SHOW_VERIFY_SERVICE"
+    }
 
     };
-})())
+})());
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/constants/fieldConstants.js b/vid-app-common/src/main/webapp/app/vid/scripts/constants/fieldConstants.js
index fc051d0..544a811 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/constants/fieldConstants.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/constants/fieldConstants.js
@@ -119,6 +119,8 @@
         VF_MODULES: "vfModules",
         VF_MODULE_ID: "vf-module-id",
         VF_MODULE_NAME: "vf-module-name",
+        VF_MODULE_MODEL_CUSTOMIZATION_ID: "vf-module-model-customization-id",
+        VF_MODULE_MODEL_VERSION_ID: "vf-module-model-version-id",
         VID: "VID",
         VNF_ID: "vnf-id",
         VNF_NAME: "vnf-name",
@@ -140,10 +142,9 @@
         CONFIGURATION_NAME: "configuration-name",
         CONFIGURATION_TYPE: "configuration-type",
         CONFIGURATION_ID: "configuration-id",
-        PORT: "l-interface",
-        PORT_ID: "interface-id",
-        PORT_NAME: "interface-name",
-        PORT_MIRRORED: "is-port-mirrored"
+        PORT_ID: "interfaceId",
+        PORT_NAME: "interfaceName",
+        PORT_MIRRORED: "isPortMirrored"
     };
 
     var KEY = {
@@ -270,6 +271,7 @@
         AAI_ACTIVE: "Active",
         AAI_INACTIVE: "Inactive",
         AAI_CREATED: "Created",
+        AAI_DELETE: "Deleted",
         AAI_ENABLED: "Enabled",
         AAI_DISABLED: "Disabled"
     };
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/constants/vidConfiguration.js b/vid-app-common/src/main/webapp/app/vid/scripts/constants/vidConfiguration.js
index 84cb5ad..f71213b 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/constants/vidConfiguration.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/constants/vidConfiguration.js
@@ -85,11 +85,11 @@
 	/*
 	 * Max number of times that VID will poll MSO for a given request status
 	 */
-	var MSO_MAX_POLLS = 10;
+	var MSO_MAX_POLLS = 1440;
 	/*
 	 * Number of msecs that VID will wait between MSO polls.
 	 */
-	var MSO_POLLING_INTERVAL_MSECS = 10000;
+	var MSO_POLLING_INTERVAL_MSECS = 200;
 	
 	var SCHEDULER_POLLING_INTERVAL_MSECS = 10000;
 	
@@ -109,6 +109,8 @@
 
 	var SCALE_OUT_CONTROLLERS = ["", "SDNC", "APPC"];
 	
+	var SDNC_SHOW_ASSIGNMENTS_URL = "https://sdnc.api.simpledemo.onap.org:8448/configAdapter/index#/resource_manager/<SERVICE_INSTANCE_ID>";
+	
     return {
     	ASDC_MODEL_STATUS : ASDC_MODEL_STATUS,
     	MSO_MAX_POLLS : MSO_MAX_POLLS,
@@ -122,6 +124,7 @@
     	COMPONENT_LIST_NAMED_QUERY_ID : COMPONENT_LIST_NAMED_QUERY_ID,
         SCHEDULER_CALLBACK_URL: SCHEDULER_CALLBACK_URL,
         SCHEDULER_PORTAL_URL: SCHEDULER_PORTAL_URL,
+	        SDNC_SHOW_ASSIGNMENTS_URL: SDNC_SHOW_ASSIGNMENTS_URL,
 		SCALE_OUT_CONTROLLERS: SCALE_OUT_CONTROLLERS
     };
 })())
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/InstantiationController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/InstantiationController.js
index f1dc384..1b3ab09 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/InstantiationController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/InstantiationController.js
@@ -23,35 +23,38 @@
  * deployable objects (Services, VNFs, VF-Modules, Networks, and Volume-Groups)
  */
 (function () {
-	"use strict";
+    "use strict";
 
-	appDS2.requires.push('ui.tree');
+    appDS2.requires.push('ui.tree');
 
-	appDS2.controller("InstantiationController", function ($scope, $route, $location, $timeout, COMPONENT, VIDCONFIGURATION, FIELD, DataService, PropertyService, UtilityService, VnfService, $http, vidService, AaiService,PnfService, $q) {
-
-		$scope.popup = new Object();
-		$scope.defaultBaseUrl = "";
-		$scope.responseTimeoutMsec = 60000;
-		$scope.properties = UtilityService.getProperties();
+    appDS2.controller("InstantiationController", function ($scope, $route, $location, $timeout, COMPONENT, VIDCONFIGURATION, FIELD, DataService, PropertyService, UtilityService, VnfService, $http, vidService, AaiService, PnfService, CrService, AsdcService, $q, featureFlags, _, CreationService, $window) {
+        $scope.popup = new Object();
+        $scope.defaultBaseUrl = "";
+        $scope.responseTimeoutMsec = 60000;
+        $scope.properties = UtilityService.getProperties();
         $scope.resumeStatus = COMPONENT.RESUME_STATUS;
         //isPermitted - returned as string from url and converted into boolean
-		$scope.isPermitted = $location.search().isPermitted == "true";
-		$scope.STATUS_CONSTANTS = FIELD.STATUS;
+        $scope.isPermitted = $location.search().isPermitted == "true";
+        $scope.STATUS_CONSTANTS = FIELD.STATUS;
         $scope.pnfs = [];// PNF data init;
-
-        $scope.init = function() {
+        $scope.collectionResource = {};
+        $scope.collections = [];
+        $scope.networks = [];
+        $scope.isCR = false;
+        $scope.isVFC = false;
+        $scope.init = function () {
             /*
              * These 2 statements should be included in non-test code.
              */
-        	// takes a default value, retrieves the prop value from the file system and sets it
-    		var msecs = PropertyService.retrieveMsoMaxPollingIntervalMsec();
-    		PropertyService.setMsoMaxPollingIntervalMsec(msecs);
-    		
-    		// takes a default value, retrieves the prop value from the file system and sets it
-    		var polls = PropertyService.retrieveMsoMaxPolls();
-    		PropertyService.setMsoMaxPolls(polls);
-    		
-    		PropertyService.setServerResponseTimeoutMsec(30000);
+            // takes a default value, retrieves the prop value from the file system and sets it
+            var msecs = PropertyService.retrieveMsoMaxPollingIntervalMsec();
+            PropertyService.setMsoMaxPollingIntervalMsec(msecs);
+
+            // takes a default value, retrieves the prop value from the file system and sets it
+            var polls = PropertyService.retrieveMsoMaxPolls();
+            PropertyService.setMsoMaxPolls(polls);
+
+            PropertyService.setServerResponseTimeoutMsec(30000);
 
             /*
              * Common parameters that shows an example of how the view edit screen
@@ -72,273 +75,219 @@
 
         //PropertyService.setMsoBaseUrl("testmso");
 
-		$scope.convertModel = function(asdcModel) {
-			if (!asdcModel) return undefined;
-			var convertedAsdcModel = UtilityService.convertModel(asdcModel);
-			return convertedAsdcModel;
-		};
-		
-		$scope.service = {
-			"model": vidService.getModel(),
-			"convertedModel": $scope.convertModel(vidService.getModel()),
-			"instance": vidService.getInstance()
-		};
+        $scope.convertModel = function (asdcModel) {
+            if (!asdcModel) return undefined;
+            var convertedAsdcModel = UtilityService.convertModel(asdcModel);
+            return convertedAsdcModel;
+        };
 
-		preparePnfs();
+        $scope.prepareScopeWithModel = function () {
+            // skip if no model
+            if (!vidService.getModel()) return;
+
+            $scope.service = {
+                "model": vidService.getModel(),
+                "convertedModel": $scope.convertModel(vidService.getModel()),
+                "instance": vidService.getInstance()
+            };
 
 
-        function preparePnfs(){
-        	var serviceInstance = {
+            $scope.isCR = !_.isEmpty($scope.service.model.collectionResource) && featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_COLLECTION_RESOURCE_SUPPORT);
+            if ($scope.isCR)
+                prepareCr();
+            else
+                preparePnfs();
+        };
+
+        function preparePnfs() {
+            var serviceInstance = {
                 globalCustomerId: $location.search().subscriberId,
                 serviceType: $location.search().serviceType,
                 serviceInstanceId: $location.search().serviceInstanceId
-        	};
+            };
 
-            _setPnf(serviceInstance).then(function(data){
+            _setPnf(serviceInstance).then(function (data) {
                 $scope.pnfs = data;
             });
-		}
+        }
 
 
-		$scope.returnVfModules = function (vnfInstance) {
-			
-			var svcModel = $scope.service.convertedModel;
-			//var vnfModelInvariantUuid = vnfInstance[FIELD.ID.MODEL_INVAR_ID];
-			var vnfModelVersionId = vnfInstance[FIELD.ID.MODEL_VERSION_ID]; // model uuid
-			var vnfModelCustomizationUuid = vnfInstance[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-	
-			var vnfModel = null;
-			
-			if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) {
-				if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) {
-					vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
-					if ( !($scope.isObjectEmpty(vnfModel.vfModules) ) )  {
-						//console.log ("vnfModel.vfModules: "); console.log (JSON.stringify(vnfModel.vfModules, null, 4));
-						return (vnfModel.vfModules);
-					}
-				}
-				else {
-					// old flow
-					if ( vnfModelVersionId != null ) {
-						vnfModel = svcModel.vnfs[vnfModelVersionId];
-						if ( !($scope.isObjectEmpty(vnfModel.vfModules) ) )  {
-							//console.log ("vnfModel.vfModules: "); console.log (JSON.stringify(vnfModel.vfModules, null, 4));
-							return (vnfModel.vfModules);
-						}
-					}
-				}
-				
-			}
-			return null;
-		}
-		$scope.hasVfModules = function (vnfInstance) {
-			if ($scope.returnVfModules(vnfInstance) != null ){
-				return true;
-			}
-			return false;
-		}
-		$scope.returnVolumeGroups = function (vnfInstance) {
-			
-			var svcModel = $scope.service.convertedModel;
+        function prepareCr() {
+            var serviceInstance = {
+                globalCustomerId: $location.search().subscriberId,
+                serviceType: $location.search().serviceType,
+                serviceInstanceId: $location.search().serviceInstanceId
+            };
 
-			//var vnfModelInvariantUuid = vnfInstance[FIELD.ID.MODEL_INVAR_ID];
-			var vnfModelVersionId = vnfInstance[FIELD.ID.MODEL_VERSION_ID];
-			var vnfModelCustomizationUuid = vnfInstance[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+            _setCr(serviceInstance).then(function (data) {
+                $scope.collectionResource = data;
+                $scope.collections.push($scope.collectionResource.collection);
+                $scope.networks.push($scope.collectionResource.networks[0]);
+            });
+        }
 
-			var vnfModel = null;
-			
-			if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) {
-				if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) {
-					vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
-					if ( !($scope.isObjectEmpty(vnfModel.volumeGroups) ) )  {
-						//console.log ("vnfModel.volumeGroups: "); console.log (JSON.stringify(vnfModel.volumeGroups, null, 4));
-						return (vnfModel.volumeGroups);
-					}
-				}
-				else {
-					// old flow
-					if ( vnfModelVersionId != null ) {
-						vnfModel = svcModel.vnfs[vnfModelVersionId];
-						if ( !($scope.isObjectEmpty(vnfModel.volumeGroups) ) )  {
-							//console.log ("vnfModel.vfModules: "); console.log (JSON.stringify(vnfModel.volumeGroups, null, 4));
-							return (vnfModel.volumeGroups);
-						}
-					}
-				}
-				
-			}
-			return null;
-		}
-		$scope.hasVolumeGroups = function (vnfInstance) {
-			if ($scope.returnVolumeGroups(vnfInstance) != null ){
-				return true;
-			}
-			return false;
-		}
-		$scope.deleteNetwork = function(serviceObject, network) {
-
-			console.log("Removing Network " + network.name);
-
-			//Send delete network request to MSO
-
-			//var networks = this.service.instance.networks;
-
-			//networks.splice(networks.indexOf(network), 1);
-
-			//Retrieve updated data from A&AI
-            var serviceInstance = serviceObject.object;
-            var svcModel = $scope.service.convertedModel;
-			var netModel;
-			DataService.setInventoryItem(network.object);
-			// set model default and override later if found
-			DataService.setModelInfo(COMPONENT.NETWORK, {});
-			
-			if ( network.object != null ) {
-				
-				//var netModelInvariantUuid = network.object[FIELD.ID.MODEL_INVAR_ID];
-				var netModelVersionId = network.object[FIELD.ID.MODEL_VERSION_ID]; // model uuid
-				var netModelCustomizationUuid = network.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-			
-				if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.networks) ) ) ) {
-					if ( (svcModel.isNewFlow) && (UtilityService.hasContents(netModelCustomizationUuid) ) ) {
-						netModel = svcModel.networks[netModelCustomizationUuid];
-					}
-					else {
-						
-						if ( UtilityService.hasContents(netModelVersionId) ) {
-							netModel = svcModel.networks[netModelVersionId];
-						}
-				
-					}
-				}
-			}
-			if (!($scope.isObjectEmpty(netModel) ) ) {
-				DataService.setModelInfo(COMPONENT.NETWORK, {
-					"modelInvariantId": netModel.invariantUuid,
-					"modelVersion": netModel.version,
-					"modelNameVersionId": netModel.uuid,
-					"modelCustomizationName": netModel.modelCustomizationName,
-					"customizationUuid": netModel.customizationUuid,
-					"modelName": netModel.name,
-					"inputs": ""
-				});
-			}
-			
-			DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-	
-			DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]);
-			DataService.setServiceInstanceName($scope.service.instance.name);
-			DataService.setServiceName($scope.service.model.service.name);
-			DataService.setServiceUuid($scope.service.model.service.uuid);
-			DataService.setNetworkInstanceId(network.object[FIELD.ID.NETWORK_ID]);
-			
-			$scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
-			    componentId : COMPONENT.NETWORK,
-			    callbackFunction : deleteOrResumeCallback,
-				dialogMethod: COMPONENT.DELETE
-			});
-		};
-
-		$scope.deleteService = function(serviceObject) {
-
-			var serviceInstance = serviceObject.object;
-			
-			console.log("Removing Service " + $scope.service.instance.name);
-
-			if ( $scope.isMacro() ) {
-				DataService.setALaCarte (false);
-				}
-				else {
-				DataService.setALaCarte (true);
-				}
-			DataService.setMacro($scope.isMacro());
-			DataService.setInventoryItem(serviceInstance);
-			setCurrentServiceModelInfoFromScope();
-
-			
-			DataService.setSubscriberName(serviceObject[FIELD.ID.SUBSCRIBER_NAME]);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-	
-			DataService.setGlobalCustomerId(serviceObject[COMPONENT.GLOBAL_CUSTOMER_ID]);
-			DataService.setServiceInstanceName($scope.service.instance.name);
-			
-			DataService.setServiceName($scope.service.model.service.name);
-			
-			DataService.setServiceUuid($scope.service.model.service.uuid);
-			
-			$scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
-			    componentId : COMPONENT.SERVICE,
-			    callbackFunction : deleteServiceInstanceCallbackFunction,
-                dialogMethod: COMPONENT.DELETE
-			});
-		
-		};
-
-		function populate_popup_vfModule(serviceObject, vfModule, vnf){
-            var serviceInstance = serviceObject.object;
-
-            DataService.setInventoryItem(vfModule.object);
+        $scope.returnVfModules = function (vnfInstance) {
 
             var svcModel = $scope.service.convertedModel;
-
-            //var vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID];
-            var vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID];
-            var vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];;
-            var vfModuleInstanceID = vfModule.object[FIELD.ID.VF_MODULE_ID];
-            if (vfModuleInstanceID == null) {
-                vfModuleInstanceID = "";
-            }
+            //var vnfModelInvariantUuid = vnfInstance[FIELD.ID.MODEL_INVAR_ID];
+            var vnfModelVersionId = vnfInstance[FIELD.ID.MODEL_VERSION_ID]; // model uuid
+            var vnfModelCustomizationUuid = vnfInstance[FIELD.ID.MODEL_CUSTOMIZATION_ID];
 
             var vnfModel = null;
-            var vfModuleModel = null;
 
-            DataService.setModelInfo(COMPONENT.VF_MODULE, {
-                "modelInvariantId": "",
-                "modelVersion": "",
-                "modelNameVersionId": "",
-                "modelCustomizationName": "",
-                "customizationUuid": "",
-                "modelName": "",
-                "inputs": ""
-            });
-
-            if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) {
-                if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) {
+            if ((!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.vnfs)))) {
+                if ((svcModel.isNewFlow) && (vnfModelCustomizationUuid != null)) {
                     vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
-
-                    var vfModuleCustomizationUuid = vfModule.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-                    if ( !($scope.isObjectEmpty(vnfModel.vfModules) ) && UtilityService.hasContents(vfModuleCustomizationUuid) ) {
-
-                        vfModuleModel = vnfModel.vfModules[vfModuleCustomizationUuid];
-
+                    if (vnfModel !== undefined) {
+                        if (!($scope.isObjectEmpty(vnfModel.vfModules))) {
+                            //console.log ("vnfModel.vfModules: "); console.log (JSON.stringify(vnfModel.vfModules, null, 4));
+                            return (vnfModel.vfModules);
+                        }
                     }
                 }
                 else {
                     // old flow
-                    if (vnfModelVersionId != null ) {
+                    if (vnfModelVersionId != null) {
                         vnfModel = svcModel.vnfs[vnfModelVersionId];
-                    }
-                    //var vfModuleInvariantUuid = vfModule.object[FIELD.ID.MODEL_INVAR_ID];
-                    var vfModuleModelVersionId = vfModule.object[FIELD.ID.MODEL_VERSION_ID];
-                    if ( (!($scope.isObjectEmpty(vnfModel))) && (!($scope.isObjectEmpty(vnfModel.vfModules))) &&
-                        UtilityService.hasContents(vfModuleModelVersionId) ) {
-                        vfModuleModel = vnfModel.vfModules[vfModuleModelVersionId];
+                        if (vnfModel !== undefined) {
+                            if (!($scope.isObjectEmpty(vnfModel.vfModules))) {
+                                //console.log ("vnfModel.vfModules: "); console.log (JSON.stringify(vnfModel.vfModules, null, 4));
+                                return (vnfModel.vfModules);
+                            }
+                        }
                     }
                 }
-                if ( !($scope.isObjectEmpty(vfModuleModel)) ) {
-                    DataService.setModelInfo(COMPONENT.VF_MODULE, {
-                        "modelInvariantId": vfModuleModel.invariantUuid,
-                        "modelVersion": vfModuleModel.version,
-                        "modelNameVersionId": vfModuleModel.uuid,
-                        "modelCustomizationName": vfModuleModel.modelCustomizationName,
-                        "customizationUuid": vfModuleModel.customizationUuid,
-                        "modelName": vfModuleModel.name,
-                        "inputs": ""
-                    });
+
+            }
+            return null;
+        }
+        $scope.hasVfModules = function (vnfInstance) {
+            if ($scope.returnVfModules(vnfInstance) != null) {
+                return true;
+            }
+            return false;
+        }
+        $scope.returnVolumeGroups = function (vnfInstance) {
+
+            var svcModel = $scope.service.convertedModel;
+
+            //var vnfModelInvariantUuid = vnfInstance[FIELD.ID.MODEL_INVAR_ID];
+            var vnfModelVersionId = vnfInstance[FIELD.ID.MODEL_VERSION_ID];
+            var vnfModelCustomizationUuid = vnfInstance[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+
+            var vnfModel = null;
+
+            if ((!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.vnfs)))) {
+                if ((svcModel.isNewFlow) && (vnfModelCustomizationUuid != null)) {
+                    vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
+                    if (vnfModel !== undefined) {
+
+                        if (!($scope.isObjectEmpty(vnfModel.volumeGroups))) {
+                            //console.log ("vnfModel.volumeGroups: "); console.log (JSON.stringify(vnfModel.volumeGroups, null, 4));
+                            return (vnfModel.volumeGroups);
+                        }
+                    }
                 }
+                else {
+                    // old flow
+                    if (vnfModelVersionId != null) {
+                        vnfModel = svcModel.vnfs[vnfModelVersionId];
+                        if (!($scope.isObjectEmpty(vnfModel.volumeGroups))) {
+                            //console.log ("vnfModel.vfModules: "); console.log (JSON.stringify(vnfModel.volumeGroups, null, 4));
+                            return (vnfModel.volumeGroups);
+                        }
+                    }
+                }
+
+            }
+            return null;
+        }
+        $scope.hasVolumeGroups = function (vnfInstance) {
+            if ($scope.returnVolumeGroups(vnfInstance) != null) {
+                return true;
+            }
+            return false;
+        }
+        $scope.deleteNetwork = function (serviceObject, network) {
+
+            console.log("Removing Network " + network.name);
+
+            //Send delete network request to MSO
+
+            //var networks = this.service.instance.networks;
+
+            //networks.splice(networks.indexOf(network), 1);
+
+            //Retrieve updated data from A&AI
+            var serviceInstance = serviceObject.object;
+
+            setCurrentNetworkModelInfoFromScope(network);
+
+            DataService.setInventoryItem(network.object);
+
+            DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
+
+            DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]);
+            DataService.setServiceInstanceName($scope.service.instance.name);
+            DataService.setServiceName($scope.service.model.service.name);
+            DataService.setServiceUuid($scope.service.model.service.uuid);
+            DataService.setNetworkInstanceId(network.object[FIELD.ID.NETWORK_ID]);
+
+            $scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
+                componentId: COMPONENT.NETWORK,
+                callbackFunction: deleteOrResumeCallback,
+                dialogMethod: COMPONENT.DELETE
+            });
+        };
+
+        $scope.deleteService = function (serviceObject, serviceOrchestrationStatus) {
+
+            var serviceInstance = serviceObject.object;
+
+            console.log("Removing Service " + $scope.service.instance.name);
+
+            if ($scope.isMacro()) {
+                DataService.setALaCarte(false);
+            }
+            else {
+                DataService.setALaCarte(true);
+            }
+            DataService.setMacro($scope.isMacro());
+            DataService.setInventoryItem(serviceInstance);
+            setCurrentServiceModelInfoFromScope();
+
+
+            DataService.setSubscriberName(serviceObject[FIELD.ID.SUBSCRIBER_NAME]);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
+
+            DataService.setGlobalCustomerId(serviceObject[COMPONENT.GLOBAL_CUSTOMER_ID]);
+            DataService.setServiceInstanceName($scope.service.instance.name);
+
+            DataService.setServiceName($scope.service.model.service.name);
+
+            DataService.setServiceUuid($scope.service.model.service.uuid);
+
+            $scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
+                componentId: COMPONENT.SERVICE,
+                callbackFunction: deleteServiceInstanceCallbackFunction,
+                dialogMethod: COMPONENT.DELETE,
+                serviceStatus: serviceOrchestrationStatus
+            });
+
+        };
+
+        function populate_popup_vfModule(serviceObject, vfModule, vnf) {
+            var serviceInstance = serviceObject.object;
+
+            DataService.setInventoryItem(vfModule.object);
+
+            setCurrentVfModuleModelInfoFromScope(vnf, vfModule);
+            var vfModuleInstanceID = vfModule.object[FIELD.ID.VF_MODULE_ID];
+            if (vfModuleInstanceID == null) {
+                vfModuleInstanceID = "";
             }
 
             DataService.setVnfInstanceId(vnf.object[FIELD.ID.VNF_ID]);
@@ -354,25 +303,25 @@
             DataService.setServiceName($scope.service.model.service.name);
 
             DataService.setServiceUuid($scope.service.model.service.uuid);
-		}
+        }
 
-		$scope.deleteVfModule = function(serviceObject, vfModule, vnf) {
+        $scope.deleteVfModule = function (serviceObject, vfModule, vnf) {
 
-			console.log("Removing VF-Module " + vfModule.name);
+            console.log("Removing VF-Module " + vfModule.name);
 
             populate_popup_vfModule(serviceObject, vfModule, vnf);
-			
-			$scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
-			    componentId : COMPONENT.VF_MODULE,
-			    callbackFunction : deleteOrResumeCallback,
+
+            $scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
+                componentId: COMPONENT.VF_MODULE,
+                callbackFunction: deleteOrResumeCallback,
                 dialogMethod: COMPONENT.DELETE
-			});
-			
-			return;
+            });
 
-		};
+            return;
 
-		function setCurrentServiceModelInfoFromScope(){
+        };
+
+        function setCurrentServiceModelInfoFromScope() {
             DataService.setModelInfo(COMPONENT.SERVICE, {
                 "modelInvariantId": $scope.service.model.service.invariantUuid,
                 "modelVersion": $scope.service.model.service.version,
@@ -380,21 +329,21 @@
                 "modelName": $scope.service.model.service.name,
                 "inputs": ""
             });
-		};
+        };
 
-		function setCurrentVNFModelInfo(vnf){
+        function setCurrentVNFModelInfo(vnf) {
             var svcModel = $scope.service.convertedModel;
             var vnfModel;
             var vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
             var vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID];
-            if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) {
-                if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) {
-                     vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
+            if ((!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.vnfs)))) {
+                if ((svcModel.isNewFlow) && (vnfModelCustomizationUuid != null)) {
+                    vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
                 }
                 else {
-                     vnfModel = svcModel.vnfs[vnfModelVersionId];
+                    vnfModel = svcModel.vnfs[vnfModelVersionId];
                 }
-                if ( !($scope.isObjectEmpty(vnfModel) ) ) {
+                if (!($scope.isObjectEmpty(vnfModel))) {
 
                     DataService.setModelInfo(COMPONENT.VNF, {
                         "modelInvariantId": vnfModel.invariantUuid,
@@ -409,669 +358,831 @@
             }
 
 
+        }
 
-		}
+        function setCurrentNetworkModelInfoFromScope(network) {
+            var svcModel = $scope.service.convertedModel;
+            var netModel;
+            // set model default and override later if found
+            DataService.setModelInfo(COMPONENT.NETWORK, {});
 
-		$scope.deleteVnf = function(serviceObject, vnf) {
-			console.log("Removing VNF " + vnf.name);
-			
-			var serviceInstance = serviceObject.object;
-			var svcModel = $scope.service.convertedModel;
-			DataService.setInventoryItem(vnf.object);
-			
-			/*var vnftype = vnf.object['vnf-type'];
-			if (vnftype == null)
-				vnftype = "";
-			else
-			{
-				var n = vnftype.search("/");
-				if (n >= 0)
-					vnftype = vnftype.substring(n+1);
-			}*/
-		
-			var svcModel = $scope.service.convertedModel;
-			var vnfModelInvariantUuid = null;
-			var vnfModelVersion = null;
-			var vnfModelCustomizationUuid = null;
-			var vnfModel = null;
-			var vnfModelVersionId = null;
-			
-			vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID];
-			vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID];
-			vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-			
-			DataService.setModelInfo(COMPONENT.VNF, {
-				"modelInvariantId": vnfModelInvariantUuid,
-				"modelVersion": "",
-				"modelNameVersionId": vnfModelVersionId,
-				"modelCustomizationName": "",
-				"customizationUuid": vnfModelCustomizationUuid,
-				"modelName": "",
-				"inputs": ""
-			});
-			
-			if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) {
-				if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) {
-					vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
-				}
-				else {
-					vnfModel = svcModel.vnfs[vnfModelVersionId];
-				}
-				//console.log ( "vnf models: "); console.log ( JSON.stringify ($scope.service.convertedModel.vnfs, null, 4) );
-				if ( !($scope.isObjectEmpty(vnfModel) ) ) {
-						
-					DataService.setModelInfo(COMPONENT.VNF, {
-						"modelInvariantId": vnfModel.invariantUuid,
-						"modelVersion": vnfModel.version,
-						"modelNameVersionId": vnfModel.uuid,
-						"modelCustomizationName": vnfModel.modelCustomizationName,
-						"customizationUuid": vnfModel.customizationUuid,
-						"modelName": vnfModel.name,
-						"inputs": ""
-					});
-				}
-		    } 
-				
-			DataService.setVnfInstanceId(vnf.object[FIELD.ID.VNF_ID]);
-	
-			DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-	
-			DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]);
-			DataService.setServiceInstanceName($scope.service.instance.name);
-			
-			DataService.setServiceName($scope.service.model.service.name);
-			
-			DataService.setServiceUuid($scope.service.model.service.uuid);
-			
-			$scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
-			    componentId : COMPONENT.VNF,
-			    callbackFunction : deleteOrResumeCallback,
-                dialogMethod: COMPONENT.DELETE
-			});
-		
-		};
-		
-		
+            if (network.object != null) {
 
-		$scope.deleteVolumeGroup = function(serviceObject, vnf, vfModule, volumeGroup) {
+                //var netModelInvariantUuid = network.object[FIELD.ID.MODEL_INVAR_ID];
+                var netModelVersionId = network.object[FIELD.ID.MODEL_VERSION_ID]; // model uuid
+                var netModelCustomizationUuid = network.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
 
-			console.log("Removing Volume Group " + volumeGroup.name);
-			var haveModel = false;
-			var svcModel = $scope.service.convertedModel;
-			
-			var vnfModelInvariantUuid = null;
-			var vnfModelVersion = null;
-			var vnfModelCustomizationUuid = null;
-			var vnfModel = null;
-			var vnfModelVersionId = null;
-			
-			vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID];
-			vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID];
-			vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-		
-			DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {
-				"modelInvariantId": "",
-				"modelVersion": "",
-				"modelNameVersionId": "",
-				"modelCustomizationName": "",
-				"customizationUuid": "",
-				"modelName": "",
-				"inputs": ""
-			});
-	
-			if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) {
-				if ( (svcModel.isNewFlow) && (vnfModelCustomizationUuid != null ) ) {
-					vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
-				}
-				else {
-					vnfModel = svcModel.vnfs[vnfModelVersionId];
-				}
-			}
-			
-						
-			// volume groups don't have model-invariant-id/version in a&ai.
-			// Their model-invariant-id/version is the one for the associated vfModule
-			
-			var vfModuleInvariantUuid = vfModule.object[FIELD.ID.MODEL_INVAR_ID];
-			var vfModuleModelVersionId = vfModule.object[FIELD.ID.MODEL_VERSION_ID];
-			var vfModuleCustomizationUuid = vfModule.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-			var volGroupModel = null;
-				
-			if ( !($scope.isObjectEmpty(vnfModel.volumeGroups) ) ) {
-				if ( ( !($scope.isObjectEmpty(vnfModel) ) ) && ( !($scope.isObjectEmpty(vnfModel.volumeGroups) ) ) ) {
-					if ( (svcModel.isNewFlow) && (UtilityService.hasContents(vfModuleCustomizationUuid) ) ){
-						volGroupModel = vnfModel.volumeGroups[vfModuleCustomizationUuid];
-					}
-					else {
-						volGroupModel = vnfModel.volumeGroups[vfModuleModelVersionId];
-					}
-					if ( !($scope.isObjectEmpty(volGroupModel) ) ) {
-						DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {
-							"modelInvariantId": volGroupModel.invariantUuid,
-							"modelVersion": volGroupModel.version,
-							"modelNameVersionId": volGroupModel.uuid,
-							"modelCustomizationName": volGroupModel.modelCustomizationName,
-							"customizationUuid": volGroupModel.customizationUuid,
-							"modelName": volGroupModel.name,
-							"inputs": ""
-						});
-		
-					}
-				}
-			}
+                if (UtilityService.hasContents(netModelCustomizationUuid)) {
+                    // set it to what came from a&ai
+                    DataService.setResCustomizationUuid(netModelCustomizationUuid);
+                }
 
-			var serviceInstance = serviceObject.object;
-			
-            DataService.setInventoryItem(volumeGroup.object);
-		
-			DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-			
-			DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]);
-			DataService.setServiceInstanceName($scope.service.instance.name);
-			
-			DataService.setServiceName($scope.service.model.service.name);
-			
-			DataService.setServiceUuid($scope.service.model.service.uuid);
-			DataService.setVnfInstanceId(vnf.nodeId);
-			DataService.setVolumeGroupInstanceId(volumeGroup.nodeId);
-			
-			$scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
-			    componentId : COMPONENT.VOLUME_GROUP,
-                dialogMethod: COMPONENT.DELETE
-			});
-		};
-		
-		$scope.deleteVnfVolumeGroup = function(serviceObject, vnf, volumeGroup) {
+                if ((!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.networks)))) {
+                    if ((svcModel.isNewFlow) && (UtilityService.hasContents(netModelCustomizationUuid))) {
+                        netModel = svcModel.networks[netModelCustomizationUuid];
+                    }
+                    else {
 
-			console.log("Removing Volume Group " + volumeGroup.name);
+                        if (UtilityService.hasContents(netModelVersionId)) {
+                            netModel = svcModel.networks[netModelVersionId];
+                        }
+
+                    }
+                }
+            }
+            if (!($scope.isObjectEmpty(netModel))) {
+                DataService.setModelInfo(COMPONENT.NETWORK, {
+                    "modelInvariantId": netModel.invariantUuid,
+                    "modelVersion": netModel.version,
+                    "modelNameVersionId": netModel.uuid,
+                    "modelCustomizationName": netModel.modelCustomizationName,
+                    "customizationUuid": netModel.customizationUuid,
+                    "modelName": netModel.name,
+                    "inputs": ""
+                });
+            }
+        }
+
+        function setCurrentVfModuleModelInfoFromScope(vnf, vfModule) {
+
+            var svcModel = $scope.service.convertedModel;
+
+            //var vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID];
+            var vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID];
+            var vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+            var vnfModel = null;
+            var vfModuleModel = null;
+
+            DataService.setModelInfo(COMPONENT.VF_MODULE, {
+                "modelInvariantId": "",
+                "modelVersion": "",
+                "modelNameVersionId": "",
+                "modelCustomizationName": "",
+                "customizationUuid": "",
+                "modelName": "",
+                "inputs": ""
+            });
+
+            if ((!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.vnfs)))) {
+                if ((svcModel.isNewFlow) && (vnfModelCustomizationUuid != null)) {
+                    vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
+
+                    var vfModuleCustomizationUuid = vfModule.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+                    if (!($scope.isObjectEmpty(vnfModel)) && !($scope.isObjectEmpty(vnfModel.vfModules)) && UtilityService.hasContents(vfModuleCustomizationUuid)) {
+
+                        vfModuleModel = vnfModel.vfModules[vfModuleCustomizationUuid];
+
+                    }
+                }
+                else {
+                    // old flow
+                    if (vnfModelVersionId != null) {
+                        vnfModel = svcModel.vnfs[vnfModelVersionId];
+                    }
+                    //var vfModuleInvariantUuid = vfModule.object[FIELD.ID.MODEL_INVAR_ID];
+                    var vfModuleModelVersionId = vfModule.object[FIELD.ID.MODEL_VERSION_ID];
+                    if ((!($scope.isObjectEmpty(vnfModel))) && (!($scope.isObjectEmpty(vnfModel.vfModules))) &&
+                        UtilityService.hasContents(vfModuleModelVersionId)) {
+                        vfModuleModel = vnfModel.vfModules[vfModuleModelVersionId];
+                    }
+                }
+                if (!($scope.isObjectEmpty(vfModuleModel))) {
+                    DataService.setModelInfo(COMPONENT.VF_MODULE, {
+                        "modelInvariantId": vfModuleModel.invariantUuid,
+                        "modelVersion": vfModuleModel.version,
+                        "modelNameVersionId": vfModuleModel.uuid,
+                        "modelCustomizationName": vfModuleModel.modelCustomizationName,
+                        "customizationUuid": vfModuleModel.customizationUuid,
+                        "modelName": vfModuleModel.name,
+                        "inputs": ""
+                    });
+                }
+            }
+        }
+
+        function setCurrentVolumeGroupModelInfoFromScope(vnf, vfModule) {
+            var svcModel = $scope.service.convertedModel;
+
+            var vnfModelCustomizationUuid = null;
+            var vnfModel = null;
+            var vnfModelVersionId = null;
+
+            vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID];
+            vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+
+            DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {
+                "modelInvariantId": "",
+                "modelVersion": "",
+                "modelNameVersionId": "",
+                "modelCustomizationName": "",
+                "customizationUuid": "",
+                "modelName": "",
+                "inputs": ""
+            });
+
+            if ((!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.vnfs)))) {
+                if ((svcModel.isNewFlow) && (vnfModelCustomizationUuid != null)) {
+                    vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
+                }
+                else {
+                    vnfModel = svcModel.vnfs[vnfModelVersionId];
+                }
+            }
+
+
+            // volume groups don't have model-invariant-id/version in a&ai.
+            // Their model-invariant-id/version is the one for the associated vfModule
+
+            var vfModuleModelVersionId = vfModule.object[FIELD.ID.MODEL_VERSION_ID];
+            var vfModuleCustomizationUuid = vfModule.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+            var volGroupModel = null;
+
+            if (!($scope.isObjectEmpty(vnfModel)) && !($scope.isObjectEmpty(vnfModel.volumeGroups))) {
+                if ((svcModel.isNewFlow) && (UtilityService.hasContents(vfModuleCustomizationUuid))) {
+                    volGroupModel = vnfModel.volumeGroups[vfModuleCustomizationUuid];
+                }
+                else {
+                    volGroupModel = vnfModel.volumeGroups[vfModuleModelVersionId];
+                }
+                if (!($scope.isObjectEmpty(volGroupModel))) {
+                    DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {
+                        "modelInvariantId": volGroupModel.invariantUuid,
+                        "modelVersion": volGroupModel.version,
+                        "modelNameVersionId": volGroupModel.uuid,
+                        "modelCustomizationName": volGroupModel.modelCustomizationName,
+                        "customizationUuid": volGroupModel.customizationUuid,
+                        "modelName": volGroupModel.name,
+                        "inputs": ""
+                    });
+
+                }
+            }
+        }
+
+        function setCurrentVolumeGroupModelInfoByVfModuleFromScope(vnf, volumeGroup) {
+            var svcModel = $scope.service.convertedModel;
+
+            var vnfModelCustomizationUuid = null;
+            var vnfModel = null;
+            var vnfModelVersionId = null;
+
+            vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID];
+            vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+
+            DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {
+                "modelInvariantId": "",
+                "modelVersion": "",
+                "modelNameVersionId": "",
+                "modelCustomizationName": "",
+                "customizationUuid": "",
+                "modelName": "",
+                "inputs": ""
+            });
+
+            if ((!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.vnfs)))) {
+                if ((svcModel.isNewFlow) && (vnfModelCustomizationUuid != null)) {
+                    vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
+                }
+                else {
+                    vnfModel = svcModel.vnfs[vnfModelVersionId];
+                }
+            }
+
+
+            // volume groups don't have model-invariant-id/version in a&ai.
+            // Their model-invariant-id/version is the one for the associated vfModule
+
+            var vfModuleModelVersionId = volumeGroup.object[FIELD.ID.VF_MODULE_MODEL_VERSION_ID];
+            var vfModuleCustomizationUuid = volumeGroup.object[FIELD.ID.VF_MODULE_MODEL_CUSTOMIZATION_ID];
+            var volGroupModel = null;
+            if ((!($scope.isObjectEmpty(vnfModel))) && (!($scope.isObjectEmpty(vnfModel.volumeGroups)))) {
+                if ((svcModel.isNewFlow) && (UtilityService.hasContents(vfModuleCustomizationUuid))) {
+                    volGroupModel = vnfModel.volumeGroups[vfModuleCustomizationUuid];
+                }
+                else {
+                    volGroupModel = vnfModel.volumeGroups[vfModuleModelVersionId];
+                }
+                if (!($scope.isObjectEmpty(volGroupModel))) {
+                    DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {
+                        "modelInvariantId": volGroupModel.invariantUuid,
+                        "modelVersion": volGroupModel.version,
+                        "modelNameVersionId": volGroupModel.uuid,
+                        "modelCustomizationName": volGroupModel.modelCustomizationName,
+                        "customizationUuid": volGroupModel.customizationUuid,
+                        "modelName": volGroupModel.name,
+                        "inputs": ""
+                    });
+
+                }
+            }
+        }
+
+        $scope.deleteVnf = function (serviceObject, vnf) {
+            console.log("Removing VNF " + vnf.name);
+
             var serviceInstance = serviceObject.object;
-			
-            DataService.setInventoryItem(volumeGroup.object);
-        
-			var svcModel = $scope.service.convertedModel;
-			
-			var vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID];
-			var vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID];
-			var vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-			
-			var volGroupModelInvariantUuid = volumeGroup.object[FIELD.ID.MODEL_INVAR_ID];
-			var volGroupModelVersionId = volumeGroup.object[FIELD.ID.MODEL_VERSION_ID];
-			var volGroupModelCustomizationUuid = volumeGroup.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-			
-			var vnfModel = null;
-			var volGroupModel = null;
-			
-			// send an empty model by default since model is not required for deletes
-			DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {});
+            var svcModel = $scope.service.convertedModel;
+            DataService.setInventoryItem(vnf.object);
 
-			if ( svcModel.isNewFlow ) {
-				vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
-				if ( UtilityService.hasContents (volGroupModelCustomizationUuid) ) {
-					volGroupModel = vnfModel.volumeGroups[volGroupModelCustomizationUuid];
-				}
-			}
-			else {
-				
-				vnfModel = svcModel.vnfs[vnfModelVersionId];
-				if (  UtilityService.hasContents (volGroupModelVersionId) ) {
-					volGroupModel = vnfModel.volumeGroups[volGroupModelVersionId];
-				}
-			}
-			if ( !($scope.isObjectEmpty(volGroupModel) ) ) {
-				DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {		
-					"modelInvariantId": volGroupModel.invariantUuid,
-					"modelVersion": volGroupModel.version,
-					"modelNameVersionId": volGroupModel.uuid,
-					"modelName": volGroupModel.name,
-					"modelCustomizationName": volGroupModel.modelCustomizationName,
-					"customizationUuid": volGroupModel.customizationUuid,
-					"inputs": ""
-				});
-			}
-				
-			DataService.setVnfInstanceId(vnf.object[FIELD.ID.VNF_ID]);
-		
-			DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-	
-			DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]);
-			DataService.setServiceInstanceName($scope.service.instance.name);
-			
-			DataService.setServiceName($scope.service.model.service.name);
-			
-			DataService.setServiceUuid($scope.service.model.service.uuid);
-			DataService.setVnfInstanceId(vnf.nodeId);
-			DataService.setVolumeGroupInstanceId(volumeGroup.nodeId);
-		
-			$scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
-                componentId : COMPONENT.VOLUME_GROUP,
-                callbackFunction : deleteOrResumeCallback,
+            /*var vnftype = vnf.object['vnf-type'];
+            if (vnftype == null)
+                vnftype = "";
+            else
+            {
+                var n = vnftype.search("/");
+                if (n >= 0)
+                    vnftype = vnftype.substring(n+1);
+            }*/
+
+            var svcModel = $scope.service.convertedModel;
+            var vnfModelInvariantUuid = null;
+            var vnfModelVersion = null;
+            var vnfModelCustomizationUuid = null;
+            var vnfModel = null;
+            var vnfModelVersionId = null;
+
+            vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID];
+            vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID];
+            vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+
+            DataService.setModelInfo(COMPONENT.VNF, {
+                "modelInvariantId": vnfModelInvariantUuid,
+                "modelVersion": "",
+                "modelNameVersionId": vnfModelVersionId,
+                "modelCustomizationName": "",
+                "customizationUuid": vnfModelCustomizationUuid,
+                "modelName": "",
+                "inputs": ""
+            });
+
+            if ((!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.vnfs)))) {
+                if ((svcModel.isNewFlow) && (vnfModelCustomizationUuid != null)) {
+                    vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
+                }
+                else {
+                    vnfModel = svcModel.vnfs[vnfModelVersionId];
+                }
+                //console.log ( "vnf models: "); console.log ( JSON.stringify ($scope.service.convertedModel.vnfs, null, 4) );
+                if (!($scope.isObjectEmpty(vnfModel))) {
+
+                    DataService.setModelInfo(COMPONENT.VNF, {
+                        "modelInvariantId": vnfModel.invariantUuid,
+                        "modelVersion": vnfModel.version,
+                        "modelNameVersionId": vnfModel.uuid,
+                        "modelCustomizationName": vnfModel.modelCustomizationName,
+                        "customizationUuid": vnfModel.customizationUuid,
+                        "modelName": vnfModel.name,
+                        "inputs": ""
+                    });
+                }
+            }
+
+            DataService.setVnfInstanceId(vnf.object[FIELD.ID.VNF_ID]);
+
+            DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
+
+            DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]);
+            DataService.setServiceInstanceName($scope.service.instance.name);
+
+            DataService.setServiceName($scope.service.model.service.name);
+
+            DataService.setServiceUuid($scope.service.model.service.uuid);
+
+            $scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
+                componentId: COMPONENT.VNF,
+                callbackFunction: deleteOrResumeCallback,
                 dialogMethod: COMPONENT.DELETE
             });
-		};
 
-		$scope.describeNetwork = function(serviceObject, networkObject) {
-			var serviceInstance = serviceObject.object;
-			var network = networkObject.object;
-			//console.log ("networkObject="); console.log (JSON.stringify(networkObject, null, 4));
-			
-			DataService.setResCustomizationUuid(" ");
-			
-			var svcModel = $scope.service.convertedModel;
-			var netModel = null;
-			
-			if ( !($scope.isObjectEmpty(network) ) ) {
-				
-				var netModelInvariantUuid = network[FIELD.ID.MODEL_INVAR_ID];
-				var netModelVersionId = network[FIELD.ID.MODEL_VERSION_ID];
-				var netModelCustomizationUuid = network[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-				
-				if ( UtilityService.hasContents (netModelCustomizationUuid) ) {
-					// set it to what came from a&ai 
-					DataService.setResCustomizationUuid(netModelCustomizationUuid);
-				}
-				
-				if ( (!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.networks))) ) {
-					if ( svcModel.isNewFlow ) {
-						netModel = svcModel.networks[netModelCustomizationUuid];
-					}
-					else {
-						netModel = svcModel.networks[netModelVersionId];
-					}
-					/*
-					 * The details pop-up should use a&ai info
-					 * if ( !($scope.isObjectEmpty(netModel) ) ) {
-						if (UtilityService.hasContents(netModel.customizationUuid)) {
-							DataService.setResCustomizationUuid(netModel.customizationUuid);
-						}
-					}*/
-				}
-			}
-			
-			DataService.setNetworkInstanceId(network[FIELD.ID.NETWORK_ID]);
-			DataService.setInventoryItem(networkObject);
-			DataService.setSubscriberName(serviceObject.subscriberName);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-			
-			$scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {
-			    componentId : COMPONENT.NETWORK
-			});
-		};
+        };
 
-		// for service instance id - no need for this!
-		$scope.describeService = function(serviceObject) {
-			var serviceInstance = serviceObject.object;
-		
-			DataService.setInventoryItem(serviceInstance);
-			//DataService.setModelInfo(serviceInstance['service-instance-id'], serviceInstance);
-			
-			DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-			
-			//Display popup with additional service information
-			$scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {
-			    componentId : COMPONENT.SERVICE
-			});
-			
-		};
+        $scope.deleteVolumeGroup = function (serviceObject, vnf, vfModule, volumeGroup) {
 
-		$scope.describeVfModule = function(serviceObject, vfModuleObject, vnf) {
-			var serviceInstance = serviceObject.object;
-			var vfModule = vfModuleObject.object;
-			
-			/*var vfModuleInvariantUuid = vfModule[FIELD.ID.MODEL_INVAR_ID];
-			var vfModuleModelVersionId = vfModule[FIELD.ID.MODEL_VERSION_ID];*/
-			var vfModuleCustomizationUuid = vfModule[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+            console.log("Removing Volume Group " + volumeGroup.name);
+            var haveModel = false;
 
-			DataService.setCustomizationUuid(" ");
-			if ( UtilityService.hasContents (vfModuleCustomizationUuid) ) {
-				DataService.setCustomizationUuid(vfModuleCustomizationUuid);
-			}
-		
-			//Display popup with additional VF-Module information
-			DataService.setVfModuleInstanceId(vfModule[FIELD.ID.VF_MODULE_ID]);
-			DataService.setInventoryItem(vfModule)
-			
-			DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-			
-			$scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {
-			    componentId : COMPONENT.VF_MODULE
-			});
-		};
+            var serviceInstance = serviceObject.object;
 
-		$scope.getStatusOfVnf = function(serviceObject, vnfObject) {
-			var serviceInstance = serviceObject.object;
-			var vnf = vnfObject.object;
-		  
-			DataService.setVnfInstanceId(vnf[FIELD.ID.VNF_ID]);
-			DataService.setInventoryItem(vnf);
-			
-			DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-			DataService.setServiceInstanceName(serviceInstance[FIELD.ID.SERVICE_INSTANCE_NAME]);
-			
-			$scope.$broadcast(COMPONENT.COMPONENT_STATUS, {
-			    componentId : COMPONENT.VNF,
-			    callbackFunction : updateProvStatusVnfCallbackFunction
-			});
-		};
+            setCurrentVolumeGroupModelInfoFromScope(vnf, vfModule);
 
-		$scope.describeVnf = function(serviceObject, vnfObject) {
-			var serviceInstance = serviceObject.object;
-			var vnf = vnfObject.object;
-			DataService.setResCustomizationUuid(" ");
-			
-			//var vnfInvariantUuid = vnf[FIELD.ID.MODEL_INVAR_ID];
-			//var vnfVersionId = vnf[FIELD.ID.MODEL_VERSION_ID];
-			var vnfCustomizationUuid = vnf[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-	
-			if ( UtilityService.hasContents (vnfCustomizationUuid) ) {
-				DataService.setResCustomizationUuid(vnfCustomizationUuid);
-		    }
-			//Display popup with additional VNF information
-			DataService.setVnfInstanceId(vnf[FIELD.ID.VNF_ID]);
-			DataService.setInventoryItem(vnf);
-			
-			DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-			
-			$scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {
-			    componentId : COMPONENT.VNF
-			});
-		};
+            DataService.setInventoryItem(volumeGroup.object);
 
-		$scope.describeVolumeGroup = function(serviceObject, vnf, volumeGroupObject) {
-			
-			var serviceInstance = serviceObject.object;
-			var volumeGroup = volumeGroupObject.object;
-			
-			//var volGroupInvariantUuid = volumeGroup[FIELD.ID.MODEL_INVAR_ID];
-			//var volGroupVersionId = volumeGroup[FIELD.ID.MODEL_VERSION_ID];
-			var volGroupCustomizationUuid = volumeGroup[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+            DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
 
-			DataService.setCustomizationUuid(" ");	
-			if ( UtilityService.hasContents(volGroupCustomizationUuid) ) {
-				DataService.setCustomizationUuid(volGroupCustomizationUuid);	 
-		    }
-			DataService.setVolumeGroupInstanceId(volumeGroup[FIELD.ID.VOLUME_GROUP_ID]);
-			DataService.setInventoryItem(volumeGroup);
-		
-			DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
-			DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
-			DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
-			
-			
-			$scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {
-			    componentId : COMPONENT.VOLUME_GROUP
-			});
-		};
+            DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]);
+            DataService.setServiceInstanceName($scope.service.instance.name);
 
-		$scope.addNetworkInstance = function(netModel, existingVnfs) {
-			
-			// For networks we assume that we always follow the new flow
-			console.log("Adding network to service instance" + this.service.instance.name);
-			if ( VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED && (UtilityService.hasContents(existingVnfs)) && (existingVnfs.length > 0) ) {
-				var msg = VnfService.isVnfListStatusValid (existingVnfs);
-				if ( msg != "" ) {
-					alert ( msg );
-					return;
-				}
-			}
-			
-			DataService.setSubscriberName($scope.service.instance.subscriberName);
-			DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId);
-			DataService.setServiceType($scope.service.instance.serviceType);
-			DataService.setServiceInstanceName($scope.service.instance.name);
-			DataService.setServiceInstanceId($scope.service.instance.id);
-			DataService.setServiceName($scope.service.model.service.name);
-			
-			DataService.setModelInfo(COMPONENT.NETWORK, {
-				"modelType": "network",
-				"modelInvariantId": netModel.invariantUuid,
-				"modelVersion": netModel.version,
-				"modelNameVersionId": netModel.uuid,
-				"modelName": netModel.name,
-				"modelCustomizationName": netModel.modelCustomizationName,
-				"customizationUuid": netModel.customizationUuid,
-				"inputs": "",
-				"displayInputs": netModel.displayInputs
-			});
-			setCurrentServiceModelInfoFromScope();
+            DataService.setServiceName($scope.service.model.service.name);
 
-			
-			$scope.$broadcast(COMPONENT.CREATE_COMPONENT, {
-			    componentId : COMPONENT.NETWORK,
-			    callbackFunction : createVnfCallbackFunction
-			});		
-		};
+            DataService.setServiceUuid($scope.service.model.service.uuid);
+            DataService.setVnfInstanceId(vnf.nodeId);
+            DataService.setVolumeGroupInstanceId(volumeGroup.nodeId);
 
-		$scope.addVnfInstance = function(vnf, existingVnfs) {
-				
-			if ( VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED && (UtilityService.hasContents(existingVnfs)) && (existingVnfs.length > 0) ) {
-				var msg = VnfService.isVnfListStatusValid (existingVnfs);
-				if ( msg != "" ) {
-					alert ( msg );
-					return;
-				}
-			}
-			DataService.setSubscriberName($scope.service.instance.subscriberName);
-			DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId);
-			DataService.setServiceType($scope.service.instance.serviceType);
-			DataService.setServiceInstanceName($scope.service.instance.name);
-			DataService.setServiceInstanceId($scope.service.instance.id);
-			DataService.setServiceName($scope.service.model.service.name);
-			
-			console.log ( "existingVnfs: " );
-			console.log (JSON.stringify ( existingVnfs, null, 4));
-			console.log ( "existingVnfs: " ); console.log (JSON.stringify ( existingVnfs, null, 4));
-			var vnf_type = "";
-			var vnf_role = "";
-			var vnf_function = "";
-			var vnf_code = "";
-			
-			if (UtilityService.hasContents (vnf.nfType) ) {
-				vnf_type = vnf.nfType;
-			}
-			if (UtilityService.hasContents (vnf.nfRole) ) {
-				vnf_role = vnf.nfRole;
-			}
-			if (UtilityService.hasContents (vnf.nfFunction) ) {
-				vnf_function = vnf.nfFunction;
-			}
-			if (UtilityService.hasContents (vnf.nfCode) ) {
-				vnf_code = vnf.nfCode;
-			}
-			DataService.setModelInfo(COMPONENT.VNF, {
-				"modelType": vnf.isPnf ? "pnf" : "vnf",
-				"modelInvariantId": vnf.invariantUuid,
-				"modelVersion": vnf.version,
-				"modelNameVersionId": vnf.uuid,
-				"modelName": vnf.name,
-				"modelCustomizationName": vnf.modelCustomizationName,
-				"customizationUuid": vnf.customizationUuid,
-				"inputs": "",
-				"displayInputs": vnf.displayInputs,
-				"vnfType": vnf_type,
-				"vnfRole": vnf_role,
-				"vnfFunction": vnf_function,
-				"vnfCode": vnf_code,
-				"properties": vnf.properties
-			});
-			
-			DataService.setModelInstanceName($scope.service.model.service.name);
-			setCurrentServiceModelInfoFromScope();
+            $scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
+                componentId: COMPONENT.VOLUME_GROUP,
+                dialogMethod: COMPONENT.DELETE
+            });
+        };
 
-			if (vnf.isConfig) {
+        $scope.deleteVnfVolumeGroup = function (serviceObject, vnf, volumeGroup) {
+
+            console.log("Removing Volume Group " + volumeGroup.name);
+            var serviceInstance = serviceObject.object;
+
+            DataService.setInventoryItem(volumeGroup.object);
+
+            var svcModel = $scope.service.convertedModel;
+
+            var vnfModelInvariantUuid = vnf.object[FIELD.ID.MODEL_INVAR_ID];
+            var vnfModelVersionId = vnf.object[FIELD.ID.MODEL_VERSION_ID];
+            var vnfModelCustomizationUuid = vnf.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+
+            var volGroupModelInvariantUuid = volumeGroup.object[FIELD.ID.MODEL_INVAR_ID];
+            var volGroupModelVersionId = volumeGroup.object[FIELD.ID.MODEL_VERSION_ID];
+            var volGroupModelCustomizationUuid = volumeGroup.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+
+            var vnfModel = null;
+            var volGroupModel = null;
+
+            // send an empty model by default since model is not required for deletes
+            DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {});
+
+            if (svcModel.isNewFlow) {
+                vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
+                if (UtilityService.hasContents(volGroupModelCustomizationUuid)) {
+                    volGroupModel = vnfModel.volumeGroups[volGroupModelCustomizationUuid];
+                }
+            }
+            else {
+
+                vnfModel = svcModel.vnfs[vnfModelVersionId];
+                if (UtilityService.hasContents(volGroupModelVersionId)) {
+                    volGroupModel = vnfModel.volumeGroups[volGroupModelVersionId];
+                }
+            }
+            if (!($scope.isObjectEmpty(volGroupModel))) {
+                DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {
+                    "modelInvariantId": volGroupModel.invariantUuid,
+                    "modelVersion": volGroupModel.version,
+                    "modelNameVersionId": volGroupModel.uuid,
+                    "modelName": volGroupModel.name,
+                    "modelCustomizationName": volGroupModel.modelCustomizationName,
+                    "customizationUuid": volGroupModel.customizationUuid,
+                    "inputs": ""
+                });
+            }
+
+            DataService.setVnfInstanceId(vnf.object[FIELD.ID.VNF_ID]);
+
+            DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
+
+            DataService.setGlobalCustomerId(serviceObject[FIELD.ID.GLOBAL_CUST_ID]);
+            DataService.setServiceInstanceName($scope.service.instance.name);
+
+            DataService.setServiceName($scope.service.model.service.name);
+
+            DataService.setServiceUuid($scope.service.model.service.uuid);
+            DataService.setVnfInstanceId(vnf.nodeId);
+            DataService.setVolumeGroupInstanceId(volumeGroup.nodeId);
+
+            $scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
+                componentId: COMPONENT.VOLUME_GROUP,
+                callbackFunction: deleteOrResumeCallback,
+                dialogMethod: COMPONENT.DELETE
+            });
+        };
+
+        $scope.describeNetwork = function (serviceObject, networkObject) {
+            var serviceInstance = serviceObject.object;
+            var network = networkObject.object;
+            //console.log ("networkObject="); console.log (JSON.stringify(networkObject, null, 4));
+
+            DataService.setResCustomizationUuid(" ");
+
+            setCurrentServiceModelInfoFromScope();
+            setCurrentNetworkModelInfoFromScope(networkObject);
+
+            DataService.setNetworkInstanceId(network[FIELD.ID.NETWORK_ID]);
+            DataService.setInventoryItem(networkObject);
+            DataService.setSubscriberName(serviceObject.subscriberName);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
+
+            $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {
+                componentId: COMPONENT.NETWORK
+            });
+        };
+
+        // for service instance id - no need for this!
+        $scope.describeService = function (serviceObject) {
+            var serviceInstance = serviceObject.object;
+            setCurrentServiceModelInfoFromScope();
+
+            DataService.setInventoryItem(serviceInstance);
+            //DataService.setModelInfo(serviceInstance['service-instance-id'], serviceInstance);
+
+            DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
+
+            //Display popup with additional service information
+            $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {
+                componentId: COMPONENT.SERVICE
+            });
+
+        };
+
+        $scope.describeVfModule = function (serviceObject, vfModuleObject, vnf) {
+            var serviceInstance = serviceObject.object;
+            var vfModule = vfModuleObject.object;
+
+            /*var vfModuleInvariantUuid = vfModule[FIELD.ID.MODEL_INVAR_ID];
+            var vfModuleModelVersionId = vfModule[FIELD.ID.MODEL_VERSION_ID];*/
+            var vfModuleCustomizationUuid = vfModule[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+
+            setCurrentServiceModelInfoFromScope();
+            setCurrentVfModuleModelInfoFromScope(vnf, vfModuleObject);
+
+            DataService.setCustomizationUuid(" ");
+            if (UtilityService.hasContents(vfModuleCustomizationUuid)) {
+                DataService.setCustomizationUuid(vfModuleCustomizationUuid);
+            }
+
+            //Display popup with additional VF-Module information
+            DataService.setVfModuleInstanceId(vfModule[FIELD.ID.VF_MODULE_ID]);
+            DataService.setInventoryItem(vfModule)
+
+            DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
+
+            $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {
+                componentId: COMPONENT.VF_MODULE
+            });
+        };
+
+        $scope.getStatusOfVnf = function (serviceObject, vnfObject) {
+            var serviceInstance = serviceObject.object;
+            var vnf = vnfObject.object;
+
+            DataService.setVnfInstanceId(vnf[FIELD.ID.VNF_ID]);
+            DataService.setInventoryItem(vnf);
+
+            DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
+            DataService.setServiceInstanceName(serviceInstance[FIELD.ID.SERVICE_INSTANCE_NAME]);
+
+            $scope.$broadcast(COMPONENT.COMPONENT_STATUS, {
+                componentId: COMPONENT.VNF,
+                callbackFunction: updateProvStatusVnfCallbackFunction
+            });
+        };
+
+        $scope.describeVnf = function (serviceObject, vnfObject) {
+            var serviceInstance = serviceObject.object;
+            var vnf = vnfObject.object;
+            DataService.setResCustomizationUuid(" ");
+
+            //var vnfInvariantUuid = vnf[FIELD.ID.MODEL_INVAR_ID];
+            //var vnfVersionId = vnf[FIELD.ID.MODEL_VERSION_ID];
+            var vnfCustomizationUuid = vnf[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+
+            if (UtilityService.hasContents(vnfCustomizationUuid)) {
+                DataService.setResCustomizationUuid(vnfCustomizationUuid);
+            }
+
+            setCurrentServiceModelInfoFromScope();
+            setCurrentVNFModelInfo(vnfObject);
+
+            //Display popup with additional VNF information
+            DataService.setVnfInstanceId(vnf[FIELD.ID.VNF_ID]);
+            DataService.setInventoryItem(vnf);
+
+            DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
+
+            $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {
+                componentId: COMPONENT.VNF
+            });
+        };
+
+        $scope.describeVolumeGroup = function (serviceObject, vnf, volumeGroupObject) {
+
+            var serviceInstance = serviceObject.object;
+            var volumeGroup = volumeGroupObject.object;
+
+            var volGroupCustomizationUuid = volumeGroup[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+
+            setCurrentServiceModelInfoFromScope();
+            setCurrentVolumeGroupModelInfoByVfModuleFromScope(vnf, volumeGroupObject);
+
+            DataService.setCustomizationUuid(" ");
+            if (UtilityService.hasContents(volGroupCustomizationUuid)) {
+                DataService.setCustomizationUuid(volGroupCustomizationUuid);
+            }
+            DataService.setVolumeGroupInstanceId(volumeGroup[FIELD.ID.VOLUME_GROUP_ID]);
+            DataService.setInventoryItem(volumeGroup);
+
+            DataService.setSubscriberName(serviceObject[COMPONENT.SUBSCRIBER_NAME]);
+            DataService.setServiceType(serviceObject[COMPONENT.SERVICE_TYPE]);
+            DataService.setServiceInstanceId(serviceInstance[FIELD.ID.SERVICE_INSTANCE_ID]);
+
+
+            $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {
+                componentId: COMPONENT.VOLUME_GROUP
+            });
+        };
+
+        $scope.addNetworkInstance = function (netModel, existingVnfs) {
+
+            // For networks we assume that we always follow the new flow
+            console.log("Adding network to service instance" + this.service.instance.name);
+            if (VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED && (UtilityService.hasContents(existingVnfs)) && (existingVnfs.length > 0)) {
+                var msg = VnfService.isVnfListStatusValid(existingVnfs);
+                if (msg != "") {
+                    alert(msg);
+                    return;
+                }
+            }
+
+            DataService.setSubscriberName($scope.service.instance.subscriberName);
+            DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId);
+            DataService.setServiceType($scope.service.instance.serviceType);
+            DataService.setServiceInstanceName($scope.service.instance.name);
+            DataService.setServiceInstanceId($scope.service.instance.id);
+            DataService.setServiceName($scope.service.model.service.name);
+
+            DataService.setModelInfo(COMPONENT.NETWORK, {
+                "modelType": "network",
+                "modelInvariantId": netModel.invariantUuid,
+                "modelVersion": netModel.version,
+                "modelNameVersionId": netModel.uuid,
+                "modelName": netModel.name,
+                "modelCustomizationName": netModel.modelCustomizationName,
+                "customizationUuid": netModel.customizationUuid,
+                "inputs": "",
+                "displayInputs": netModel.displayInputs
+            });
+            setCurrentServiceModelInfoFromScope();
+
+
+            $scope.$broadcast(COMPONENT.CREATE_COMPONENT, {
+                componentId: COMPONENT.NETWORK,
+                callbackFunction: createVnfCallbackFunction
+            });
+        };
+
+        $scope.addVnfInstance = function (vnf, existingVnfs) {
+
+            if (VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED && (UtilityService.hasContents(existingVnfs)) && (existingVnfs.length > 0)) {
+                var msg = VnfService.isVnfListStatusValid(existingVnfs);
+                if (msg != "") {
+                    alert(msg);
+                    return;
+                }
+            }
+
+            var isVfc = false;
+
+            _.map($scope.service.model.vnfs, function (value, key) {
+                if (value.uuid == vnf.uuid) {
+                    if (!_.isEmpty(value.vfcInstanceGroups)) {
+                        isVfc = true;
+                        var queryData = {
+                            serviceModelId: $scope.service.model.service.uuid,
+                            serviceInstanceID: $scope.service.instance.id,
+                            globalCustomerId: $scope.service.instance.globalCustomerId,
+                            serviceType: $scope.service.instance.serviceType,
+                            serviceInstanceName: $scope.service.instance.name,
+                            modelCustomizationName: value.modelCustomizationName,
+                            modelCustomizationId: value.customizationUuid,
+                            subscriberName: $scope.service.instance.subscriberName
+                        };
+
+                        $scope.$broadcast(COMPONENT.IFRAME_DIALOG, queryData);
+                        return;
+                    }
+                }
+            });
+
+            DataService.setSubscriberName($scope.service.instance.subscriberName);
+            DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId);
+            DataService.setServiceType($scope.service.instance.serviceType);
+            DataService.setServiceInstanceName($scope.service.instance.name);
+            DataService.setServiceInstanceId($scope.service.instance.id);
+            DataService.setServiceName($scope.service.model.service.name);
+
+            console.log("existingVnfs: ");
+            console.log(JSON.stringify(existingVnfs, null, 4));
+            console.log("existingVnfs: ");
+            console.log(JSON.stringify(existingVnfs, null, 4));
+            var vnf_type = "";
+            var vnf_role = "";
+            var vnf_function = "";
+            var vnf_code = "";
+
+            if (UtilityService.hasContents(vnf.nfType)) {
+                vnf_type = vnf.nfType;
+            }
+            if (UtilityService.hasContents(vnf.nfRole)) {
+                vnf_role = vnf.nfRole;
+            }
+            if (UtilityService.hasContents(vnf.nfFunction)) {
+                vnf_function = vnf.nfFunction;
+            }
+            if (UtilityService.hasContents(vnf.nfCode)) {
+                vnf_code = vnf.nfCode;
+            }
+            DataService.setModelInfo(COMPONENT.VNF, {
+                "modelType": vnf.isPnf ? "pnf" : "vnf",
+                "modelInvariantId": vnf.invariantUuid,
+                "modelVersion": vnf.version,
+                "modelNameVersionId": vnf.uuid,
+                "modelName": vnf.name,
+                "modelCustomizationName": vnf.modelCustomizationName,
+                "customizationUuid": vnf.customizationUuid,
+                "inputs": "",
+                "displayInputs": vnf.displayInputs,
+                "vnfType": vnf_type,
+                "vnfRole": vnf_role,
+                "vnfFunction": vnf_function,
+                "vnfCode": vnf_code,
+                "properties": vnf.properties
+            });
+
+            DataService.setModelInstanceName($scope.service.model.service.name);
+            setCurrentServiceModelInfoFromScope();
+
+            if (vnf.isConfig) {
                 DataService.setServiceProxies($scope.service.model.serviceProxies);
                 DataService.setSourceServiceProxies(vnf.sourceNodes);
                 DataService.setCollectorServiceProxies(vnf.collectorNodes);
                 DataService.setConfigurationByPolicy(vnf.isConfigurationByPolicy);
                 $location.path("/addNetworkNode");
-            } else if(vnf.isPnf){
+            } else if (vnf.isPnf) {
                 $location.path("/pnfSearchAssociation");
+            } else if (isVfc) {
+                //do nothing
             } else {
                 $scope.$broadcast(COMPONENT.CREATE_COMPONENT, {
                     componentId: COMPONENT.VNF,
                     callbackFunction: createVnfCallbackFunction
                 });
             }
-		};
+        };
 
-		$scope.addVfModuleInstance = function(vnfInstance, vfModuleModel) {
-			
-			if ( VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED ) {
-				var msg = VnfService.isVnfStatusValid (vnfInstance);
-				if ( msg != "" ) {
-					alert ( msg );
-					return;
-				}
-				
-			}
-			var svcModel = $scope.service.convertedModel;
-			DataService.setSubscriberName($scope.service.instance.subscriberName);
-			DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId);
-			DataService.setServiceType($scope.service.instance.serviceType);
-			DataService.setServiceInstanceName($scope.service.instance.name);
-			DataService.setServiceInstanceId($scope.service.instance.id);
-			DataService.setServiceName($scope.service.model.service.name);
+        $scope.addVfModuleInstance = function (vnfInstance, vfModuleModel) {
 
-			var vnfModelInvariantUuid = vnfInstance.object[FIELD.ID.MODEL_INVAR_ID];
-			var vnfModelVersionId = vnfInstance.object[FIELD.ID.MODEL_VERSION_ID];
-			var vnfModelCustomizationUuid = vnfInstance.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-			var vnfModel = null;
-			if ( svcModel.isNewFlow ) {
-				vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
-			}
-			else {
-				vnfModel = svcModel.vnfs[vnfModelVersionId];
-			}
-			
-			var availableVolumeGroupList = [];
-			angular.forEach(vnfInstance[FIELD.ID.AVAILABLEVOLUMEGROUPS], function(volumeGroupInstance, key) {
-				availableVolumeGroupList.push({"instance": volumeGroupInstance});
-			});
-			
-			DataService.setAvailableVolumeGroupList(availableVolumeGroupList);
-			setCurrentServiceModelInfoFromScope();
+            if (VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED) {
+                var msg = VnfService.isVnfStatusValid(vnfInstance);
+                if (msg != "") {
+                    alert(msg);
+                    return;
+                }
 
-			DataService.setVnfInstanceId(vnfInstance.object[FIELD.ID.VNF_ID]);
+            }
+            var svcModel = $scope.service.convertedModel;
+            DataService.setSubscriberName($scope.service.instance.subscriberName);
+            DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId);
+            DataService.setServiceType($scope.service.instance.serviceType);
+            DataService.setServiceInstanceName($scope.service.instance.name);
+            DataService.setServiceInstanceId($scope.service.instance.id);
+            DataService.setServiceName($scope.service.model.service.name);
 
-			DataService.setModelInfo(COMPONENT.VNF, {
-				"modelInvariantId": vnfModel.invariantUuid,
-				"modelVersion": vnfModel.version,
-				"modelNameVersionId": vnfModel.uuid,
-				"modelName": vnfModel.name,
-				"modelCustomizationName": vnfModel.modelCustomizationName,
-				"customizationUuid": vnfModel.customizationUuid,
-				"inputs": ""
-			});
-			
-			DataService.setModelInfo(COMPONENT.VF_MODULE, {
-				"modelInvariantId": vfModuleModel.invariantUuid,
-				"modelVersion": vfModuleModel.version,
-				"modelNameVersionId": vfModuleModel.uuid,
-				"customizationUuid": vfModuleModel.customizationUuid,
-				"modelCustomizationName": vfModuleModel.modelCustomizationName,
-				"modelName": vfModuleModel.name,
-				"inputs": ""
-			});
-			
-			$scope.$broadcast(COMPONENT.CREATE_COMPONENT, {
-			    componentId : COMPONENT.VF_MODULE,
-			    callbackFunction : createVfModuleCallbackFunction
-			});
-		
-		};
+            var vnfModelInvariantUuid = vnfInstance.object[FIELD.ID.MODEL_INVAR_ID];
+            var vnfModelVersionId = vnfInstance.object[FIELD.ID.MODEL_VERSION_ID];
+            var vnfModelCustomizationUuid = vnfInstance.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+            var vnfModel = null;
+            if (svcModel.isNewFlow) {
+                vnfModel = svcModel.vnfs[vnfModelCustomizationUuid];
+            }
+            else {
+                vnfModel = svcModel.vnfs[vnfModelVersionId];
+            }
 
-		$scope.addVolumeGroupInstance = function(vnfInstance, volumeGroupModel) {
-			if ( VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED ) {
-				var msg = VnfService.isVnfStatusValid (vnfInstance);
-				if ( msg != "" ) {
-					alert ( msg );
-					return;
-				}
-			}
-			var svcModel = $scope.service.convertedModel;
-			DataService.setSubscriberName($scope.service.instance.subscriberName);
-			DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId);
-			DataService.setServiceType($scope.service.instance.serviceType);
-			DataService.setServiceInstanceName($scope.service.instance.name);
-			DataService.setServiceInstanceId($scope.service.instance.id);
-			DataService.setServiceName($scope.service.model.service.name);
-			setCurrentServiceModelInfoFromScope();
+            var availableVolumeGroupList = [];
+            angular.forEach(vnfInstance[FIELD.ID.AVAILABLEVOLUMEGROUPS], function (volumeGroupInstance, key) {
+                availableVolumeGroupList.push({"instance": volumeGroupInstance});
+            });
 
-			DataService.setModelInfo(COMPONENT.SERVICE, {
-				"modelInvariantId": $scope.service.model.service.invariantUuid,
-				"modelVersion": $scope.service.model.service.version,
-				"modelNameVersionId": $scope.service.model.service.uuid,
-				"modelName": $scope.service.model.service.name,
-				"inputs": ""
-			});
+            DataService.setAvailableVolumeGroupList(availableVolumeGroupList);
+            setCurrentServiceModelInfoFromScope();
 
-			DataService.setVnfInstanceId(vnfInstance.object[FIELD.ID.VNF_ID]);
+            DataService.setVnfInstanceId(vnfInstance.object[FIELD.ID.VNF_ID]);
 
-			var vnfModelInvariantUuid = vnfInstance.object[FIELD.ID.MODEL_INVAR_ID];
-			var vnfModelVersionId = vnfInstance.object[FIELD.ID.MODEL_VERSION_ID];
-			var vnfCustomizationUuid = vnfInstance.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
-			var vnfModel = null;
-			
-			if ( svcModel.isNewFlow ) {
-				vnfModel = svcModel.vnfs[vnfCustomizationUuid];
-			}
-			else {
-				vnfModel = svcModel.vnfs[vnfModelVersionId];
-			}
+            DataService.setModelInfo(COMPONENT.VNF, {
+                "modelInvariantId": vnfModel.invariantUuid,
+                "modelVersion": vnfModel.version,
+                "modelNameVersionId": vnfModel.uuid,
+                "modelName": vnfModel.name,
+                "modelCustomizationName": vnfModel.modelCustomizationName,
+                "customizationUuid": vnfModel.customizationUuid,
+                "inputs": ""
+            });
 
-			DataService.setModelInfo(COMPONENT.VNF, {
-				"modelInvariantId": vnfModel.invariantUuid,
-				"modelVersion": vnfModel.version,
-				"modelNameVersionId": vnfModel.uuid,
-				"modelName": vnfModel.name,
-				"modelCustomizationName": vnfModel.modelCustomizationName,
-				"customizationUuid": vnfModel.customizationUuid,
-				"inputs": ""
-			});
-			
-			DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {
-				"modelInvariantId": volumeGroupModel.invariantUuid,
-				"modelVersion": volumeGroupModel.version,
-				"modelNameVersionId": volumeGroupModel.uuid,
-				"modelName": volumeGroupModel.name,
-				"modelCustomizationName": volumeGroupModel.modelCustomizationName,
-				"customizationUuid": volumeGroupModel.customizationUuid,
-				"inputs": ""
-			});
-			
-			$scope.$broadcast(COMPONENT.CREATE_COMPONENT, {
-			    componentId : COMPONENT.VOLUME_GROUP,
-			    callbackFunction : createVolumeGroupCallbackFunction
-			});
-		};
+            DataService.setModelInfo(COMPONENT.VF_MODULE, {
+                "modelInvariantId": vfModuleModel.invariantUuid,
+                "modelVersion": vfModuleModel.version,
+                "modelNameVersionId": vfModuleModel.uuid,
+                "customizationUuid": vfModuleModel.customizationUuid,
+                "modelCustomizationName": vfModuleModel.modelCustomizationName,
+                "modelName": vfModuleModel.name,
+                "inputs": ""
+            });
 
-        $scope.resume = function(serviceObject, vfModule, vnfModel) {
+            $scope.$broadcast(COMPONENT.CREATE_COMPONENT, {
+                componentId: COMPONENT.VF_MODULE,
+                callbackFunction: createVfModuleCallbackFunction
+            });
+
+        };
+
+        $scope.addVolumeGroupInstance = function (vnfInstance, volumeGroupModel) {
+            if (VIDCONFIGURATION.VNF_STATUS_CHECK_ENABLED) {
+                var msg = VnfService.isVnfStatusValid(vnfInstance);
+                if (msg != "") {
+                    alert(msg);
+                    return;
+                }
+            }
+            var svcModel = $scope.service.convertedModel;
+            DataService.setSubscriberName($scope.service.instance.subscriberName);
+            DataService.setGlobalCustomerId($scope.service.instance.globalCustomerId);
+            DataService.setServiceType($scope.service.instance.serviceType);
+            DataService.setServiceInstanceName($scope.service.instance.name);
+            DataService.setServiceInstanceId($scope.service.instance.id);
+            DataService.setServiceName($scope.service.model.service.name);
+            setCurrentServiceModelInfoFromScope();
+
+            DataService.setModelInfo(COMPONENT.SERVICE, {
+                "modelInvariantId": $scope.service.model.service.invariantUuid,
+                "modelVersion": $scope.service.model.service.version,
+                "modelNameVersionId": $scope.service.model.service.uuid,
+                "modelName": $scope.service.model.service.name,
+                "inputs": ""
+            });
+
+            DataService.setVnfInstanceId(vnfInstance.object[FIELD.ID.VNF_ID]);
+
+            var vnfModelInvariantUuid = vnfInstance.object[FIELD.ID.MODEL_INVAR_ID];
+            var vnfModelVersionId = vnfInstance.object[FIELD.ID.MODEL_VERSION_ID];
+            var vnfCustomizationUuid = vnfInstance.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
+            var vnfModel = null;
+
+            if (svcModel.isNewFlow) {
+                vnfModel = svcModel.vnfs[vnfCustomizationUuid];
+            }
+            else {
+                vnfModel = svcModel.vnfs[vnfModelVersionId];
+            }
+
+            DataService.setModelInfo(COMPONENT.VNF, {
+                "modelInvariantId": vnfModel.invariantUuid,
+                "modelVersion": vnfModel.version,
+                "modelNameVersionId": vnfModel.uuid,
+                "modelName": vnfModel.name,
+                "modelCustomizationName": vnfModel.modelCustomizationName,
+                "customizationUuid": vnfModel.customizationUuid,
+                "inputs": ""
+            });
+
+            DataService.setModelInfo(COMPONENT.VOLUME_GROUP, {
+                "modelInvariantId": volumeGroupModel.invariantUuid,
+                "modelVersion": volumeGroupModel.version,
+                "modelNameVersionId": volumeGroupModel.uuid,
+                "modelName": volumeGroupModel.name,
+                "modelCustomizationName": volumeGroupModel.modelCustomizationName,
+                "customizationUuid": volumeGroupModel.customizationUuid,
+                "inputs": ""
+            });
+
+            $scope.$broadcast(COMPONENT.CREATE_COMPONENT, {
+                componentId: COMPONENT.VOLUME_GROUP,
+                callbackFunction: createVolumeGroupCallbackFunction
+            });
+        };
+
+        $scope.resume = function (serviceObject, vfModule, vnfModel) {
             populate_popup_vfModule(serviceObject, vfModule, vnfModel);
-			setCurrentVNFModelInfo(vnfModel);
-			DataService.setVfModuleInstanceName(vfModule.object[FIELD.ID.VF_MODULE_NAME]);
-			setCurrentServiceModelInfoFromScope();
+            setCurrentVNFModelInfo(vnfModel);
+            DataService.setVfModuleInstanceName(vfModule.object[FIELD.ID.VF_MODULE_NAME]);
+            setCurrentServiceModelInfoFromScope();
             $scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
-                componentId : COMPONENT.VF_MODULE,
-                callbackFunction : deleteOrResumeCallback,
+                componentId: COMPONENT.VF_MODULE,
+                callbackFunction: deleteOrResumeCallback,
                 dialogMethod: COMPONENT.RESUME
             });
         };
 
-		$scope.deleteConfiguration = function (serviceObject, configuration) {
+        $scope.deleteConfiguration = function (serviceObject, configuration) {
             console.log("Deleting Configuration " + configuration.name);
 
             var serviceInstance = serviceObject.object;
@@ -1081,27 +1192,27 @@
             // set model default and override later if found
             DataService.setModelInfo(COMPONENT.CONFIGURATION, {});
 
-            if ( configuration.object != null ) {
+            if (configuration.object != null) {
 
                 //var netModelInvariantUuid = network.object[FIELD.ID.MODEL_INVAR_ID];
                 var configModelVersionId = configuration.object[FIELD.ID.MODEL_VERSION_ID]; // model uuid
                 var configModelCustomizationUuid = configuration.object[FIELD.ID.MODEL_CUSTOMIZATION_ID];
 
                 //configurations added to vnfs list, in order to be part of the "Add VNF" drop-down list
-                if ( (!($scope.isObjectEmpty(svcModel))) && ( !($scope.isObjectEmpty(svcModel.vnfs) ) ) ) {
-                    if ( (svcModel.isNewFlow) && (UtilityService.hasContents(configModelCustomizationUuid) ) ) {
+                if ((!($scope.isObjectEmpty(svcModel))) && (!($scope.isObjectEmpty(svcModel.vnfs)))) {
+                    if ((svcModel.isNewFlow) && (UtilityService.hasContents(configModelCustomizationUuid))) {
                         configModel = svcModel.vnfs[configModelCustomizationUuid];
                     }
                     else {
 
-                        if ( UtilityService.hasContents(configModelVersionId) ) {
+                        if (UtilityService.hasContents(configModelVersionId)) {
                             configModel = svcModel.vnfs[configModelVersionId];
                         }
 
                     }
                 }
             }
-            if (!($scope.isObjectEmpty(configModel) ) ) {
+            if (!($scope.isObjectEmpty(configModel))) {
                 DataService.setModelInfo(COMPONENT.CONFIGURATION, {
                     "modelInvariantId": configModel.invariantUuid,
                     "modelVersion": configModel.version,
@@ -1123,258 +1234,269 @@
             DataService.setServiceUuid($scope.service.model.service.uuid);
             DataService.setConfigurationInstanceId(configuration.object[FIELD.ID.CONFIGURATION_ID]);
 
-            $scope.$broadcast(COMPONENT.DELETE_COMPONENT, {
-                componentId : COMPONENT.CONFIGURATION,
-                callbackFunction : deleteCallbackFunction
+            $scope.$broadcast(COMPONENT.DELETE_RESUME_COMPONENT, {
+                componentId: COMPONENT.CONFIGURATION,
+                dialogMethod: COMPONENT.DELETE,
+                callbackFunction: deleteCallbackFunction
             });
         };
 
-		$scope.resetProgress = function() {
-			$scope.percentProgress = 0;
-			$scope.progressClass = FIELD.STYLE.PROGRESS_BAR_INFO;
-		};
-
-		$scope.setProgress = function(percentProgress) {
-			percentProgress = parseInt(percentProgress);
-			if (percentProgress >= 100) {
-				$scope.progressClass = FIELD.STYLE.PROGRESS_BAR_SUCCESS;					
-			}
-
-			if (percentProgress < $scope.percentProgress) {
-				return;
-			}
-
-			$scope.percentProgress = percentProgress;
-			$scope.progressWidth = {width: percentProgress + "%"};
-			if (percentProgress >= 5) {
-				$scope.progressText =  percentProgress + " %";
-			} else {
-				// Hidden since color combination is barely visible when progress portion is narrow.
-				$scope.progressText = "";
-			}
-		};
-		$scope.isObjectEmpty = function(o) {
-			var len = 0;
-			if (UtilityService.hasContents(o)){
-				var keys = Object.keys(o);
-				len = keys.length;
-				if ( len == 0 ) {
-					return true;
-				}
-				else {
-					return false;
-				}
-			}
-			else {
-				return true;
-			}
-		}
-		$scope.isMacro = function() {
-			if (UtilityService.arrayContains (VIDCONFIGURATION.MACRO_SERVICES, $scope.service.model.service.invariantUuid )) {
-				return(true);
-				
-			}
-			else {
-				return (false);
-			}
-		}
-		$scope.reloadRoute = function() {
-			$route.reload();
-		}
-
-
-
-           		/*
-		Private metthods
-		 */
-
-		/*
-		setPnf
-		* set the controller pnf param using api call
-		* return: void
-		 */
-        function _setPnf(data){ // data is the $scope.service.instance object
- 		 return PnfService.getPnfs(data)
-                .then(
-					function success(response){
-						return response.data;
-						// * can add here changes on the data that are needed to the view ( filter, ect..)
-					},
-					function error(error){
-						console.error(error);
-					}
-            	);
+        var deleteCallbackFunction = function () {
+            console.log('hi')
         }
 
+        $scope.resetProgress = function () {
+            $scope.percentProgress = 0;
+            $scope.progressClass = FIELD.STYLE.PROGRESS_BAR_INFO;
+        };
+
+        $scope.setProgress = function (percentProgress) {
+            percentProgress = parseInt(percentProgress);
+            if (percentProgress >= 100) {
+                $scope.progressClass = FIELD.STYLE.PROGRESS_BAR_SUCCESS;
+            }
+
+            if (percentProgress < $scope.percentProgress) {
+                return;
+            }
+
+            $scope.percentProgress = percentProgress;
+            $scope.progressWidth = {width: percentProgress + "%"};
+            if (percentProgress >= 5) {
+                $scope.progressText = percentProgress + " %";
+            } else {
+                // Hidden since color combination is barely visible when progress portion is narrow.
+                $scope.progressText = "";
+            }
+        };
+        $scope.isObjectEmpty = function (o) {
+            var len = 0;
+            if (UtilityService.hasContents(o)) {
+                var keys = Object.keys(o);
+                len = keys.length;
+                if (len == 0) {
+                    return true;
+                }
+                else {
+                    return false;
+                }
+            }
+            else {
+                return true;
+            }
+        }
+        $scope.isMacro = function () {
+            return $scope.service && AsdcService.isMacro($scope.service.model);
+        }
+        $scope.reloadRoute = function () {
+            $route.reload();
+        }
+
+
+        /*
+Private metthods
+*/
+
+        /*
+        setPnf
+        * set the controller pnf param using api call
+        * return: void
+         */
+        function _setPnf(data) { // data is the $scope.service.instance object
+            return PnfService.getPnfs(data)
+                .then(
+                    function success(response) {
+                        return response.data;
+                        // * can add here changes on the data that are needed to the view ( filter, ect..)
+                    },
+                    function error(error) {
+                        console.error(error);
+                    }
+                );
+        }
+
+
+        function _setCr(data) { // data is the $scope.service.instance object
+            return CrService.getCr(data)
+                .then(
+                    function success(response) {
+                        return response.data.results;
+                        // * can add here changes on the data that are needed to the view ( filter, ect..)
+                    },
+                    function error(error) {
+                        console.error(error);
+                    }
+                );
+        }
+
+
         /*
         Callbaks functions
 
          */
-		var updateProvStatusVnfCallbackFunction = function(response) {
-			$scope.callbackResults = "";
-			var color = FIELD.ID.COLOR_NONE;
-			$scope.callbackStyle = {
-					"background-color" : color
-			};
-			$scope.reloadRoute();
-			/*
-			 * This 1/2 delay was only added to visually highlight the status
-			 * change. Probably not needed in the real application code.
-			 */
-			$timeout(function() {
-				$scope.callbackResults = UtilityService.getCurrentTime()
-				+ FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
-				if (response.isSuccessful) {
-					color = FIELD.ID.COLOR_8F8;
-					
-				} else {
-					color = FIELD.ID.COLOR_F88;
-				}
-				$scope.callbackStyle = {
-						"background-color" : color
-				};
-			}, 500);
-		
-		};
+        var updateProvStatusVnfCallbackFunction = function (response) {
+            $scope.callbackResults = "";
+            var color = FIELD.ID.COLOR_NONE;
+            $scope.callbackStyle = {
+                "background-color": color
+            };
+            $scope.reloadRoute();
+            /*
+             * This 1/2 delay was only added to visually highlight the status
+             * change. Probably not needed in the real application code.
+             */
+            $timeout(function () {
+                $scope.callbackResults = UtilityService.getCurrentTime()
+                    + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
+                if (response.isSuccessful) {
+                    color = FIELD.ID.COLOR_8F8;
 
-		var createVnfCallbackFunction = function(response) {
-			$scope.callbackResults = "";
-			var color = FIELD.ID.COLOR_NONE;
-			$scope.callbackStyle = {
-					"background-color" : color
-			};
-			
-			/*
-			 * This 1/2 delay was only added to visually highlight the status
-			 * change. Probably not needed in the real application code.
-			 */
-			$timeout(function() {
-				$scope.callbackResults = UtilityService.getCurrentTime()
-				+ FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
-				if (response.isSuccessful) {
-					color = FIELD.ID.COLOR_8F8;
-					$scope.reloadRoute();
-				} else {
-					color = FIELD.ID.COLOR_F88;
-				}
-				$scope.callbackStyle = {
-						"background-color" : color
-				};
-			}, 500);
-			
-		
-			
-		};
-		
-		var deleteOrResumeCallback = function(response) {
-			$scope.callbackResults = "";
-			var color = FIELD.ID.COLOR_NONE;
-			$scope.callbackStyle = {
-					"background-color" : color
-			};
-			
-			/*
-			 * This 1/2 delay was only added to visually highlight the status
-			 * change. Probably not needed in the real application code.
-			 */
-			$timeout(function() {
-				$scope.callbackResults = UtilityService.getCurrentTime()
-				+ FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
-				if (response.isSuccessful) {
-					color = FIELD.ID.COLOR_8F8;
-					$scope.reloadRoute();
-				} else {
-					color = FIELD.ID.COLOR_F88;
-				}
-				$scope.callbackStyle = {
-						"background-color" : color
-				};
-			}, 500);
-			
-		};
-		
-		var createVfModuleCallbackFunction = function(response) {
-			$scope.callbackResults = "";
-			var color = FIELD.ID.COLOR_NONE;
-			$scope.callbackStyle = {
-					"background-color" : color
-			};
-			
-			/*
-			 * This 1/2 delay was only added to visually highlight the status
-			 * change. Probably not needed in the real application code.
-			 */
-			$timeout(function() {
-				$scope.callbackResults = UtilityService.getCurrentTime()
-				+ FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
-				if (response.isSuccessful) {
-					color = FIELD.ID.COLOR_8F8;
-					$scope.reloadRoute();
-				} else {
-					color = FIELD.ID.COLOR_F88;
-				}
-				$scope.callbackStyle = {
-						"background-color" : color
-				};
-			}, 500);
+                } else {
+                    color = FIELD.ID.COLOR_F88;
+                }
+                $scope.callbackStyle = {
+                    "background-color": color
+                };
+            }, 500);
 
-		};
-			
-		var deleteServiceInstanceCallbackFunction = function(response) {
-			$scope.callbackResults = "";
-			var color = FIELD.ID.COLOR_NONE;
-			$scope.callbackStyle = {
-					"background-color" : color
-			};
-			
-			/*
-			 * This 1/2 delay was only added to visually highlight the status
-			 * change. Probably not needed in the real application code.
-			 */
-			$timeout(function() {
-				$scope.callbackResults = UtilityService.getCurrentTime()
-				+ FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
-				if (response.isSuccessful) {
-					color = FIELD.ID.COLOR_8F8;
-					$location.path(COMPONENT.SERVICEMODELS_MODELS_SERVICES_PATH)
-				} else {
-					color = FIELD.ID.COLOR_F88;
-				}
-				$scope.callbackStyle = {
-						"background-color" : color
-				};
-			}, 500);
+        };
 
-		};
-	
-		var createVolumeGroupCallbackFunction = function(response) {
-			$scope.callbackResults = "";
-			var color = FIELD.ID.COLOR_NONE;
-			$scope.callbackStyle = {
-					"background-color" : color
-			};
-			
-			/*
-			 * This 1/2 delay was only added to visually highlight the status
-			 * change. Probably not needed in the real application code.
-			 */
-			$timeout(function() {
-				$scope.callbackResults = UtilityService.getCurrentTime()
-				+ FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
-				if (response.isSuccessful) {
-					color = FIELD.ID.COLOR_8F8;
-					$scope.reloadRoute();
-				} else {
-					color = FIELD.ID.COLOR_F88;
-				}
-				$scope.callbackStyle = {
-						"background-color" : color
-				};
-			}, 500);
-			
-			
-		
-		};
-			
-	});
+        var createVnfCallbackFunction = function (response) {
+            $scope.callbackResults = "";
+            var color = FIELD.ID.COLOR_NONE;
+            $scope.callbackStyle = {
+                "background-color": color
+            };
+
+            /*
+             * This 1/2 delay was only added to visually highlight the status
+             * change. Probably not needed in the real application code.
+             */
+            $timeout(function () {
+                $scope.callbackResults = UtilityService.getCurrentTime()
+                    + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
+                if (response.isSuccessful) {
+                    color = FIELD.ID.COLOR_8F8;
+                    $scope.reloadRoute();
+                } else {
+                    color = FIELD.ID.COLOR_F88;
+                }
+                $scope.callbackStyle = {
+                    "background-color": color
+                };
+            }, 500);
+
+
+        };
+
+        var deleteOrResumeCallback = function (response) {
+            $scope.callbackResults = "";
+            var color = FIELD.ID.COLOR_NONE;
+            $scope.callbackStyle = {
+                "background-color": color
+            };
+
+            /*
+             * This 1/2 delay was only added to visually highlight the status
+             * change. Probably not needed in the real application code.
+             */
+            $timeout(function () {
+                $scope.callbackResults = UtilityService.getCurrentTime()
+                    + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
+                if (response.isSuccessful) {
+                    color = FIELD.ID.COLOR_8F8;
+                    $scope.reloadRoute();
+                } else {
+                    color = FIELD.ID.COLOR_F88;
+                }
+                $scope.callbackStyle = {
+                    "background-color": color
+                };
+            }, 500);
+
+        };
+
+        var createVfModuleCallbackFunction = function (response) {
+            $scope.callbackResults = "";
+            var color = FIELD.ID.COLOR_NONE;
+            $scope.callbackStyle = {
+                "background-color": color
+            };
+
+            /*
+             * This 1/2 delay was only added to visually highlight the status
+             * change. Probably not needed in the real application code.
+             */
+            $timeout(function () {
+                $scope.callbackResults = UtilityService.getCurrentTime()
+                    + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
+                if (response.isSuccessful) {
+                    color = FIELD.ID.COLOR_8F8;
+                    $scope.reloadRoute();
+                } else {
+                    color = FIELD.ID.COLOR_F88;
+                }
+                $scope.callbackStyle = {
+                    "background-color": color
+                };
+            }, 500);
+
+        };
+
+        var deleteServiceInstanceCallbackFunction = function (response) {
+            $scope.callbackResults = "";
+            var color = FIELD.ID.COLOR_NONE;
+            $scope.callbackStyle = {
+                "background-color": color
+            };
+
+            /*
+             * This 1/2 delay was only added to visually highlight the status
+             * change. Probably not needed in the real application code.
+             */
+            $timeout(function () {
+                $scope.callbackResults = UtilityService.getCurrentTime()
+                    + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
+                if (response.isSuccessful) {
+                    color = FIELD.ID.COLOR_8F8;
+                    $location.path(COMPONENT.SERVICEMODELS_MODELS_SERVICES_PATH)
+                } else {
+                    color = FIELD.ID.COLOR_F88;
+                }
+                $scope.callbackStyle = {
+                    "background-color": color
+                };
+            }, 500);
+
+        };
+
+        var createVolumeGroupCallbackFunction = function (response) {
+            $scope.callbackResults = "";
+            var color = FIELD.ID.COLOR_NONE;
+            $scope.callbackStyle = {
+                "background-color": color
+            };
+
+            /*
+             * This 1/2 delay was only added to visually highlight the status
+             * change. Probably not needed in the real application code.
+             */
+            $timeout(function () {
+                $scope.callbackResults = UtilityService.getCurrentTime()
+                    + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
+                if (response.isSuccessful) {
+                    color = FIELD.ID.COLOR_8F8;
+                    $scope.reloadRoute();
+                } else {
+                    color = FIELD.ID.COLOR_F88;
+                }
+                $scope.callbackStyle = {
+                    "background-color": color
+                };
+            }, 500);
+
+
+        };
+
+    });
 })();
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js
index b52b463..c85e865 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js
@@ -22,17 +22,30 @@
 	'use strict';
 
 	appDS2.controller("ServiceModelController", function ($scope, $http, $location, COMPONENT, VIDCONFIGURATION, FIELD, DataService, vidService,
-			PropertyService, UtilityService) {
+			PropertyService, UtilityService, AsdcService,$timeout) {
 
 		$scope.popup = {};
-		
+		var defaultViewPerPage = 10;
 	//	var baseEndpoint = "vid";
 		var pathQuery = COMPONENT.SERVICES_DIST_STATUS_PATH + VIDCONFIGURATION.ASDC_MODEL_STATUS;
 		
 		if ( VIDCONFIGURATION.ASDC_MODEL_STATUS === FIELD.STATUS.ALL) {
 			pathQuery = COMPONENT.SERVICES_PATH;
 		}
-		
+        window.addEventListener("message", receiveMessage, false);
+
+		function receiveMessage(event){
+            if(event.data == 'navigateTo') {
+                $location.path('/models/services').search({});
+                $scope.$apply();
+                $scope.rememberFilter = true;
+            }
+            if(event.data == 'navigateToInstantiationStatus') {
+                $location.path('/instantiationStatus').search({});
+                $scope.$apply();
+            }
+		}
+
 		$scope.getServiceModels = function() {
 			$scope.status = FIELD.STATUS.FETCHING_SERVICE_CATALOG_ASDC;
 
@@ -41,16 +54,28 @@
 				$scope.services = [];
 				if (response.data && angular.isArray(response.data.services)) {
 					wholeData = response.data.services;
-					$scope.services = $scope.filterDataWithHigherVersion(wholeData);
-					$scope.viewPerPage=10;
-					$scope.totalPage=$scope.services.length/$scope.viewPerPage;
-					$scope.sortBy=COMPONENT.NAME;
-					$scope.scrollViewPerPage=2;
-					$scope.currentPage=1;
-					$scope.searchCategory;
-					$scope.currentPageNum=1;
-					$scope.isSpinnerVisible = false;
-					$scope.isProgressVisible = false;
+                    $scope.services = $scope.filterDataWithHigherVersion(wholeData);
+                    $scope.viewPerPage = defaultViewPerPage;
+                    $scope.totalPage=$scope.services.length/$scope.viewPerPage;
+                    $scope.sortBy=COMPONENT.NAME;
+                    $scope.scrollViewPerPage=2;
+                    $scope.currentPage=1;
+                    $scope.currentPageNum=1;
+                    $scope.isSpinnerVisible = false;
+                    $scope.isProgressVisible = false;
+                    if (sessionStorage.getItem("searchKey")!='undefined' && ($scope.rememberFilter)) {
+                        var searchKey = JSON.parse(sessionStorage.getItem("searchKey"));
+                        $scope.searchString = searchKey.searchString || '';
+                        $scope.viewPerPage = searchKey.viewPerPage || defaultViewPerPage;
+                        $scope.totalPage = $scope.services.length / $scope.viewPerPage;
+                        $timeout(function () {
+                        	// the table controller handles the current page once
+							// data is loaded, therefore we're delying the paging
+							// override
+                            $scope.currentPage = $scope.currentPageNum = searchKey.currentPage ? parseInt(searchKey.currentPage) : 1;
+                        }, 0);
+                        $scope.rememberFilter = false;
+                    }
 				} else {
 					$scope.status = FIELD.STATUS.FAILED_SERVICE_MODELS_ASDC;
 					$scope.error = true;
@@ -99,25 +124,32 @@
     		
     		//PropertyService.setMsoBaseUrl("testmso");
     		PropertyService.setServerResponseTimeoutMsec(30000);
-        }
+        };
 		
 		$scope.prevPage = function() {
 			$scope.currentPage--;
-		}
+		};
 		
 		$scope.nextPage = function() {
 			$scope.currentPage++;
-		}
+		};
+
+
 		
 		$scope.createType = COMPONENT.A_LA_CARTE;
 		$scope.deployService = function(service) {
-
+			var searchKey = {
+				searchString: $scope.searchString,
+                viewPerPage: $scope.viewPerPage,
+                currentPage: $scope.currentPage
+			};
+			sessionStorage.setItem("searchKey",JSON.stringify(searchKey));
 
 			console.log("Instantiating SDC service " + service.uuid);
-			
+
 			$http.get(COMPONENT.SERVICES_PATH + service.uuid)
 				.then(function successCallback(getServiceResponse) {
-					
+
 					var serviceModel = getServiceResponse.data;
 
 					//VID-233 bug fix when models doesn't exists
@@ -157,41 +189,42 @@
 					DataService.setALaCarte (true);
 					$scope.createType = COMPONENT.A_LA_CARTE;
 					var broadcastType = COMPONENT.CREATE_COMPONENT;
-					
-					if (UtilityService.arrayContains (VIDCONFIGURATION.MACRO_SERVICES, serviceModel.service.invariantUuid )) {
-						DataService.setALaCarte (false);
-						$scope.createType = COMPONENT.MACRO;
-						var convertedAsdcModel = UtilityService.convertModel(serviceModel);
-						
-						//console.log ("display inputs "); 
-						//console.log (JSON.stringify ( convertedAsdcModel.completeDisplayInputs));
-						
-						DataService.setModelInfo(COMPONENT.SERVICE, {
-							"modelInvariantId": serviceModel.service.invariantUuid,
-							"modelVersion": serviceModel.service.version,
-							"modelNameVersionId": serviceModel.service.uuid,
-							"modelName": serviceModel.service.name,
-							"description": serviceModel.service.description,
-							"category":serviceModel.service.category,
-							"serviceEcompNaming": serviceModel.service.serviceEcompNaming,
-							"inputs": serviceModel.service.inputs,
-							"serviceType": serviceModel.service.serviceType,
-							"serviceRole": serviceModel.service.serviceRole,
-							"displayInputs": convertedAsdcModel.completeDisplayInputs
-						});
-					};
-					
+                    if (AsdcService.isMacro(serviceModel)) {
+                        DataService.setALaCarte(false);
+                        if(AsdcService.shouldExcludeMacroFromAsyncInstatiationFlow(serviceModel)){
+                        	DataService.setShouldExcludeMacroFromAsyncInstatiationFlow(true);
+                            $scope.createType = COMPONENT.MACRO;
+                            var convertedAsdcModel = UtilityService.convertModel(serviceModel);
+
+                            DataService.setModelInfo(COMPONENT.SERVICE, {
+                                "modelInvariantId": serviceModel.service.invariantUuid,
+                                "modelVersion": serviceModel.service.version,
+                                "modelNameVersionId": serviceModel.service.uuid,
+                                "modelName": serviceModel.service.name,
+                                "description": serviceModel.service.description,
+                                "category": serviceModel.service.category,
+                                "serviceEcompNaming": serviceModel.service.serviceEcompNaming,
+                                "inputs": serviceModel.service.inputs,
+                                "serviceType": serviceModel.service.serviceType,
+                                "serviceRole": serviceModel.service.serviceRole,
+                                "displayInputs": convertedAsdcModel.completeDisplayInputs
+                            });
+
+                        }
+                    }
+
 					$scope.$broadcast(broadcastType, {
 					    componentId : COMPONENT.SERVICE,
+                        modelNameVersionId: serviceModel.service.uuid,
 					    callbackFunction : function(response) {
 					    	if (response.isSuccessful) {
 								vidService.setModel(serviceModel);
-								
+
 								var subscriberId = FIELD.STATUS.NOT_FOUND;
 								var serviceType = FIELD.STATUS.NOT_FOUND;
-								
+
 								var serviceInstanceId = response.instanceId;
-								
+
 								for (var i = 0; i < response.control.length; i++) {
 									if (response.control[i].id == COMPONENT.SUBSCRIBER_NAME) {
 										subscriberId = response.control[i].value;
@@ -199,14 +232,13 @@
 										serviceType = response.control[i].value;
 									}
 								}
-								
-								
+
+
 								$scope.refreshSubs(subscriberId,serviceType,serviceInstanceId);
-							
+
 					    	}
 					    }
 					});
-					
 				}, function errorCallback(response) {
 					console.log("Error: " + response);
 				});
@@ -231,7 +263,7 @@
 			    callbackFunction : function(response) {
 			    }
 			});
-		}
+		};
 
 		$scope.refreshSubs = function(subscriberId, serviceType, serviceInstanceId) {
 			$scope.status = FIELD.STATUS.FETCHING_SUBSCRIBER_LIST_AAI;
@@ -243,7 +275,7 @@
 			}).then(function(response){
 				
 				if (response.data.status < 200 || response.data.status > 202) {
-					$scope.showError(FIELD.ERROR.MSO)
+					$scope.showError(FIELD.ERROR.MSO);
 					return;
 				}
 
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceProxyConfigController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceProxyConfigController.js
index 6e7ad50..5d17faa 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceProxyConfigController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceProxyConfigController.js
@@ -163,6 +163,9 @@
                             },
                             requestParams: function () {
                                 return requestParams;
+                            },
+                            configuration: function () {
+                                return null;
                             }
                         }
                     });
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/VidApp.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/VidApp.js
index 6129fd9..e30bd38 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/VidApp.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/VidApp.js
@@ -73,6 +73,14 @@
 		  controller: 'ServiceProxyConfigController',
 		  templateUrl: 'app/vid/scripts/view-models/serviceProxyConfig.htm'
 	    })
+	  .when('/servicePlanning', {
+		  controller: 'iframeController',
+		  templateUrl: 'app/vid/scripts/view-models/iframe.htm'
+	  })
+	    .when('/instantiationStatus', {
+	    	controller: 'iframeController',
+			templateUrl: 'app/vid/scripts/view-models/iframe.htm'
+	    })
         .otherwise({
         	redirectTo: '/models/services'
         });
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/aaiSubscriberController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/aaiSubscriberController.js
index aeac7f3..164c71c 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/aaiSubscriberController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/aaiSubscriberController.js
@@ -20,8 +20,8 @@
 
 "use strict";
 
-appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER", "DataService", "PropertyService", "$scope", "$http", "$timeout", "$location", "$log", "$route", "$uibModal", "VIDCONFIGURATION", "UtilityService", "vidService", "AaiService", "MsoService", "OwningEntityService", "$q",
-    function (COMPONENT, FIELD, PARAMETER, DataService, PropertyService, $scope, $http, $timeout, $location, $log, $route, $uibModal, VIDCONFIGURATION, UtilityService, vidService, AaiService, MsoService, OwningEntityService, $q) {
+appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER", "DataService", "PropertyService", "$scope", "$http", "$timeout", "$location", "$log", "$route", "$uibModal", "VIDCONFIGURATION", "UtilityService", "vidService", "AaiService", "MsoService", "OwningEntityService", "AsdcService","featureFlags", "$q", "_",
+    function (COMPONENT, FIELD, PARAMETER, DataService, PropertyService, $scope, $http, $timeout, $location, $log, $route, $uibModal, VIDCONFIGURATION, UtilityService, vidService, AaiService, MsoService, OwningEntityService, AsdcService, featureFlags, $q, _) {
 
         $scope.showVnfDetails = function (vnf) {
             console.log("showVnfDetails");
@@ -44,6 +44,8 @@
         $scope.serviceTypes = [FIELD.PROMPT.SELECT_SERVICE, COMPONENT.UCPE_VMS, COMPONENT.SDN_L3_BONDING, COMPONENT.SDN_ETHERNET_INTERNET];
         $scope.defaultSubscriberName = [FIELD.PROMPT.SELECT_SUB];
 
+        $scope.verifyButtonEnabled = true;
+
         var callbackFunction = function (response) {
             alert(response);
         };
@@ -223,7 +225,8 @@
                     $scope.createType = "a la carte";
                     var broadcastType = "createComponent";
 
-                    if (UtilityService.arrayContains(VIDCONFIGURATION.MACRO_SERVICES, serviceModel.service.invariantUuid)) {
+                    if (AsdcService.isMacro(serviceModel)) {
+                        DataService.setShouldExcludeMacroFromAsyncInstatiationFlow(AsdcService.shouldExcludeMacroFromAsyncInstatiationFlow(serviceModel));
                         DataService.setALaCarte(false);
                         $scope.createType = "Macro";
                         var convertedAsdcModel = UtilityService.convertModel(serviceModel);
@@ -464,6 +467,61 @@
             $scope.setProgress(2); // Show "a little" progress
         }
 
+        function getRelatedInstanceGroupsByVnfId(genericVnf) {
+            var model = vidService.getModel();
+            if (model && model.vnfs && !_.isEmpty(model.vnfs)) {
+                Object.keys(model.vnfs).forEach(function (key) {
+                    var vnf = model.vnfs[key];
+                    if (vnf.vfcInstanceGroups && !_.isEmpty(vnf.vfcInstanceGroups)) {
+                        if (vnf.uuid === genericVnf.modelVersionId) {
+                            AaiService.getInstanceGroupsByVNFInstanceId(genericVnf.nodeId,
+                                function (response) { //success
+                                    handleGetRelatedInstanceGroupsResponseForVnf(response, genericVnf);
+                                },
+                                function (response) { //failure
+                                    $scope.showError(FIELD.ERROR.AAI);
+                                    $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_INSTANCE_DATA + response.status;
+                                    $scope.errorDetails = response.data;
+                                }
+                            )
+                        }
+                    }
+                })
+            }
+        }
+
+        function resolveModelDataIfMissing(modelVersionId) {
+            var model = vidService.getModel();
+            if (model && model.service && model.service.uuid === modelVersionId) {
+                return $q.resolve(); // no need to resolve anything
+            } else {
+                // resolve model and value of isPermitted
+                return resolveIfIsPermitted()
+                    .then(function() {
+                        return getAsdcModelByVersionId(modelVersionId);
+                    })
+            }
+        }
+
+        function resolveIfIsPermitted() {
+            var deferred = $q.defer();
+            AaiService.searchServiceInstances(
+                '?subscriberId=' + $location.search().subscriberId +
+                '&serviceInstanceIdentifier=' + $location.search().serviceInstanceId)
+                .then(function (response) {
+                    if (response.displayData && response.displayData.length) {
+                        var first = response.displayData[0];
+                        $scope.isPermitted = first.isPermitted;
+                        deferred.resolve(first.isPermitted);
+                    } else {
+                        deferred.reject("some error while resolveIfIsPermitted")
+                    }
+                });
+
+            return deferred.promise;
+        }
+
+
         $scope.getComponentList = function (event, request) {
 
             $scope.isSpinnerVisible = true;
@@ -484,34 +542,70 @@
 
             //$scope.getAsdcModel($location.search().modelUuid);
 
-            $scope.namedQueryId = VIDCONFIGURATION.COMPONENT_LIST_NAMED_QUERY_ID;
-            $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;
+            return getModelVersionIdForServiceInstance({
+                globalCustomerId: $location.search().subscriberId,
+                serviceInstanceId: $location.search().serviceInstanceId,
+                aaiModelVersionId: $location.search().aaiModelVersionId
+            })
+                .then(resolveModelDataIfMissing)
+                .then($scope.prepareScopeWithModel)
+                .then(function () {
 
-            AaiService.runNamedQuery($scope.namedQueryId, $scope.globalCustomerId, $scope.serviceType, $scope.serviceInstanceId,
-                function (response) { //success
-                    $scope.handleInitialResponseInventoryItems(response);
-                    $scope.setProgress(100); // done
-                    $scope.status = FIELD.STATUS.DONE;
-                    $scope.isSpinnerVisible = false;
-                },
-                function (response) { //failure
-                    $scope.showError(FIELD.ERROR.AAI);
-                    $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_INSTANCE_DATA + response.status;
-                    $scope.errorDetails = response.data;
-                }
-            );
+                    $scope.namedQueryId = VIDCONFIGURATION.COMPONENT_LIST_NAMED_QUERY_ID;
+                    $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;
 
-        }
+                    return AaiService.runNamedQuery($scope.namedQueryId, $scope.globalCustomerId, $scope.serviceType, $scope.serviceInstanceId,
+                        function (response) { //success
+                            $scope.handleInitialResponseInventoryItems(response);
+                            $scope.setProgress(100); // done
+                            $scope.status = FIELD.STATUS.DONE;
+                            $scope.isSpinnerVisible = false;
+                            //TODO
+                        },
+                        function (response) { //failure
+                            $scope.showError(FIELD.ERROR.AAI);
+                            $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_INSTANCE_DATA + response.status;
+                            $scope.errorDetails = response.data;
+                        }
+                    )
+                })
+        };
 
         $scope.handleServerError = function (response, status) {
             alert(response.statusText);
         }
 
+        function handleGetRelatedInstanceGroupsResponseForVnf(response, genericVnf) {
+            _.forEach(response.data, function (instanceGroup) {
+                var newInstanceGroup = {
+                    name: instanceGroup.name,
+                    type: instanceGroup.type
+                };
+                genericVnf.instanceGroups.push(newInstanceGroup);
+            })
+        }
+
+
+
         function getModelVersionIdForServiceInstance(instance) {
             if (UtilityService.hasContents(instance.aaiModelVersionId)) {
                 return $q.resolve(instance.aaiModelVersionId);
+            } else if ($scope.modelVersionIdForServiceInstance
+                && $scope.modelVersionIdForServiceInstance.globalCustomerId === instance.globalCustomerId
+                && $scope.modelVersionIdForServiceInstance.serviceInstanceId === instance.serviceInstanceId
+            ) {
+                return $q.resolve($scope.modelVersionIdForServiceInstance.aaiModelVersionId);
             } else {
-                return AaiService.getModelVersionId(instance.globalCustomerId, instance.serviceInstanceId);
+                $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;
+                return AaiService.getModelVersionId(instance.globalCustomerId, instance.serviceInstanceId)
+                    .then(function (aaiModelVersionId) {
+                        $scope.modelVersionIdForServiceInstance = {
+                            globalCustomerId: instance.globalCustomerId,
+                            serviceInstanceId: instance.serviceInstanceId,
+                            aaiModelVersionId: aaiModelVersionId
+                        };
+                        return $q.resolve(aaiModelVersionId);
+                    });
             }
         }
 
@@ -529,6 +623,7 @@
                     COMPONENT.SUBSCRIBERNAME_SUB_PATH + disData.subscriberName +
                     COMPONENT.SERVICETYPE_SUB_PATH + disData.serviceType +
                     COMPONENT.SERVICEINSTANCEID_SUB_PATH + disData.serviceInstanceId +
+                    COMPONENT.MODELVERSIONID_SUB_PATH + disData.aaiModelVersionId +
                     COMPONENT.IS_PERMITTED_SUB_PATH + disData.isPermitted;
             }
         };
@@ -547,13 +642,22 @@
                 method: 'GET',
                 url: pathQuery
             }).then(function successCallback(response) {
-                vidService.setModel(response.data);
-                console.log("aaiSubscriber getAsdcModel DONE!!!!");
-            }, function errorCallback(response) {
+                if (response.headers()['content-type'].includes('json')) {
+                    vidService.setModel(response.data);
+                    console.log("aaiSubscriber getAsdcModel DONE!!!!");
+                } else {
+                    // the response is erroneous
+                    console.log("aaiSubscriber getAsdcModel BAD RESPONSE");
+                    errorCallback(response);
+                    return $q.reject()
+                }
+            }, errorCallback);
+
+            function errorCallback(response) {
                 $log.error("aaiSubscriber getAsdcModel - " + FIELD.ERROR.NO_MATCHING_MODEL_AAI + aaiModelVersionId);
                 $scope.errorMsg = FIELD.ERROR.NO_MATCHING_MODEL_AAI + aaiModelVersionId;
                 alert($scope.errorMsg);
-            });
+            }
         }
 
         function returnMatchingServiceSubscription(serviceSubs, serviceId){
@@ -580,15 +684,20 @@
                 });
         }
 
+        $scope.isConfigurationDataAvailiable = function (configuration) {
+            $log.debug(configuration);
+            return configuration.configData && (!configuration.configData.errorDescription);
+        }
+
         $scope.isActivateDeactivateEnabled = function(btnType) {
-            if ($scope.serviceOrchestrationStatus && $scope.service.model.service.serviceType.toLowerCase().indexOf('transport') != -1) {
+            if ($scope.serviceOrchestrationStatus) {
+                var status = $scope.serviceOrchestrationStatus.toLowerCase();
                 switch (btnType) {
                     case "activate":
-                        return $scope.serviceOrchestrationStatus === 'Created' ||
-                            $scope.serviceOrchestrationStatus.toLowerCase() === 'pendingdelete' || $scope.serviceOrchestrationStatus.toLowerCase() === 'pending-delete';
+                        return _.includes(COMPONENT.ACTIVATE_SERVICE_STATUSES, status);
                         break;
                     case "deactivate":
-                        return $scope.serviceOrchestrationStatus === 'Active';
+                        return status === 'active';
                         break;
                 }
             }
@@ -596,6 +705,58 @@
             return false;
         };
 
+        $scope.isShowVerifyService = function () {
+            return featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_SHOW_VERIFY_SERVICE);
+        }
+
+        $scope.isEnableVerifyService = function () {
+            //Button should only be enabled when the service type is A la carte
+            if (DataService.getALaCarte()) {
+                return $scope.verifyButtonEnabled;
+            }
+            return false;
+        };
+
+        $scope.activateVerifyService = function () {
+            $scope.verifyButtonEnabled = false;
+            let url = COMPONENT.VERIFY_SERVICE_URL;
+
+            let config = {
+                headers: {
+                    'Content-Type': 'application/json'
+                }
+            };
+
+            let data = {
+                "serviceInstanceList": [
+                    {
+                        "serviceInstanceId": $scope.serviceInstanceId,
+                        "modelVersionId": $scope.service.model.service.uuid,
+                        "modelInvariantId": $scope.service.model.service.invariantUuid,
+                        "customerId": $scope.globalCustomerId,
+                        "serviceType": $scope.service.instance.serviceType,
+                    }
+                ]
+            };
+            AaiService.postPOMBAverificationRequest(url, data, config);
+
+        };
+
+        $scope.isShowAssignmentsEnabled = function () {
+            if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_SHOW_ASSIGNMENTS)) {
+                if ($scope.serviceOrchestrationStatus) {
+                    return $scope.serviceOrchestrationStatus.toLowerCase() === 'assigned';
+                }
+            }
+            return false;
+        };
+
+        $scope.isResumeShown = function (status) {
+            var vfModuleStatus = status.toLowerCase();
+            var serviceStatus = $scope.serviceOrchestrationStatus && $scope.serviceOrchestrationStatus.toLowerCase();
+            return _.includes(['pendingactivation', 'assigned'], vfModuleStatus) && !$scope.isActivateDeactivateEnabled("activate");
+        };
+
         $scope.handleInitialResponseInventoryItems = function (response) {
 
             $scope.inventoryResponseItemList = response.data[FIELD.ID.INVENTORY_RESPONSE_ITEM]; // get data from json
@@ -642,6 +803,7 @@
                         "configurations": []
                     };
 
+                    var portMirroringConfigurationIds = [];
                     if (inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {
 
                         angular.forEach(inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subInventoryResponseItem, key) {
@@ -693,12 +855,23 @@
                                     "nodeType": genericVnfObject[FIELD.ID.VNF_TYPE],
                                     "nodeId": genericVnfObject[FIELD.ID.VNF_ID],
                                     "nodeStatus": genericVnfObject[FIELD.ID.ORCHESTRATION_STATUS],
+                                    "modelVersionId" : genericVnfObject[FIELD.ID.MODEL_VERSION_ID],
                                     "object": genericVnfObject,
                                     "vfModules": [],
                                     "volumeGroups": [],
+                                    "instanceGroups": [],
                                     "availableVolumeGroups": []
                                 };
+                                if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_VLAN_TAGGING_VIEW_EDIT)) {
+
+                                    //TODO should be changed after integration
+                                    genericVnf["instanceGroups"] = [{"name":"a2"}];
+
+                                }
                                 $scope.service.instance[FIELD.ID.VNFS].push(genericVnf);
+                                getRelatedInstanceGroupsByVnfId(genericVnf);
+
+
 
                                 // look for volume-groups
                                 if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {
@@ -787,6 +960,7 @@
                                 }
                             }
 
+
                             if (subInventoryResponseItem[FIELD.ID.GENERIC_CONFIGURATION] != null) {
                                 var configObject = subInventoryResponseItem[FIELD.ID.GENERIC_CONFIGURATION];
                                 var config = {
@@ -800,36 +974,60 @@
                                     "modelVersionId": configObject[FIELD.ID.MODEL_VERSION_ID],
                                     "modelCustomizationId": configObject[FIELD.ID.MODEL_CUSTOMIZATION_ID],
                                     "object": configObject,
-                                    "ports": []
+                                    "ports": [],
+                                    "configData" : null
                                 };
+                                portMirroringConfigurationIds.push(configObject[FIELD.ID.CONFIGURATION_ID]);
 
                                 $scope.allowConfigurationActions = [FIELD.STATUS.AAI_ACTIVE, FIELD.STATUS.AAI_INACTIVE, FIELD.STATUS.AAI_CREATED].indexOf(config.nodeStatus) != -1;
 
-                                if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {
-                                    angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subSubInventoryResponseItem, key) {
-                                        var port = {};
-                                        var portObject;
-                                        if (subSubInventoryResponseItem[FIELD.ID.PORT] != null) {
-                                            portObject = subSubInventoryResponseItem[FIELD.ID.PORT];
-                                            port = {
-                                                "portId": portObject[FIELD.ID.PORT_ID],
-                                                "portName": portObject[FIELD.ID.PORT_NAME],
-                                                "portStatus": portObject[FIELD.ID.PORT_MIRRORED] === true ? FIELD.STATUS.AAI_ENABLED : FIELD.ID.AAI_DISABLED,
-                                                "object": portObject
-                                            };
-                                            config.ports.push(port);
-                                        }
-                                    });
-                                }
                                 $scope.service.instance[FIELD.ID.CONFIGURATIONS].push(config);
                             }
 
                         });
+
+                        AaiService.getPortMirroringData(portMirroringConfigurationIds).then(function(result){
+                           angular.forEach($scope.service.instance[FIELD.ID.CONFIGURATIONS], function(config){
+                                config['configData'] = result.data[config['nodeId']]
+
+                               if (config.configData && config.configData.errorDescription) {
+                                   $scope.errorMsg = ($scope.errorMsg ? $scope.errorMsg + "\n" : "") +
+                                       "Cannot read cloud-region for configuration \"" + config.name + "\": " +
+                                       config.configData.errorDescription;
+                               }
+                           });
+                        });
+
+                        AaiService.getPortMirroringSourcePorts(portMirroringConfigurationIds).then(function(result){
+                           angular.forEach($scope.service.instance[FIELD.ID.CONFIGURATIONS], function(config){
+                                angular.forEach(result.data[config['nodeId']], function(port){
+                                   if (port.errorDescription) {
+                                       $scope.errorMsg = ($scope.errorMsg ? $scope.errorMsg + "\n" : "") +
+                                           "Cannot read a source port for configuration \"" + config.name + "\": " +
+                                           port.errorDescription;
+                                   } else {
+                                       config.ports.push({
+                                           "portId": port[FIELD.ID.PORT_ID],
+                                           "portName": port[FIELD.ID.PORT_NAME],
+                                           "portStatus": port[FIELD.ID.PORT_MIRRORED] === true ? FIELD.STATUS.AAI_ENABLED : FIELD.STATUS.AAI_DISABLED
+                                       });
+                                   }
+                               });
+                           });
+                        });
+
                     }
                 });
+
             });
+
+
+
         }
 
+
+
+
         $scope.handleInitialResponse = function (response) {
             try {
                 $scope.enableCloseButton(true);
@@ -977,7 +1175,7 @@
                 });
         };
 
-        var activateDeactivateServiceInstance = function(msoType) {
+        var activateDeactivateServiceInstance = function (msoType) {
             var requestParams = {
                 model: $scope.service.model,
                 instance: $scope.service.instance
@@ -997,73 +1195,111 @@
             }
         };
 
-        $scope.activateMSOInstance = function() {
+        $scope.showAssignmentsSDNC = function () {
+
+            if ($scope.service && $scope.service.instance) {
+                return VIDCONFIGURATION.SDNC_SHOW_ASSIGNMENTS_URL.replace("<SERVICE_INSTANCE_ID>" , $scope.service.instance.id);
+            }
+            return null;
+        };
+
+        $scope.activateMSOInstance = function () {
 
             activateDeactivateServiceInstance(COMPONENT.MSO_ACTIVATE_SERVICE_REQ);
         };
 
-        $scope.deactivateMSOInstance = function() {
+        $scope.deactivateMSOInstance = function () {
 
             activateDeactivateServiceInstance(COMPONENT.MSO_DEACTIVATE_SERVICE_REQ);
         };
 
-        $scope.toggleConfigurationStatus = function (serviceObject, configuration) {
 
-
+        $scope.deleteConfiguration = function (serviceObject, configuration) {
             AaiService.getLoggedInUserID(function (response) {
-                    DataService.setLoggedInUserId(response.data);
-                    var requestParams = {
-                        serviceModel: {
-                            "modelType": "service",
-                            "modelInvariantId": serviceObject.model.service.invariantUuid,
-                            "modelVersionId": "uuid",
-                            "modelName": serviceObject.model.service.name,
-                            "modelVersion": serviceObject.model.service.version
-                        },
-                        configurationModel: {
-                            "modelType": "configuration",
-                            "modelInvariantId": configuration.modelInvariantId,
-                            "modelVersionId": configuration.modelVersionId,
-                            "modelCustomizationId": configuration.modelCustomizationId
-                        },
-                        serviceInstanceId: serviceObject.instance.serviceInstanceId,
-                        configurationId: configuration.nodeId,
-                        configStatus: configuration.nodeStatus,
-                        userId: DataService.getLoggedInUserId()
-                    };
+                DataService.setLoggedInUserId(response.data);
+                var requestParams = {
+                    serviceModel: {
+                        "modelType": "configuration",
+                        "modelInvariantId": serviceObject.model.service.invariantUuid,
+                        "modelVersionId": serviceObject.model.service.uuid,
+                        "modelName": serviceObject.model.service.name,
+                        "modelVersion": serviceObject.model.service.version
+                    },
+                    configurationModel: {
+                        "modelType": "configuration",
+                        "modelInvariantId": configuration.modelInvariantId,
+                        "modelVersionId": configuration.modelVersionId,
+                        "modelCustomizationId": configuration.modelCustomizationId
+                    },
+                    serviceInstanceId: serviceObject.instance.serviceInstanceId,
+                    configurationId: configuration.nodeId,
+                    configStatus: configuration.DELETE,
+                    userId: DataService.getLoggedInUserId()
+                };
 
-                    openMsoModal(COMPONENT.MSO_CHANGE_CONFIG_STATUS_REQ, requestParams);
-             });
+                openMsoModal(COMPONENT.MSO_DELETE_CONFIGURATION_REQ, requestParams, configuration);
+            });
 
         };
 
-        $scope.togglePortStatus = function(serviceObject, configuration, port) {
+        $scope.toggleConfigurationStatus = function (serviceObject, configuration) {
+            AaiService.getLoggedInUserID(function (response) {
+                DataService.setLoggedInUserId(response.data);
+                var requestParams = {
+                    serviceModel: {
+                        "modelType": "service",
+                        "modelInvariantId": serviceObject.model.service.invariantUuid,
+                        "modelVersionId": serviceObject.model.service.uuid,
+                        "modelName": serviceObject.model.service.name,
+                        "modelVersion": serviceObject.model.service.version
+                    },
+                    configurationModel: {
+                        "modelType": "configuration",
+                        "modelInvariantId": configuration.modelInvariantId,
+                        "modelVersionId": configuration.modelVersionId,
+                        "modelCustomizationId": configuration.modelCustomizationId
+                    },
+                    serviceInstanceId: serviceObject.instance.serviceInstanceId,
+                    configurationId: configuration.nodeId,
+                    configStatus: configuration.nodeStatus,
+                    userId: DataService.getLoggedInUserId()
+                };
 
-            var requestParams = {
-                serviceInstanceId: serviceObject.instance.serviceInstanceId,
-                configurationId: configuration.nodeId,
-                portId: port.portId,
-                portStatus: port.portStatus,
-                serviceModel: {
-                    "modelType": "service",
-                    "modelInvariantId": serviceObject.model.service.invariantUuid,
-                    "modelVersionId": "uuid",
-                    "modelName": serviceObject.model.service.name,
-                    "modelVersion": serviceObject.model.service.version
-                },
-                configurationModel: {
-                    "modelType": "configuration",
-                    "modelInvariantId": configuration.modelInvariantId,
-                    "modelVersionId": configuration.modelVersionId,
-                    "modelCustomizationId": configuration.modelCustomizationId
-                },
-                userId: DataService.getLoggedInUserId()
-            };
+                openMsoModal(COMPONENT.MSO_CHANGE_CONFIG_STATUS_REQ, requestParams, configuration);
+            });
 
-            openMsoModal(COMPONENT.MSO_CHANGE_PORT_STATUS_REQ, requestParams);
         };
 
-        $scope.dissociatePnf = function(pnfName) {
+        $scope.togglePortStatus = function (serviceObject, configuration, port) {
+            AaiService.getLoggedInUserID(function (response) {
+                DataService.setLoggedInUserId(response.data);
+
+                var requestParams = {
+                    serviceInstanceId: serviceObject.instance.serviceInstanceId,
+                    configurationId: configuration.nodeId,
+                    portId: port.portId,
+                    portStatus: port.portStatus,
+                    serviceModel: {
+                        "modelType": "service",
+                        "modelInvariantId": serviceObject.model.service.invariantUuid,
+                        "modelVersionId": serviceObject.model.service.uuid,
+                        "modelName": serviceObject.model.service.name,
+                        "modelVersion": serviceObject.model.service.version
+                    },
+                    configurationModel: {
+                        "modelType": "configuration",
+                        "modelInvariantId": configuration.modelInvariantId,
+                        "modelVersionId": configuration.modelVersionId,
+                        "modelCustomizationId": configuration.modelCustomizationId
+                    },
+                    userId: DataService.getLoggedInUserId()
+                };
+
+                openMsoModal(COMPONENT.MSO_CHANGE_PORT_STATUS_REQ, requestParams, configuration);
+            });
+        };
+
+        $scope.dissociatePnf = function (pnfName) {
 
             var jobInfo = {
                 status: "confirm",
@@ -1098,12 +1334,14 @@
                     };
 
                     if (DataService.getLoggedInUserId()) {
+                        requestParams.userId = DataService.getLoggedInUserId();
                         requestParams.attuuid = DataService.getLoggedInUserId();
                         openMsoModal(COMPONENT.MSO_REMOVE_RELATIONSHIP, requestParams);
                     } else {
                         AaiService.getLoggedInUserID(function (response) {
                             DataService.setLoggedInUserId(response.data);
 
+                            requestParams.userId = response.data;
                             requestParams.attuuid = response.data;
                             openMsoModal(COMPONENT.MSO_REMOVE_RELATIONSHIP, requestParams);
                         });
@@ -1114,35 +1352,38 @@
 
         };
 
-        var openMsoModal = function (msoType, requestParams) {
+        var openMsoModal = function (msoType, requestParams, configuration) {
             var modalInstance = $uibModal.open({
                 templateUrl: 'app/vid/scripts/modals/mso-commit/mso-commit.html',
-                controller : "msoCommitModalController",
+                controller: "msoCommitModalController",
                 backdrop: false,
                 resolve: {
                     msoType: function () {
                         return msoType;
                     },
-                    requestParams: function() {
+                    requestParams: function () {
                         requestParams.callbackFunction = updateViewCallbackFunction;
                         return requestParams;
+                    },
+                    configuration: function () {
+                        return configuration;
                     }
                 }
             });
         };
 
-        var updateViewCallbackFunction = function(response) {
+        var updateViewCallbackFunction = function (response) {
             $scope.callbackResults = "";
             var color = FIELD.ID.COLOR_NONE;
             $scope.callbackStyle = {
-                "background-color" : color
+                "background-color": color
             };
 
             /*
              * This 1/2 delay was only added to visually highlight the status
              * change. Probably not needed in the real application code.
              */
-            $timeout(function() {
+            $timeout(function () {
                 $scope.callbackResults = UtilityService.getCurrentTime()
                     + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;
                 if (response.isSuccessful) {
@@ -1152,7 +1393,7 @@
                     color = FIELD.ID.COLOR_F88;
                 }
                 $scope.callbackStyle = {
-                    "background-color" : color
+                    "background-color": color
                 };
             }, 500);
         };
@@ -1198,7 +1439,8 @@
                     }
                 }
             };
-    }]).directive('restrictInput', function () {
+    }
+]).directive('restrictInput', function () {
 
     return {
 
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/change-management.controller.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/change-management.controller.js
index 488ada6..e15ce5f 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/change-management.controller.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/change-management.controller.js
@@ -8,6 +8,7 @@
 
         vm.lastTimeUpdated = "";
         vm.hasScheduler = !!VIDCONFIGURATION.SCHEDULER_PORTAL_URL;
+        vm.currModal = null;
 
         vm.init = function() {
             vm.lastTimeUpdated = $filter('date')(new Date(), "MM/dd/yyyy | HH:mm:ss");
@@ -15,11 +16,31 @@
             loadSchedulerChangeManagements();
         };
 
+        var fuseMsoAndSchedulerTaks = function() {
+            if (vm.changeManagements && vm.pendingChangeManagements) {
+                var requestIdToVnfName = {}
+                vm.pendingChangeManagements.forEach(function(schedulerItem) {
+                    if (schedulerItem.msoRequestId && schedulerItem.vnfName) {
+                        requestIdToVnfName[schedulerItem.msoRequestId] = schedulerItem.vnfName;
+                    }
+                })
+                $log.debug("requestIdToVnfName", requestIdToVnfName);
+
+                vm.changeManagements = vm.changeManagements.map(function(msoItem) {
+                    msoItem['vnfNameFromScheduler'] = requestIdToVnfName[msoItem.requestId];
+                    return msoItem;
+                })
+            }
+        };
+
         var loadMSOChangeManagements = function() {
             changeManagementService.getMSOChangeManagements()
                 .then(function(response) {
                     vm.changeManagements = response.data;
                 })
+                .then(function () {
+                    fuseMsoAndSchedulerTaks();
+                })
                 .catch(function (error) {
                     $log.error(error);
                 });
@@ -43,12 +64,16 @@
                         }
                     });
                 })
+                .then(function () {
+                    fuseMsoAndSchedulerTaks();
+                })
                 .catch(function(error) {
                     $log.error(error);
                 });
         };
 
         vm.createNewChange = function() {
+            vm.closeCurrentModalIfOpen();
             var modalInstance = $uibModal.open({
                 templateUrl: 'app/vid/scripts/modals/new-change-management/new-change-management.html',
                 controller: 'newChangeManagementModalController',
@@ -56,6 +81,8 @@
                 resolve: {}
             });
 
+            vm.currModal = modalInstance;
+
             modalInstance.result.then(function (result) {
                 console.log("This is the result of the new change management modal.", result);
             });
@@ -65,29 +92,18 @@
             console.log("function for searching changes: " + vm.searchChangesTerm)
         };
 
-        vm.openFailedModal = function(jobInfo) {
+
+        vm.openManualTasksPopup = function($event, jobInfo, templateUrl, message) {
+
+            vm.closeCurrentModalIfOpen();
+
             var modalInstance = $uibModal.open({
-                templateUrl: 'app/vid/scripts/modals/failed-change-management/failed-change-management.html',
+                templateUrl: templateUrl,
                 controller: 'changeManagementManualTasksController',
                 controllerAs: 'vm',
-                resolve: {
-                    jobInfo: function () {
-                        return jobInfo;
-                    }
-                },
-
-            });
-
-            modalInstance.result.then(function (result) {
-                console.log("This is the result of the failed change management modal.", result);
-            });
-        };
-
-        vm.openInProgressModal = function(jobInfo) {
-            var modalInstance = $uibModal.open({
-                templateUrl: 'app/vid/scripts/modals/in-progress-modal-management/in-progress-change-management.html',
-                controller: 'changeManagementManualTasksController',
-                controllerAs: 'vm',
+                backdrop: false,
+                animation: true,
+                appendTo: angular.element($event.currentTarget).parent(),
                 resolve: {
                     jobInfo: function () {
                         return jobInfo;
@@ -96,31 +112,38 @@
             });
 
             modalInstance.result.then(function (result) {
-                console.log("This is the result of the in progress change management modal.", result);
-            });
-        };
-
-        vm.openAlertModal = function(jobInfo) {
-            var modalInstance = $uibModal.open({
-                templateUrl: 'app/vid/scripts/modals/alert-change-management/alert-change-management.html',
-                controller: 'changeManagementManualTasksController',
-                controllerAs: 'vm',
-                resolve: {
-                    jobInfo: function () {
-                        return jobInfo;
-                    }
-                }
+                console.log(message, result);
             });
 
-            modalInstance.result.then(function (result) {
-                console.log("This is the result of the alert change management modal.", result);
-            });
+            vm.currModal = modalInstance;
         };
+
+        vm.openFailedModal = function($event, jobInfo) {
+            vm.openManualTasksPopup($event, jobInfo,
+                'app/vid/scripts/modals/failed-change-management/failed-change-management.html',
+                "This is the result of the failed change management modal.")
+        };
+
+        vm.openInProgressModal = function($event, jobInfo) {
+            vm.openManualTasksPopup($event, jobInfo,
+                'app/vid/scripts/modals/in-progress-modal-management/in-progress-change-management.html',
+                "This is the result of the in progress change management modal.")
+        };
+
+        vm.openAlertModal = function($event, jobInfo) {
+            vm.openManualTasksPopup($event, jobInfo,
+                'app/vid/scripts/modals/alert-change-management/alert-change-management.html',
+                "This is the result of the alert change management modal.")
+        };
+
         vm.openBasicAlertModal = function(jobInfo) {
+            vm.closeCurrentModalIfOpen();
             var modalInstance = $uibModal.open({
                 templateUrl: 'app/vid/scripts/modals/alert-modal/alert-modal.html',
                 controller: 'alertModalController',
                 controllerAs: 'vm',
+                backdrop: false,
+                animation: true,
                 appendTo: angular.element(".jobs-table").eq(0),
                 resolve: {
                     jobInfo: function () {
@@ -128,12 +151,16 @@
                     }
                 }
             });
+            vm.currModal = modalInstance;
 
             modalInstance.result.then(function (result) {
                 console.log("This is the result of the alert change management modal.", result);
             });
         };
         vm.openPendingModal = function($event, changeManagement) {
+
+            vm.closeCurrentModalIfOpen();
+
             var modalInstance = $uibModal.open({
                 templateUrl: 'app/vid/scripts/modals/cancel-pending-workflow/cancel-pending-workflow.html',
                 controller: 'cancelPendingWorkflowController',
@@ -148,6 +175,8 @@
                 }
             });
 
+            vm.currModal = modalInstance;
+
             modalInstance.result.then(function (result) {
                 // send to service
              if(result){
@@ -173,6 +202,16 @@
             }});
 
         };
+        vm.isChangeManagementDeleted = function(changeManagement) {
+            return changeManagement.scheduleRequest.status!=='Deleted'
+        };
+
+        vm.closeCurrentModalIfOpen = function() {
+            if (vm.currModal != null) {
+                vm.currModal.close();
+                vm.currModal = null;
+            }
+        }
 
 
         vm.init();
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/creationDialogController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/creationDialogController.js
index 3d8cba5..e8fa529 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/creationDialogController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/creationDialogController.js
@@ -20,331 +20,357 @@
 
 "use strict";
 
-var creationDialogController = function( COMPONENT, FIELD, PARAMETER, $scope, $http, $timeout, $log,
-		CreationService, UtilityService, DataService,VIDCONFIGURATION) {
+var creationDialogController = function (COMPONENT, FIELD, PARAMETER, $scope, $http, $timeout, $log,
+                                         CreationService, UtilityService, DataService, VIDCONFIGURATION, $location) {
 
-	$scope.isDialogVisible = false;
-	$scope.summaryControl = {};
-	$scope.userProvidedControl = {};
+    $scope.isDialogVisible = false;
+    $scope.summaryControl = {};
+    $scope.userProvidedControl = {};
 
-	var callbackFunction = undefined;
-	var componentId = undefined;
+    var callbackFunction = undefined;
+    var componentId = undefined;
 
-	$scope.$on(COMPONENT.CREATE_COMPONENT, function(event, request) {
+    $scope.shouldShowOldPopup = function () {
+        return DataService.getALaCarte() || DataService.getShouldExcludeMacroFromAsyncInstatiationFlow()
+    };
 
-		$scope.isSpinnerVisible = true;
-		$scope.isErrorVisible = false;
-		$scope.isDataVisible = false;
-		$scope.isConfirmEnabled = false;
-		$scope.isDialogVisible = true;
-		$scope.popup.isVisible = true;
+    function receiveMessage(event) {
+        if (event.data == 'closeIframe') {
+            window.removeEventListener("message", receiveMessage, false);
 
-		callbackFunction = request.callbackFunction;
-		componentId = request.componentId;
-		CreationService.initializeComponent(request.componentId);
+            $scope.cancel();
+        }
+        else if (event.data.eventId == 'submitIframe') {
+            {
+                $location.path('/servicePlanning').search({serviceModelId: event.data.data.serviceModelId});
+            }
+        }
+        $scope.$apply();
+    }
 
-		CreationService.setHttpErrorHandler(function(response) {
-			showError(FIELD.ERROR.SYSTEM_FAILURE, UtilityService
-					.getHttpErrorMessage(response));
-		});
+    $scope.$on(COMPONENT.CREATE_COMPONENT, function (event, request) {
+        $scope.isSpinnerVisible = true;
+        $scope.isErrorVisible = false;
+        $scope.isDataVisible = false;
+        $scope.isConfirmEnabled = false;
+        $scope.isDialogVisible = true;
+        $scope.popup.isVisible = true;
 
-		$scope.componentName = CreationService.getComponentDisplayName();
 
-		CreationService.getParameters(handleGetParametersResponse);
+        if (!$scope.shouldShowOldPopup()) {
+            $scope.url = COMPONENT.SERVICE_POPUP_IFRAME_URL + request.modelNameVersionId + "&isCreate=true&r=" + Math.random();
+            window.addEventListener("message", receiveMessage, false);
 
-	});
+        }
+        else {
+            callbackFunction = request.callbackFunction;
+            componentId = request.componentId;
+            CreationService.initializeComponent(request.componentId);
 
-	var handleGetParametersResponse = function(parameters) {
-		$scope.summaryControl.setList(parameters.summaryList);
-		$scope.userProvidedControl.setList(parameters.userProvidedList);
+            CreationService.setHttpErrorHandler(function (response) {
+                showError(FIELD.ERROR.SYSTEM_FAILURE, UtilityService
+                    .getHttpErrorMessage(response));
+            });
 
-		$scope.isSpinnerVisible = false;
-		$scope.isDataVisible = true;
-		$scope.isConfirmEnabled = true;
-	};
-	
-	var validateInstanceName = function(iname) {
-		var patt1 = /^([a-z])+([0-9a-z\-_\.]*)$/i;
-		
-		if ( iname == null ){
-			return false;
-		}
-		if ( !iname.match(patt1) ) {
-			return false;
-		}
-		return true;
-	};
-	var validateMap = function(mname) {
-		var patt1 = /^{(\s*\w+\s*:\s*\w+\s*)(\s*,\s*\w+\s*:\s*\w+\s*)*}$/im;
-		if ( mname == null ){
-			return true;
-		}
-		if ( !mname.match(patt1) ) {
-			return false;
-		}
-		return true;
-	};
-	
-	var validateList = function(lname) {
-		var patt1 = /^\[(\s*\w+\s*)(\s*,\s*\w+\s*)*\]$/i;
-		if ( lname == null ){
-			return true;
-		}
-		if ( !lname.match(patt1) ) {
-			return false;
-		}
-		return true;
-	};
-		
-	$scope.userParameterChanged = function(id) {
-		CreationService.updateUserParameterList(id, $scope.userProvidedControl);
-	}
+            $scope.componentName = CreationService.getComponentDisplayName();
 
-	$scope.confirm = function() {
+            CreationService.getParameters(handleGetParametersResponse);
+        }
 
-		var requiredFields = $scope.userProvidedControl.getRequiredFields();
-		if (requiredFields !== "") {
-			showError(FIELD.ERROR.MISSING_DATA, requiredFields);
-			return;
-		}
-		
-		var isUploadAvailable = false;
-		var uploadIndex =0;
-		var paramList = $scope.userProvidedControl.getList();
-		var isAnyError = false;
-		for (var i = 0; i < paramList.length; i++) {
-			if (paramList[i].id === FIELD.ID.SUPPLEMENTORY_DATA_FILE) {
-				isUploadAvailable = true;
-				uploadIndex=i;
-			}
-			if (paramList[i].id === FIELD.ID.UPLOAD_SUPPLEMENTORY_DATA_FILE && paramList[i].value && document.getElementById(FIELD.ID.SUPPLEMENTORY_DATA_FILE).value=='' ) {
-				isAnyError = true;
-			}
-		}
-		
-		if(isUploadAvailable && isAnyError ){
-			showError(FIELD.ERROR.MISSING_DATA, FIELD.ERROR.MISSING_FILE);
-			return;
-		}else if(isUploadAvailable && document.getElementById(FIELD.ID.SUPPLEMENTORY_DATA_FILE).value!='' ){
-			var errorMsg = "";
-			var fileInput = document.getElementById(FIELD.ID.SUPPLEMENTORY_DATA_FILE);
-			var file = fileInput.files[0];
-			var reader = new FileReader();
-			reader.onload = function(e) {
-				try{
-					paramList[uploadIndex].value = JSON.parse(reader.result);
-					FIELD.PARAMETER.SUPPLEMENTORY_DATA_FILE['value'] = paramList[uploadIndex].value;
-					
-					var instanceName = "";
+    });
 
-					if ( DataService.getALaCarte() ) {
-						if ( paramList != null ) {
-							for (var i = 0; i < paramList.length; i++) {
-								if (paramList[i].id === FIELD.ID.INSTANCE_NAME) {
-									instanceName = paramList[i].value;
-									break;
-								}
-							}
-						}
-						var isValid = validateInstanceName (instanceName);
-						if ( isValid ) {
-							$scope.isErrorVisible = false;
-						} else {
-							showError(FIELD.ERROR.INVALID_INSTANCE_NAME + instanceName, 
-									FIELD.ERROR.INSTANCE_NAME_VALIDATE);
-							return;
-						}
-					}
-					var arbitraryParametersList = DataService.getArbitraryParameters();
-					var p = null;
-					if (UtilityService.hasContents (arbitraryParametersList)) {
-						for (var i = 0; i < arbitraryParametersList.length; i++) {
-							p = arbitraryParametersList[i];
-							if (p.type === PARAMETER.MAP) {
-								//validate a map: { <entry_key_1>: <entry_value_1>, ... , <entry_key_n>: <entry_value_n> }
-								// need to find the value in paramList
-								for (var j = 0; j < paramList.length; j++) {
-									if (paramList[j].id === p.id) {
-										p.value = paramList[j].value;
-										var isValid = validateMap (p.value);
-										if ( isValid ) {
-											$scope.isErrorVisible = false;
-											break;
-										} 
-										else {
-											showError(FIELD.ERROR.INVALID_MAP + p.id, 
-													FIELD.ERROR.MAP_VALIDATE);
-											return;
-										}	
-									}
-								}
-							} else if (p.type === PARAMETER.LIST) {
-								//validate a list: { value or a list of comma separated values }
-								// need to find the value in paramList
-								for (var j = 0; j < paramList.length; j++) {
-									if (paramList[j].id === p.id) {
-										p.value = paramList[j].value;
-										var isValid = validateList (p.value);
-										if ( isValid ) {
-											$scope.isErrorVisible = false;
-											break;
-										} 
-										else {
-											showError(FIELD.ERROR.INVALID_LIST + p.id, 
-													FIELD.ERROR.LIST_VALIDATE);
-											return;
-										}	
-									}
-								}
-							}
-						}
-					}
-					var requestDetails = CreationService
-							.getMsoRequestDetails($scope.userProvidedControl.getList());
+    var handleGetParametersResponse = function (parameters) {
+        $scope.summaryControl.setList(parameters.summaryList);
+        $scope.userProvidedControl.setList(parameters.userProvidedList);
 
-					$scope.isDialogVisible = false;
+        $scope.isSpinnerVisible = false;
+        $scope.isDataVisible = true;
+        $scope.isConfirmEnabled = true;
+    };
 
-					$scope.$broadcast(COMPONENT.MSO_CREATE_REQ, {
-						url : CreationService.getMsoUrl(),
-						requestDetails : requestDetails,
-						componentId: componentId,
-						callbackFunction : function(response) {
-							if (response.isSuccessful) {
-								$scope.popup.isVisible = false;
-								runCallback(response);
-							} else {
-								$scope.isDialogVisible = false;
-								$scope.popup.isVisible = false;
-							}
-						}
-					});
-					
-				}catch(e){
-				errorMsg = errorMsg+ FIELD.ERROR.INVALID_DATA_FORMAT;
-			}
-			if (errorMsg !== "") {
-				showError(FIELD.ERROR.SYSTEM_FAILURE, errorMsg);
-				return;
-			}
-			}
-			reader.readAsText(file);
-		}else{
-	
-			var paramList = $scope.userProvidedControl.getList();
-			var instanceName = "";
+    var validateInstanceName = function (iname) {
+        var patt1 = /^([a-z])+([0-9a-z\-_\.]*)$/i;
 
-			if ( DataService.getALaCarte() ) {
-				if ( paramList != null ) {
-					for (var i = 0; i < paramList.length; i++) {
-						if (paramList[i].id === FIELD.ID.INSTANCE_NAME) {
-							instanceName = paramList[i].value;
-							break;
-						}
-					}
-				}
-				var isValid = validateInstanceName (instanceName);
-				if ( isValid ) {
-					$scope.isErrorVisible = false;
-				} else {
-					showError(FIELD.ERROR.INVALID_INSTANCE_NAME + instanceName, 
-							FIELD.ERROR.INSTANCE_NAME_VALIDATE);
-					return;
-				}
-			}
-			var arbitraryParametersList = DataService.getArbitraryParameters();
-			var p = null;
-			if (UtilityService.hasContents (arbitraryParametersList)) {
-				for (var i = 0; i < arbitraryParametersList.length; i++) {
-					p = arbitraryParametersList[i];
-					if (p.type === PARAMETER.MAP) {
-						//validate a map: { <entry_key_1>: <entry_value_1>, ... , <entry_key_n>: <entry_value_n> }
-						// need to find the value in paramList
-						for (var j = 0; j < paramList.length; j++) {
-							if (paramList[j].id === p.id) {
-								p.value = paramList[j].value;
-								var isValid = validateMap (p.value);
-								if ( isValid ) {
-									$scope.isErrorVisible = false;
-									break;
-								} 
-								else {
-									showError(FIELD.ERROR.INVALID_MAP + p.id, 
-											FIELD.ERROR.MAP_VALIDATE);
-									return;
-								}	
-							}
-						}
-					} else if (p.type === PARAMETER.LIST) {
-						//validate a list: { value or a list of comma separated values }
-						// need to find the value in paramList
-						for (var j = 0; j < paramList.length; j++) {
-							if (paramList[j].id === p.id) {
-								p.value = paramList[j].value;
-								var isValid = validateList (p.value);
-								if ( isValid ) {
-									$scope.isErrorVisible = false;
-									break;
-								} 
-								else {
-									showError(FIELD.ERROR.INVALID_LIST + p.id, 
-											FIELD.ERROR.LIST_VALIDATE);
-									return;
-								}	
-							}
-						}
-					}
-				}
-			}
-			var requestDetails = CreationService
-					.getMsoRequestDetails($scope.userProvidedControl.getList());
+        if (iname == null) {
+            return false;
+        }
+        if (!iname.match(patt1)) {
+            return false;
+        }
+        return true;
+    };
+    var validateMap = function (mname) {
+        var patt1 = /^{(\s*\w+\s*:\s*\w+\s*)(\s*,\s*\w+\s*:\s*\w+\s*)*}$/im;
+        if (mname == null) {
+            return true;
+        }
+        if (!mname.match(patt1)) {
+            return false;
+        }
+        return true;
+    };
 
-			$scope.isDialogVisible = false;
+    var validateList = function (lname) {
+        var patt1 = /^\[(\s*\w+\s*)(\s*,\s*\w+\s*)*\]$/i;
+        if (lname == null) {
+            return true;
+        }
+        if (!lname.match(patt1)) {
+            return false;
+        }
+        return true;
+    };
 
-			$scope.$broadcast(COMPONENT.MSO_CREATE_REQ, {
-				url : CreationService.getMsoUrl(),
-				requestDetails : requestDetails,
-				componentId: componentId,
-				callbackFunction : function(response) {
-					if (response.isSuccessful) {
-						$scope.popup.isVisible = false;
-						runCallback(response);
-					} else {
-						$scope.isDialogVisible = false;
-						$scope.popup.isVisible = false;
-					}
-				}
-			});
-		}
-	}
+    $scope.userParameterChanged = function (id) {
+        CreationService.updateUserParameterList(id, $scope.userProvidedControl);
+    };
 
-	$scope.cancel = function() {
-		$scope.isDialogVisible = false;
-		$scope.popup.isVisible = false;
-		runCallback(false);
-	}
+    $scope.confirm = function () {
 
-	var runCallback = function(response) {
-		if (angular.isFunction(callbackFunction)) {
-			callbackFunction({
-				isSuccessful : response.isSuccessful,
-				control : $scope.userProvidedControl.getList(),
-				instanceId : response.instanceId
-			});
-		}
-	}
+        var requiredFields = $scope.userProvidedControl.getRequiredFields();
+        if (requiredFields !== "") {
+            showError(FIELD.ERROR.MISSING_DATA, requiredFields);
+            return;
+        }
 
-	var showError = function(summary, details) {
-		var message = summary;
-		if (UtilityService.hasContents(details)) {
-			message += " (" + details + ")";
-		}
-		$scope.isSpinnerVisible = false;
-		$scope.isErrorVisible = true;
-		$scope.error = message;
-	}
-	
-}
+        var isUploadAvailable = false;
+        var uploadIndex = 0;
+        var paramList = $scope.userProvidedControl.getList();
+        var isAnyError = false;
+        for (var i = 0; i < paramList.length; i++) {
+            if (paramList[i].id === FIELD.ID.SUPPLEMENTORY_DATA_FILE) {
+                isUploadAvailable = true;
+                uploadIndex = i;
+            }
+            if (paramList[i].id === FIELD.ID.UPLOAD_SUPPLEMENTORY_DATA_FILE && paramList[i].value && document.getElementById(FIELD.ID.SUPPLEMENTORY_DATA_FILE).value == '') {
+                isAnyError = true;
+            }
+        }
 
-appDS2.controller("creationDialogController", [ "COMPONENT", "FIELD", "PARAMETER", "$scope", "$http",
-				"$timeout", "$log", "CreationService", "UtilityService", "DataService","VIDCONFIGURATION",
-				creationDialogController ]);
+        if (isUploadAvailable && isAnyError) {
+            showError(FIELD.ERROR.MISSING_DATA, FIELD.ERROR.MISSING_FILE);
+
+        } else if (isUploadAvailable && document.getElementById(FIELD.ID.SUPPLEMENTORY_DATA_FILE).value != '') {
+            var errorMsg = "";
+            var fileInput = document.getElementById(FIELD.ID.SUPPLEMENTORY_DATA_FILE);
+            var file = fileInput.files[0];
+            var reader = new FileReader();
+            reader.onload = function (e) {
+                try {
+                    paramList[uploadIndex].value = JSON.parse(reader.result);
+                    FIELD.PARAMETER.SUPPLEMENTORY_DATA_FILE['value'] = paramList[uploadIndex].value;
+
+                    var instanceName = "";
+
+                    if (DataService.getALaCarte()) {
+                        if (paramList != null) {
+                            for (var i = 0; i < paramList.length; i++) {
+                                if (paramList[i].id === FIELD.ID.INSTANCE_NAME) {
+                                    instanceName = paramList[i].value;
+                                    break;
+                                }
+                            }
+                        }
+                        var isValid = validateInstanceName(instanceName);
+                        if (isValid) {
+                            $scope.isErrorVisible = false;
+                        } else {
+                            showError(FIELD.ERROR.INVALID_INSTANCE_NAME + instanceName,
+                                FIELD.ERROR.INSTANCE_NAME_VALIDATE);
+                            return;
+                        }
+                    }
+                    var arbitraryParametersList = DataService.getArbitraryParameters();
+                    var p = null;
+                    if (UtilityService.hasContents(arbitraryParametersList)) {
+                        for (var i = 0; i < arbitraryParametersList.length; i++) {
+                            p = arbitraryParametersList[i];
+                            if (p.type === PARAMETER.MAP) {
+                                //validate a map: { <entry_key_1>: <entry_value_1>, ... , <entry_key_n>: <entry_value_n> }
+                                // need to find the value in paramList
+                                for (var j = 0; j < paramList.length; j++) {
+                                    if (paramList[j].id === p.id) {
+                                        p.value = paramList[j].value;
+                                        var isValid = validateMap(p.value);
+                                        if (isValid) {
+                                            $scope.isErrorVisible = false;
+                                            break;
+                                        }
+                                        else {
+                                            showError(FIELD.ERROR.INVALID_MAP + p.id,
+                                                FIELD.ERROR.MAP_VALIDATE);
+                                            return;
+                                        }
+                                    }
+                                }
+                            } else if (p.type === PARAMETER.LIST) {
+                                //validate a list: { value or a list of comma separated values }
+                                // need to find the value in paramList
+                                for (var j = 0; j < paramList.length; j++) {
+                                    if (paramList[j].id === p.id) {
+                                        p.value = paramList[j].value;
+                                        var isValid = validateList(p.value);
+                                        if (isValid) {
+                                            $scope.isErrorVisible = false;
+                                            break;
+                                        }
+                                        else {
+                                            showError(FIELD.ERROR.INVALID_LIST + p.id,
+                                                FIELD.ERROR.LIST_VALIDATE);
+                                            return;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    var requestDetails = CreationService
+                        .getMsoRequestDetails($scope.userProvidedControl.getList());
+
+                    $scope.isDialogVisible = false;
+
+                    $scope.$broadcast(COMPONENT.MSO_CREATE_REQ, {
+                        url: CreationService.getMsoUrl(),
+                        requestDetails: requestDetails,
+                        componentId: componentId,
+                        callbackFunction: function (response) {
+                            if (response.isSuccessful) {
+                                $scope.popup.isVisible = false;
+                                runCallback(response);
+                            } else {
+                                $scope.isDialogVisible = false;
+                                $scope.popup.isVisible = false;
+                            }
+                        }
+                    });
+
+                } catch (e) {
+                    errorMsg = errorMsg + FIELD.ERROR.INVALID_DATA_FORMAT;
+                }
+                if (errorMsg !== "") {
+                    showError(FIELD.ERROR.SYSTEM_FAILURE, errorMsg);
+
+                }
+            };
+            reader.readAsText(file);
+        } else {
+
+            var paramList = $scope.userProvidedControl.getList();
+            var instanceName = "";
+
+            if (DataService.getALaCarte()) {
+                if (paramList != null) {
+                    for (var i = 0; i < paramList.length; i++) {
+                        if (paramList[i].id === FIELD.ID.INSTANCE_NAME) {
+                            instanceName = paramList[i].value;
+                            break;
+                        }
+                    }
+                }
+                var isValid = validateInstanceName(instanceName);
+                if (isValid) {
+                    $scope.isErrorVisible = false;
+                } else {
+                    showError(FIELD.ERROR.INVALID_INSTANCE_NAME + instanceName,
+                        FIELD.ERROR.INSTANCE_NAME_VALIDATE);
+                    return;
+                }
+            }
+            var arbitraryParametersList = DataService.getArbitraryParameters();
+            var p = null;
+            if (UtilityService.hasContents(arbitraryParametersList)) {
+                for (var i = 0; i < arbitraryParametersList.length; i++) {
+                    p = arbitraryParametersList[i];
+                    if (p.type === PARAMETER.MAP) {
+                        //validate a map: { <entry_key_1>: <entry_value_1>, ... , <entry_key_n>: <entry_value_n> }
+                        // need to find the value in paramList
+                        for (var j = 0; j < paramList.length; j++) {
+                            if (paramList[j].id === p.id) {
+                                p.value = paramList[j].value;
+                                var isValid = validateMap(p.value);
+                                if (isValid) {
+                                    $scope.isErrorVisible = false;
+                                    break;
+                                }
+                                else {
+                                    showError(FIELD.ERROR.INVALID_MAP + p.id,
+                                        FIELD.ERROR.MAP_VALIDATE);
+                                    return;
+                                }
+                            }
+                        }
+                    } else if (p.type === PARAMETER.LIST) {
+                        //validate a list: { value or a list of comma separated values }
+                        // need to find the value in paramList
+                        for (var j = 0; j < paramList.length; j++) {
+                            if (paramList[j].id === p.id) {
+                                p.value = paramList[j].value;
+                                var isValid = validateList(p.value);
+                                if (isValid) {
+                                    $scope.isErrorVisible = false;
+                                    break;
+                                }
+                                else {
+                                    showError(FIELD.ERROR.INVALID_LIST + p.id,
+                                        FIELD.ERROR.LIST_VALIDATE);
+                                    return;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            var requestDetails = CreationService
+                .getMsoRequestDetails($scope.userProvidedControl.getList());
+
+            $scope.isDialogVisible = false;
+
+            $scope.$broadcast(COMPONENT.MSO_CREATE_REQ, {
+                url: CreationService.getMsoUrl(),
+                requestDetails: requestDetails,
+                componentId: componentId,
+                callbackFunction: function (response) {
+                    if (response.isSuccessful) {
+                        $scope.popup.isVisible = false;
+                        runCallback(response);
+                    } else {
+                        $scope.isDialogVisible = false;
+                        $scope.popup.isVisible = false;
+                    }
+                }
+            });
+        }
+    };
+
+    $scope.cancel = function () {
+        $scope.isDialogVisible = false;
+        $scope.popup.isVisible = false;
+        runCallback(false);
+    };
+
+
+    var runCallback = function (response) {
+        if (angular.isFunction(callbackFunction)) {
+            callbackFunction({
+                isSuccessful: response.isSuccessful,
+                control: $scope.userProvidedControl.getList(),
+                instanceId: response.instanceId
+            });
+        }
+    };
+
+    var showError = function (summary, details) {
+        var message = summary;
+        if (UtilityService.hasContents(details)) {
+            message += " (" + details + ")";
+        }
+        $scope.isSpinnerVisible = false;
+        $scope.isErrorVisible = true;
+        $scope.error = message;
+    }
+
+};
+
+appDS2.controller("creationDialogController", ["COMPONENT", "FIELD", "PARAMETER", "$scope", "$http",
+    "$timeout", "$log", "CreationService", "UtilityService", "DataService", "VIDCONFIGURATION", "$location",
+    creationDialogController]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/deleteResumeDialogController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/deleteResumeDialogController.js
index cdda3a1..e71f2ac 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/deleteResumeDialogController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/deleteResumeDialogController.js
@@ -26,77 +26,76 @@
     $scope.isDialogVisible = false;
     $scope.summaryControl = {};
     $scope.userProvidedControl = {};
-    
+
     var callbackFunction = undefined;
     var componentId = undefined;
+    $scope.dialogMethod = COMPONENT.DELETE;
 
     $scope.$on(COMPONENT.DELETE_RESUME_COMPONENT, function(event, request) {
 
     $scope.isE2EService = false;
-    $scope.isDataVisible = false;
-	$scope.isSpinnerVisible = false;
-	$scope.isErrorVisible = false;
-	$scope.isDialogVisible = true;
-	$scope.popup.isVisible = true;
-	$scope.isConfirmEnabled = false;
-	$scope.dialogMethod = request.dialogMethod;
-	callbackFunction = request.callbackFunction;
-	componentId = request.componentId;
-    $scope.isServiceInstance = componentId === "service";
+        $scope.isDataVisible = false;
+        $scope.isSpinnerVisible = false;
+        $scope.isErrorVisible = false;
+        $scope.isDialogVisible = true;
+        $scope.popup.isVisible = true;
+        $scope.isConfirmEnabled = false;
+        $scope.dialogMethod = request.dialogMethod;
+        $scope.serviceStatus = request.serviceStatus;
+        callbackFunction = request.callbackFunction;
+        componentId = request.componentId;
 
-    DeleteResumeService.initializeComponent(request.componentId);
+        DeleteResumeService.initializeComponent(request.componentId);
 
-	$scope.componentName = DeleteResumeService.getComponentDisplayName();
+        $scope.componentName = DeleteResumeService.getComponentDisplayName();
+        $scope.summaryControl.setList(DeleteResumeService.getSummaryList());
 
-	$scope.summaryControl.setList(DeleteResumeService.getSummaryList());
-
-    DeleteResumeService.getParameters(handleGetParametersResponse);
+        DeleteResumeService.getParameters(handleGetParametersResponse);
 
     });
-    
+
     var handleGetParametersResponse = function(parameters, dontshow) {
-		$scope.summaryControl.setList(parameters.summaryList);
-		$scope.userProvidedControl.setList(parameters.userProvidedList);
+        $scope.summaryControl.setList(parameters.summaryList);
+        $scope.userProvidedControl.setList(parameters.userProvidedList);
 
-		$scope.isSpinnerVisible = false;
-		if (dontshow)
-		  $scope.isDataVisible = false;
-		else
-			$scope.isDataVisible = true;
-		$scope.isConfirmEnabled = true;
-	};
+        $scope.isSpinnerVisible = false;
+        if (dontshow)
+            $scope.isDataVisible = false;
+        else
+            $scope.isDataVisible = true;
+        $scope.isConfirmEnabled = true;
+    };
 
-	$scope.userParameterChanged = function(id) {
+    $scope.userParameterChanged = function(id) {
         DeleteResumeService.updateUserParameterList(id, $scope.userProvidedControl);
-	}
+    }
 
     $scope.confirm = function() {
         DataService.setE2EService($scope.isE2EService); //VoLTE support
+        var requiredFields = $scope.userProvidedControl.getRequiredFields();
+        if (requiredFields === "") {
+            $scope.isErrorVisible = false;
+        } else {
+            showError(FIELD.ERROR.MISSING_DATA, requiredFields);
+            return;
+        }
 
-    	var requiredFields = $scope.userProvidedControl.getRequiredFields();
-		if (requiredFields === "") {
-			$scope.isErrorVisible = false;
-		} else {
-			showError(FIELD.ERROR.MISSING_DATA, requiredFields);
-			return;
-		}
 
-		
 
-       var  callbackAfterMSO = function(isSuccessful) {
+        var  callbackAfterMSO = function(isSuccessful) {
             if (isSuccessful) {
                 $scope.popup.isVisible = false;
                 runCallback(true);
             } else {
-                 $scope.isDialogVisible = true;
+                $scope.isDialogVisible = true;
             }
         };
 
 
-		$scope.isDialogVisible = false;
+        $scope.isDialogVisible = false;
 
-		if ($scope.dialogMethod == COMPONENT.DELETE)
-		{
+        if ($scope.dialogMethod == COMPONENT.DELETE)
+        {
 
             var requestDetails = DeleteResumeService.getMsoRequestDetails($scope.userProvidedControl.getList());
 
@@ -105,13 +104,13 @@
             }
 
             $scope.$broadcast(COMPONENT.MSO_DELETE_REQ, {
-                url : DeleteResumeService.getMsoUrl(),
+                url : DeleteResumeService.getMsoUrl($scope.serviceStatus),
                 requestDetails : requestDetails,
-            	componentId: componentId,
+                componentId: componentId,
                 callbackFunction : callbackAfterMSO
             });
-		}
-		else
+        }
+        else
         if ($scope.dialogMethod == COMPONENT.RESUME)
         {
             CreationService.initializeComponent(componentId);
@@ -133,17 +132,17 @@
     }
 
     $scope.cancel = function() {
-	$scope.isDialogVisible = false;
-	$scope.popup.isVisible = false;
-	runCallback(false);
+        $scope.isDialogVisible = false;
+        $scope.popup.isVisible = false;
+        runCallback(false);
     }
 
     var runCallback = function(isSuccessful) {
-	if (angular.isFunction(callbackFunction)) {
-	    callbackFunction({
-		isSuccessful : isSuccessful
-	    });
-	}
+        if (angular.isFunction(callbackFunction)) {
+            callbackFunction({
+                isSuccessful : isSuccessful
+            });
+        }
     }
 }
 
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/msoCommitModalController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/msoCommitModalController.js
index 148b4cc..631d012 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/msoCommitModalController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/msoCommitModalController.js
@@ -21,7 +21,7 @@
 "use strict";
 
 var msoCommitModalController = function(COMPONENT, FIELD, $scope, $http, $timeout, $window, $log,
-		MsoService, PropertyService, UtilityService, DataService, $uibModalInstance, msoType, requestParams, vidService) {
+		MsoService, PropertyService, UtilityService, DataService, $uibModalInstance, msoType, requestParams, configuration, vidService, featureFlags) {
 
     $scope.isSpinnerVisible = true;
     $scope.isProgressVisible = true;
@@ -153,12 +153,14 @@
 
     var init = function(msoType) {
         switch(msoType) {
+            case COMPONENT.MSO_DELETE_CONFIGURATION_REQ :
+                return MsoService.deleteConfiguration(requestParams, configuration);
             case COMPONENT.MSO_CREATE_REQ:
                 return MsoService.createConfigurationInstance(requestParams);
             case  COMPONENT.MSO_CHANGE_CONFIG_STATUS_REQ:
-                return MsoService.toggleConfigurationStatus(requestParams);
+                return MsoService.toggleConfigurationStatus(requestParams, configuration);
             case COMPONENT.MSO_CHANGE_PORT_STATUS_REQ:
-                return MsoService.togglePortStatus(requestParams);
+                return MsoService.togglePortStatus(requestParams, configuration);
             case COMPONENT.MSO_CREATE_REALATIONSHIP:
                 return MsoService.associatePnf(requestParams);
             case COMPONENT.MSO_REMOVE_RELATIONSHIP:
@@ -223,6 +225,7 @@
 
     _this.msoRequestType = msoType;
 
+
     init(_this.msoRequestType)
         .then(function (response) {
             successCallbackFunction(response);
@@ -233,5 +236,5 @@
 };
 
 appDS2.controller("msoCommitModalController", [ "COMPONENT", "FIELD", "$scope", "$http", "$timeout",
-		"$window", "$log", "MsoService", "PropertyService", "UtilityService", "DataService", "$uibModalInstance", "msoType", "requestParams", "vidService",
+		"$window", "$log", "MsoService", "PropertyService", "UtilityService", "DataService", "$uibModalInstance", "msoType", "requestParams", "configuration", "vidService", "featureFlags",
     msoCommitModalController ]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/pnfSearchAssociationController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/pnfSearchAssociationController.js
index 22a20ab..04717c5 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/pnfSearchAssociationController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/pnfSearchAssociationController.js
@@ -94,6 +94,9 @@
                     requestParams: function () {
                         requestParams.callbackFunction = updateViewCallbackFunction;
                         return requestParams;
+                    },
+                    configuration: function () {
+                        return null;
                     }
                 }
             })
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/testEnvironmentsController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/testEnvironmentsController.js
index f5c3a0e..63ddac2 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/testEnvironmentsController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/testEnvironmentsController.js
@@ -53,7 +53,7 @@
                         _.find(relatedEcompEnv.relationshipData, {"relationshipKey": "operational-environment.operational-environment-id"})
                             .relationshipValue;
                     var relatedInstanceName =
-                        _.find(relatedEcompEnv.relatedToProperty, {"propertyKey": "operational-environment.operational-name"})
+                        _.find(relatedEcompEnv.relatedToProperty, {"propertyKey": "operational-environment.operational-environment-name"})
                             .propertyValue;
                     var workloadContext = testEnv.workloadContext;
 
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/filters/change-managements-by-statuses.filter.js b/vid-app-common/src/main/webapp/app/vid/scripts/filters/change-managements-by-statuses.filter.js
index 6f0ae2c..82dbebc 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/filters/change-managements-by-statuses.filter.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/filters/change-managements-by-statuses.filter.js
@@ -7,12 +7,16 @@
             var result = [];
             if(changeManagements && metadata && metadata.statuses) {
                 angular.forEach(changeManagements, function(changeManagement) {
-                    angular.forEach(metadata.statuses, function(status) {
-                        if(changeManagement.requestStatus.requestState === status) {
-                            result.push(changeManagement);
-                            return;
-                        }
-                    });
+                    var found = metadata.statuses
+                        .map(function(c) { return c.toLowerCase(); })
+                        .indexOf(changeManagement.requestStatus.requestState.toLowerCase()) !== -1;
+
+                    if (metadata.notContains && !found) {
+                        result.push(changeManagement);
+                    }
+                    if (! metadata.notContains && found) {
+                        result.push(changeManagement);
+                    }
                 });
             }
 
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/alert-change-management/alert-change-management.html b/vid-app-common/src/main/webapp/app/vid/scripts/modals/alert-change-management/alert-change-management.html
index 60596f4..6988aab 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/alert-change-management/alert-change-management.html
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/alert-change-management/alert-change-management.html
@@ -1,5 +1,6 @@
 <link rel="stylesheet" type="text/css" href="app/vid/styles/modal-create-new.css" />
 <link rel="stylesheet" type="text/css" href="app/vid/scripts/modals/alert-change-management/alert-change-management.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/scripts/modals/css/manual-task-popup.css" />
 <div class="modal-header">
     <h3 class="modal-title" id="alert-modal-header">On Hold</h3>
     <span id="cancel" ng-click="vm.close()" class="pull-right modal-close" aria-hidden="true">&times;</span>
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/cancel-pending-workflow/cancel-pending-workflow.html b/vid-app-common/src/main/webapp/app/vid/scripts/modals/cancel-pending-workflow/cancel-pending-workflow.html
index 6dca76d..7ae4ba9 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/cancel-pending-workflow/cancel-pending-workflow.html
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/cancel-pending-workflow/cancel-pending-workflow.html
@@ -2,9 +2,9 @@
 <link rel="stylesheet" type="text/css" href="app/vid/scripts/modals/cancel-pending-workflow/cancel-pending-workflow.css"/>
 <div class="modal-header">
     <span class="modal-title" id="pending-modal-header">Pending</span>
-    <span id="cancel" ng-click="vm.close()" class="pull-right modal-close" aria-hidden="true">&times;</span>
+    <span id="cancel" ng-click="vm.close()" class="pull-right modal-close" aria-hidden="true" data-tests-id="pull_right_modal_close">&times;</span>
 </div>
-<div class="modal-body" id="modal-body">
+<div class="modal-body" id="modal-body" data-tests-id="btn-cancel-workflow">
     Are you sure you want to delete workflow
     <br/>
     {{vm.workflow.scheduleRequest.scheduleName}}?
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/change-management-manual-tasks-controller/change-management-manual-tasks.controller.js b/vid-app-common/src/main/webapp/app/vid/scripts/modals/change-management-manual-tasks-controller/change-management-manual-tasks.controller.js
index 91bac56..daf593e 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/change-management-manual-tasks-controller/change-management-manual-tasks.controller.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/change-management-manual-tasks-controller/change-management-manual-tasks.controller.js
@@ -10,6 +10,8 @@
         vm.manualTasks = [];
         vm.MANUAL_TASKS = COMPONENT.MANUAL_TASKS;
         var init = function() {
+            vm.requestState = jobInfo.requestState;
+
             if (jobInfo && jobInfo.details) {
                 vm.content = jobInfo.details;
             } else {
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/css/manual-task-popup.css b/vid-app-common/src/main/webapp/app/vid/scripts/modals/css/manual-task-popup.css
new file mode 100644
index 0000000..f2e7d8b
--- /dev/null
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/css/manual-task-popup.css
@@ -0,0 +1,10 @@
+.modal {
+    position: inherit;
+    text-align: left;
+}
+.modal-dialog {
+    position: absolute;
+    right: 0;
+    display: inline;
+    margin-top: -200px;
+}
\ No newline at end of file
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/failed-change-management/failed-change-management.html b/vid-app-common/src/main/webapp/app/vid/scripts/modals/failed-change-management/failed-change-management.html
index d51620d..cc22f70 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/failed-change-management/failed-change-management.html
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/failed-change-management/failed-change-management.html
@@ -1,7 +1,8 @@
 <link rel="stylesheet" type="text/css" href="app/vid/styles/modal-create-new.css" />
 <link rel="stylesheet" type="text/css" href="app/vid/scripts/modals/failed-change-management/failed-change-management.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/scripts/modals/css/manual-task-popup.css" />
 <div class="modal-header">
-    <h3 class="modal-title" id="failed-modal-header">Failed</h3>
+    <h3 class="modal-title" id="failed-modal-header">{{vm.requestState || 'Failed' }}</h3>
     <span id="cancel" ng-click="vm.close()" class="pull-right modal-close" aria-hidden="true">&times;</span>
 </div>
 <div class="modal-body">
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/in-progress-modal-management/in-progress-change-management.html b/vid-app-common/src/main/webapp/app/vid/scripts/modals/in-progress-modal-management/in-progress-change-management.html
index 615c95c..5716670 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/in-progress-modal-management/in-progress-change-management.html
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/in-progress-modal-management/in-progress-change-management.html
@@ -1,5 +1,6 @@
 <link rel="stylesheet" type="text/css" href="app/vid/styles/modal-create-new.css" />
 <link rel="stylesheet" type="text/css" href="app/vid/scripts/modals/in-progress-modal-management/in-progress-change-management.css" />
+<link rel="stylesheet" type="text/css" href="app/vid/scripts/modals/css/manual-task-popup.css" />
 <div class="modal-header">
     <h3 class="modal-title" id="in-progress-modal-header">In Progress</h3>
     <span id="cancel" ng-click="vm.close()" class="pull-right modal-close" aria-hidden="true">&times;</span>
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/mso-commit/mso-commit.html b/vid-app-common/src/main/webapp/app/vid/scripts/modals/mso-commit/mso-commit.html
index 7698981..50b53ce 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/mso-commit/mso-commit.html
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/mso-commit/mso-commit.html
@@ -39,7 +39,7 @@
 
     </div>
 
-    <pre class="log">{{log}}</pre>
+    <pre class="log" data-tests-id="msoCommitLog">{{log}}</pre>
 
     <div class="buttonRow">
         <button data-tests-id="msoCommitDialogCloseButton" ngx-enabled="{{isCloseEnabled}}" att-button size="small"
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js
index e4ff1a0..3918219 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js
@@ -2,9 +2,9 @@
     'use strict';
 
     appDS2.controller("newChangeManagementModalController", ["$uibModalInstance", "$uibModal",'$q', "AaiService", "changeManagementService", "Upload",
-        "$log", "$scope", "_", "COMPONENT", "VIDCONFIGURATION", newChangeManagementModalController]);
+        "$log", "$scope", "_", "COMPONENT", "VIDCONFIGURATION","DataService","featureFlags", newChangeManagementModalController]);
 
-    function newChangeManagementModalController($uibModalInstance, $uibModal,$q, AaiService, changeManagementService, Upload, $log, $scope, _, COMPONENT, VIDCONFIGURATION) {
+    function newChangeManagementModalController($uibModalInstance, $uibModal,$q, AaiService, changeManagementService, Upload, $log, $scope, _, COMPONENT, VIDCONFIGURATION, DataService, featureFlags) {
 
         var vm = this;
         vm.hasScheduler = !!VIDCONFIGURATION.SCHEDULER_PORTAL_URL;
@@ -23,11 +23,29 @@
 
         vm.softwareVersionRegex = "[-a-zA-Z0-9\.]+";
 
+        var attuid;
+
+        function fetchAttUid() {
+            var defer = $q.defer();
+            if (attuid) {
+                defer.resolve(attuid);
+            } else {
+                AaiService.getLoggedInUserID(function (response) {
+                        attuid = response.data;
+                        defer.resolve(attuid);
+                    },
+                    function (err) {
+                        defer.reject(err);
+                    });
+            }
+            return defer.promise;
+        }
+
         var init = function () {
             vm.changeManagement = {};
 
             loadServicesCatalog();
-            registerVNFNamesWatcher();
+            fetchAttUid().then(registerVNFNamesWatcher);
             vm.loadSubscribers();
         };
 
@@ -115,14 +133,11 @@
                     modelCustomizationName: csarVNF.modelCustomizationName,
                     modelCustomizationId: csarVNF.customizationUuid
                 },
-                cloudConfiguration: {
-                    lcpCloudRegionId: "mdt1",
-                    tenantId: "88a6ca3ee0394ade9403f075db23167e"
-                },
+                cloudConfiguration: selectionVNF.cloudConfiguration || {},
                 requestInfo: {
                     source: "VID",
                     suppressRollback: false,
-                    requestorId: "az2016"
+                    requestorId: attuid
                 },
                 relatedInstanceList: [
                     {
@@ -161,13 +176,13 @@
                     return data;
                 }]
             })
-            .then(function (configUpdateResponse) {
-                vm.changeManagement.configUpdateFile = configUpdateResponse && JSON.parse(configUpdateResponse.data).payload;
-                defer.resolve(true);
-            })
-            .catch(function (error) {
-                defer.resolve(false);
-            });
+                .then(function (configUpdateResponse) {
+                    vm.changeManagement.configUpdateFile = configUpdateResponse && JSON.parse(configUpdateResponse.data).payload;
+                    defer.resolve(true);
+                })
+                .catch(function (error) {
+                    defer.resolve(false);
+                });
             return defer.promise;
         };
 
@@ -350,6 +365,9 @@
 				vm.changeManagement.policyYN = "Y";
 				vm.changeManagement.sniroYN = "Y";
 
+			            if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_ADD_MSO_TESTAPI_FIELD)) {
+			                vm.changeManagement.testApi = DataService.getMsoRequestParametersTestApi();
+			            }
 				var data = {
 					widgetName: 'Portal-Common-Scheduler',
 					widgetData: vm.changeManagement,
@@ -456,11 +474,13 @@
             vm.serviceInstancesToGetVersions = [];
             var versions = [];
             _.forEach(vm.vnfs, function (vnf) {
-                if (vnf.properties['nf-role'] === vm.changeManagement['vnfType']) {
-
+                if (vnf.properties['nf-role'] === vm.changeManagement['vnfType']
+                && vnf.properties["model-invariant-id"]
+                && vnf.properties["model-version-id"]) {
                     vm.serviceInstancesToGetVersions.push({
-                        "model-invariant-id": vnf.properties["model-invariant-id"],
-                        "model-version-id": vnf.properties["model-version-id"] }
+                            "model-invariant-id": vnf.properties["model-invariant-id"],
+                            "model-version-id": vnf.properties["model-version-id"]
+                        }
                     );
 
                     versions.push(vnf.properties["model-invariant-id"]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html
index 9954d5a..5679af4 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html
@@ -71,15 +71,15 @@
         </div>
         <div ng-if="vm.shouldShowVnfInPlaceFields()">
             <div class="form-group">
-                <label class="control-label">operations-timeout</label>
+                <label class="control-label">Operations timeout</label>
                 <input class="form-control" ng-model="vm.changeManagement.operationTimeout" name="operationTimeout" type="text" id="operations-timeout" pattern="[0-9]+" required>
             </div>
             <div class="form-group">
-                <label class="control-label">existing-software-version</label>
+                <label class="control-label">Existing software version</label>
                 <input class="form-control" ng-model="vm.changeManagement.existingSoftwareVersion" name="existingSoftwareVersion" type="text" id="existing-software-version" pattern="{{vm.softwareVersionRegex}}" required>
             </div>
             <div class="form-group">
-                <label class="control-label">new-software-version</label>
+                <label class="control-label">New software version</label>
                 <input class="form-control" ng-model="vm.changeManagement.newSoftwareVersion" name="newSoftwareVersion" type="text" id="new-software-version" pattern="{{vm.softwareVersionRegex}}" required>
             </div>
 
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-test-environment/new-test-environment.html b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-test-environment/new-test-environment.html
index cd14a76..a1f1e2f 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-test-environment/new-test-environment.html
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-test-environment/new-test-environment.html
@@ -21,7 +21,7 @@
             <input id="ecompInstanceName" class="form-control" ng-model="vm.newEnvironment.ecompInstanceName" name="ecompInstanceName" data-tests-id="ecomp-instance-name" required disabled>
         </div>
         <div class="form-group">
-            <label class="control-label" for="tenantContext">Select VSP</label>
+            <label class="control-label" for="tenantContext">Tenant Context</label>
             <input id="tenantContext" class="form-control" ng-model="vm.newEnvironment.tenantContext" name="tenantContext" data-tests-id="tenant-context" required disabled>
         </div>
         <div class="form-group">
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/aaiService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/aaiService.js
index 4b1d771..ceb5a75 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/aaiService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/aaiService.js
@@ -20,7 +20,7 @@
 
 "use strict";
 
-var AaiService = function ($http, $log, PropertyService, UtilityService, COMPONENT, FIELD, $q) {
+var AaiService = function ($http, $log, PropertyService, UtilityService, COMPONENT, FIELD, $q, featureFlags) {
 
     function getServiceInstance(serviceInstanceIdentifier, findBy) {
         serviceInstanceIdentifier.trim();
@@ -44,9 +44,7 @@
             });
 
         return deferred.promise;
-    };
-
-
+    }
     function getGlobalCustomerIdFromServiceInstanceResponse(response) {
         var globalCustomerId = "";
         if (angular.isArray(response.data[FIELD.ID.RESULT_DATA])) {
@@ -69,7 +67,7 @@
             timeout : PropertyService.getServerResponseTimeoutMsec()
         }).then(function (response) {
             var displayData = response.data[FIELD.ID.SERVICE_INSTANCES];
-            if (!displayData.length) {
+            if (!displayData || !displayData.length) {
                 displayData = [{
                     globalCustomerId 	: null,
                     subscriberName   	: null,
@@ -115,7 +113,7 @@
                 COMPONENT.FORWARD_SLASH + encodeURIComponent(globalCustomerId) +
                 COMPONENT.FORWARD_SLASH + encodeURIComponent(serviceType) +
                 COMPONENT.FORWARD_SLASH + encodeURIComponent(serviceInstanceId);
-            $http.get(url, {}, {
+            return $http.get(url, {}, {
 
 
                 timeout : PropertyService.getServerResponseTimeoutMsec()
@@ -169,6 +167,26 @@
             });
         },
 
+        getCRInformationByInstanceId : function (serviceInstanceId) {
+
+            var deferred = $q.defer();
+
+            var url = COMPONENT.AAI_GET_CR_INSTANCE +
+                COMPONENT.FORWARD_SLASH + encodeURIComponent(serviceInstanceId);
+            $http.get(url, {}, {
+                timeout : PropertyService.getServerResponseTimeoutMsec()
+            }).then(function(response) {
+                if (response.data != null) {
+                    deferred.resolve(response);
+                } else {
+                    deferred.resolve(response);
+                }
+            }, function(response) {
+                deferred.resolve(response);
+            });
+            return deferred.promise;
+        },
+
         searchServiceInstances: searchServiceInstances,
 
         getModelVersionId: function (subscriberId, instanceId) {
@@ -329,6 +347,44 @@
             });
         },
 
+        getPortMirroringData : function (ids) {
+            var defer = $q.defer();
+            if(featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_REGION_ID_FROM_REMOTE)){
+                var url = COMPONENT.AAI_GET_PORT_MIRRORING_CONFIGS_DATA +'?configurationIds=' +  ids.join(',');
+                $http.get(url).then(function(res){
+                    defer.resolve(res);
+                }).catch(function(err) {
+                    $log.error(err);
+                    defer.resolve({});
+                });
+            }else {
+                var staticConfigurationData = {};
+                angular.forEach(ids, function(id) {
+                    staticConfigurationData[id] = {
+                        "cloudRegionId": "mdt1"
+                    }
+                });
+                defer.resolve({
+                    "data": staticConfigurationData
+                });
+            }
+
+            return defer.promise;
+
+        },
+
+        getPortMirroringSourcePorts : function (ids) {
+            var defer = $q.defer();
+            var url = COMPONENT.AAI_GET_PORT_MIRRORING_SOURCE_PORTS +'?configurationIds=' +  ids.join(',');
+            $http.get(url).then(function(res){
+                defer.resolve(res);
+            }).catch(function(err) {
+                $log.error(err);
+                defer.resolve({});
+            });
+            return defer.promise;
+        },
+
         getSubscriptionServiceTypeList : function(globalCustomerId,
                                                   successCallbackFunction) {
             $log
@@ -444,11 +500,12 @@
                 } else {
                     successCallbackFunction([]);
                 }
-            },function(failure){console.log("failure")})["catch"]
-                if(catchCallbackFunction) {
+            })["catch"] (function(response, status) {
+                if (catchCallbackFunction) {
                     catchCallbackFunction();
                 }
-            (UtilityService.runHttpErrorHandler);
+                UtilityService.runHttpErrorHandler(response, status);
+            })
         },
         getServices : function(successCallbackFunction) {
             $log
@@ -565,7 +622,7 @@
             var deferred = $q.defer();
 
             if (UtilityService.hasContents(modelInvariantId)) {
-                var body = {"versions" : modelInvariantId}
+                var body = {"versions": modelInvariantId};
                 $http.post(( COMPONENT.AAI_GET_VERSION_BY_INVARIANT_ID),body)
 
                     .success(function (response) {
@@ -657,8 +714,36 @@
             });
 
             return deferred.promise;
+        },
+
+        getInstanceGroupsByVNFInstanceId: function (vnf_instance_id, successCallback, errorCallback) {
+            var url = COMPONENT.AAI_GET_INSTANCE_GROUPS_BY_VNF_INSTANCE_ID_PATH + "/" + vnf_instance_id;
+
+            $http.get(url, {}, {
+                timeout: PropertyService.getServerResponseTimeoutMsec()
+            }).then(function (response) {
+                successCallback(response);
+            }, function (response) {
+                errorCallback(response);
+            });
+        },
+
+        postPOMBAverificationRequest: function (url, data, config) {
+            $http.post(url, data, config)
+                .success(function (data, status, headers, config) {
+                    //If at some point in the future the result should be handled - this should be the entry point.
+                    log.debug("POMBA was called successfully with data: " + data);
+                })
+                .error(function (data, status, header, config) {
+                    log.debug("Error: " +
+                        "Data: " + data +
+                        "status: " + status +
+                        "headers: " + header +
+                        "config: " + config);
+                });
         }
-    }};
+    }
+};
 
 appDS2.factory("AaiService", ["$http", "$log", "PropertyService",
-    "UtilityService", "COMPONENT", "FIELD", "$q", AaiService]);
+    "UtilityService", "COMPONENT", "FIELD", "$q", "featureFlags", AaiService]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js
index 68fdce4..753f9fd 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js
@@ -20,21 +20,56 @@
 
 "use strict";
 
-var AsdcService = function($http, $log, PropertyService, UtilityService) {
+var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCONFIGURATION, COMPONENT, featureFlags) {
     return {
-	getModel : function(modelId, successCallbackFunction) {
-	    $log.debug("AsdcService:getModel: modelId: " + modelId);
-	    $http.get(
-		     "asdc/getModel/" + modelId
-			    + "?r=" + Math.random(),
-		    {
-			timeout : PropertyService
-				.getServerResponseTimeoutMsec()
-		    }).then(successCallbackFunction)["catch"]
-		    (UtilityService.runHttpErrorHandler);
-	}
+        getModel: function (modelId, successCallbackFunction) {
+            $log.debug("AsdcService:getModel: modelId: " + modelId);
+            $http.get(
+                "asdc/getModel/" + modelId
+                + "?r=" + Math.random(),
+                {
+                    timeout: PropertyService
+                        .getServerResponseTimeoutMsec()
+                }).then(successCallbackFunction)["catch"]
+            (UtilityService.runHttpErrorHandler);
+        },
+
+        shouldExcludeMacroFromAsyncInstatiationFlow: function(serviceModel){
+            if (!featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_ASYNC_INSTANTIATION))
+                return true;
+            if (!_.isEmpty(serviceModel.pnfs))
+                return true;
+            if (!_.isEmpty(serviceModel.collectionResource))
+                return true;
+            if (!_.isEmpty(serviceModel.networks) && !featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_NETWORK_TO_ASYNC_INSTANTIATION))
+                return true;
+            if(serviceModel.service.instantiationType === "ClientConfig")
+                return true;
+            return false;
+        },
+
+        isMacro: function (serviceModel) {
+            if (serviceModel && serviceModel.service) {
+                switch (serviceModel.service.instantiationType) {
+                    case 'Macro':
+                    case 'Both':
+                        return true;
+                    case 'A-La-Carte':
+                        return false;
+                    case 'ClientConfig':
+                        console.debug("Looking for " + serviceModel.service.invariantUuid + " by Client Config");
+                        return UtilityService.arrayContains(VIDCONFIGURATION.MACRO_SERVICES, serviceModel.service.invariantUuid);
+                    default:
+                        console.debug("Unexpected serviceModel.service.instantiationType: " + serviceModel.service.instantiationType);
+                        return true;
+                }
+            } else {
+                $log.debug("isMscro=false, because serviceModel.service is undefined");
+                return false;
+            }
+        }
     }
 }
 
-appDS2.factory("AsdcService", [ "$http", "$log", "PropertyService",
-	"UtilityService", AsdcService ]);
+appDS2.factory("AsdcService", ["$http", "$log", "PropertyService",
+    "UtilityService", "VIDCONFIGURATION","COMPONENT", "featureFlags", AsdcService]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/creationService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/creationService.js
index 0e7dbe4..f2a77e2 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/creationService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/creationService.js
@@ -30,10 +30,9 @@
  */
 
 var CreationService = function($log, AaiService, AsdcService, DataService,VIDCONFIGURATION,
-                               ComponentService, COMPONENT, FIELD, PARAMETER, UtilityService, OwningEntityService) {
+                               ComponentService, COMPONENT, FIELD, PARAMETER, UtilityService, OwningEntityService,featureFlags) {
 
     var _this = this;
-
     var getAsyncOperationList = function() {
         if (DataService.getLoggedInUserId() == null) {
             getLoggedInUserID();
@@ -660,6 +659,11 @@
                 userParams : getArbitraryParameters(parameterList)
             }
         };
+        if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_ADD_MSO_TESTAPI_FIELD)) {
+            if ((_this.componentId != COMPONENT.SERVICE) || ( DataService.getALaCarte() )) {
+                requestDetails.requestParameters.testApi = DataService.getMsoRequestParametersTestApi();
+            }
+        }
         if ( (_this.componentId != COMPONENT.SERVICE) || ( !DataService.getALaCarte() ) ) {
             // include cloud region for everything but service create alacarte
             var lcpRegion = getValueFromList(FIELD.ID.LCP_REGION, parameterList);
@@ -673,6 +677,7 @@
             };
         }
         switch (_this.componentId) {
+
             case COMPONENT.SERVICE:
                 requestDetails.subscriberInfo = {
                     globalSubscriberId : DataService.getGlobalCustomerId(),
@@ -1285,4 +1290,4 @@
 
 appDS2.factory("CreationService", [ "$log", "AaiService", "AsdcService",
     "DataService","VIDCONFIGURATION", "ComponentService", "COMPONENT", "FIELD", "PARAMETER",
-    "UtilityService", "OwningEntityService", CreationService ]);
+    "UtilityService", "OwningEntityService","featureFlags", CreationService ]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/dataService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/dataService.js
index 77523e9..0e16355 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/dataService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/dataService.js
@@ -257,6 +257,9 @@
 		getServiceInstanceToCustomer : function() {
 			return _this.serviceInstanceToCustomer;
 		},
+        getMsoRequestParametersTestApi: function(){
+            return sessionStorage.getItem("msoRequestParametersTestApiValue");
+		},
 		setALaCarte : function(aval) {
 			_this.aLaCarte = aval;
 		},
@@ -267,6 +270,15 @@
 			}
 			return _this.aLaCarte;
 		},
+		setShouldExcludeMacroFromAsyncInstatiationFlow: function (val) {
+			_this.shouldExcludeMacroFromAsyncInstatiationFlow = val;
+        },
+        getShouldExcludeMacroFromAsyncInstatiationFlow: function(){
+            if (_this.shouldExcludeMacroFromAsyncInstatiationFlow === undefined) {
+                return false;
+            }
+            return _this.shouldExcludeMacroFromAsyncInstatiationFlow;
+		},
 		setMacro : function(aval) {
 			_this.macro = aval;
 		},
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/deleteResumeService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/deleteResumeService.js
index 3255bc9..416096a 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/deleteResumeService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/deleteResumeService.js
@@ -21,7 +21,7 @@
 "use strict";
 
 var DeleteResumeService = function($log, AaiService, AsdcService, DataService,
-	ComponentService, COMPONENT, FIELD, UtilityService) {
+	ComponentService, COMPONENT, FIELD, UtilityService,featureFlags) {
 
     var _this = this;
 
@@ -255,7 +255,7 @@
 	}
     };
 
-    var getMsoUrl = function() {
+    var getMsoUrl = function(serviceStatus) {
 		switch (_this.componentId) {
 			case COMPONENT.CONFIGURATION:
 				return "mso_delete_configuration/"
@@ -269,7 +269,7 @@
 				if(DataService.getE2EService() === true)
 					return "mso_delete_e2e_svc_instance/"+ DataService.getServiceInstanceId();
 				else
-					return "mso_delete_svc_instance/"+ DataService.getServiceInstanceId();
+					return "mso_delete_svc_instance" + "/" + DataService.getServiceInstanceId() + "?serviceStatus="  + serviceStatus;
 			case COMPONENT.VNF:
 				return "mso_delete_vnf_instance/"
 					+ DataService.getServiceInstanceId() + "/vnfs/"
@@ -330,12 +330,21 @@
 					requestorId: requestorloggedInId
 				}
 		};
+        if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_ADD_MSO_TESTAPI_FIELD)) {
+            if ((_this.componentId != COMPONENT.SERVICE) || ( DataService.getALaCarte() )) {
+                // a-la-carte services AND *any* non-service
+                requestDetails.requestParameters = {
+                    testApi : DataService.getMsoRequestParametersTestApi()
+                };
+            }
+        }
 		
 		switch (_this.componentId) {
 			case COMPONENT.SERVICE:
-				requestDetails.requestParameters = {
-					aLaCarte : DataService.getALaCarte()
-				};
+				if (!requestDetails.requestParameters) {
+                    requestDetails.requestParameters = {};
+                }
+				requestDetails.requestParameters.aLaCarte = DataService.getALaCarte();
 				if ( !(DataService.getALaCarte()) ) {
 					// for macro delete include cloud config.
 					var lcpRegion = getValueFromList(FIELD.ID.LCP_REGION, parameterList);
@@ -530,4 +539,4 @@
 
 appDS2.factory("DeleteResumeService", [ "$log", "AaiService", "AsdcService",
 	"DataService", "ComponentService", "COMPONENT", "FIELD",
-	"UtilityService", DeleteResumeService ]);
+	"UtilityService","featureFlags", DeleteResumeService ]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/detailsService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/detailsService.js
index 37220ff..044b5b9 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/detailsService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/detailsService.js
@@ -20,79 +20,101 @@
 
 "use strict";
 
-var DetailsService = function($log, DataService, ComponentService, COMPONENT,
-	FIELD, UtilityService) {
+var DetailsService = function ($log, DataService, ComponentService, COMPONENT,
+                               FIELD, UtilityService) {
 
     var _this = this;
 
-    var getSummaryList = function() {
-	switch (_this.componentId) {
-	case COMPONENT.NETWORK:
-	case COMPONENT.SERVICE:
-	case COMPONENT.VNF:
-	case COMPONENT.VF_MODULE:
-	case COMPONENT.VOLUME_GROUP:
-	    return [ {
-		name : FIELD.NAME.SUBSCRIBER_NAME,
-		value : DataService.getSubscriberName()
-	    }, {
-		name : FIELD.NAME.SERVICE_INSTANCE_ID,
-		value : DataService.getServiceInstanceId()
-	    }, {
-		name : FIELD.NAME.SERVICE_TYPE,
-		value : DataService.getServiceType()
-	    } ];
-	}
+    var getSummaryList = function () {
+        var model = DataService.getModelInfo(COMPONENT.SERVICE);
+        switch (_this.componentId) {
+            case COMPONENT.NETWORK:
+            case COMPONENT.SERVICE:
+            case COMPONENT.VNF:
+            case COMPONENT.VF_MODULE:
+            case COMPONENT.VOLUME_GROUP:
+                return [{
+                    name: FIELD.NAME.SUBSCRIBER_NAME,
+                    value: DataService.getSubscriberName()
+                }, {
+                    name: FIELD.NAME.SERVICE_INSTANCE_ID,
+                    value: DataService.getServiceInstanceId()
+                }, {
+                    name: FIELD.NAME.SERVICE_TYPE,
+                    value: DataService.getServiceType()
+                }, {
+                    name: FIELD.NAME.MODEL_NAME,
+                    value: model.modelName
+                }, {
+                    name: FIELD.NAME.MODEL_VERSION,
+                    value: model.modelVersion
+                }];
+        }
     };
 
-    var getDetailsList = function() {
-    	switch (_this.componentId) {
-    	case COMPONENT.NETWORK:
-    	case COMPONENT.SERVICE:
-    	case COMPONENT.VNF:
-    	case COMPONENT.VF_MODULE:
-    	case COMPONENT.VOLUME_GROUP:
-    	    return ComponentService.getDisplayNames(ComponentService
-    		    .getInventoryParameterList(_this.componentId, DataService
-    			    .getInventoryItem(), false));
-    	}
+    var getDetailsList = function () {
+        switch (_this.componentId) {
+            case COMPONENT.NETWORK:
+            case COMPONENT.SERVICE:
+            case COMPONENT.VNF:
+            case COMPONENT.VF_MODULE:
+            case COMPONENT.VOLUME_GROUP:
+                var model = DataService.getModelInfo(_this.componentId);
+                var metaData = ComponentService.getDisplayNames(ComponentService
+                    .getInventoryParameterList(_this.componentId, DataService
+                        .getInventoryItem(), false));
+                if (model && !UtilityService.isObjectEmpty(model.modelName) && !UtilityService.isObjectEmpty(model.modelVersion)) {
+                    metaData = metaData.concat([
+                        {
+                            id: FIELD.NAME.MODEL_NAME,
+                            name: FIELD.NAME.MODEL_NAME,
+                            value: model.modelName
+                        }, {
+                            id: FIELD.NAME.MODEL_VERSION,
+                            name: FIELD.NAME.MODEL_VERSION,
+                            value: model.modelVersion
+                        }
+                    ]);
+                }
+                return metaData;
+        }
     };
 
-    var getMsoFilterString = function() {
+    var getMsoFilterString = function () {
 
-	var instanceId = "";
+        var instanceId = "";
 
-	switch (_this.componentId) {
-	case COMPONENT.NETWORK:
-	    instanceId = DataService.getNetworkInstanceId();
-	    break;
-	case COMPONENT.SERVICE:
-	    instanceId = DataService.getServiceInstanceId();
-	    break;
-	case COMPONENT.VNF:
-	    instanceId = DataService.getVnfInstanceId();
-	    break;
-	case COMPONENT.VF_MODULE:
-	    instanceId = DataService.getVfModuleInstanceId();
-	    break;
-	case COMPONENT.VOLUME_GROUP:
-	    instanceId = DataService.getVolumeGroupInstanceId();
-	}
+        switch (_this.componentId) {
+            case COMPONENT.NETWORK:
+                instanceId = DataService.getNetworkInstanceId();
+                break;
+            case COMPONENT.SERVICE:
+                instanceId = DataService.getServiceInstanceId();
+                break;
+            case COMPONENT.VNF:
+                instanceId = DataService.getVnfInstanceId();
+                break;
+            case COMPONENT.VF_MODULE:
+                instanceId = DataService.getVfModuleInstanceId();
+                break;
+            case COMPONENT.VOLUME_GROUP:
+                instanceId = DataService.getVolumeGroupInstanceId();
+        }
 
-	return "filter=" + _this.componentId + "InstanceId:EQUALS:"
-		+ instanceId;
+        return "filter=" + _this.componentId + "InstanceId:EQUALS:"
+            + instanceId;
     };
 
     return {
-	initializeComponent : function(componentId) {
-	    _this.componentId = ComponentService.initialize(componentId);
-	},
-	getComponentDisplayName : ComponentService.getComponentDisplayName,
-	getSummaryList : getSummaryList,
-	getDetailsList : getDetailsList,
-	getMsoFilterString : getMsoFilterString
+        initializeComponent: function (componentId) {
+            _this.componentId = ComponentService.initialize(componentId);
+        },
+        getComponentDisplayName: ComponentService.getComponentDisplayName,
+        getSummaryList: getSummaryList,
+        getDetailsList: getDetailsList,
+        getMsoFilterString: getMsoFilterString
     }
 }
 
-appDS2.factory("DetailsService", [ "$log", "DataService", "ComponentService",
-	"COMPONENT", "FIELD", "UtilityService", DetailsService ]);
+appDS2.factory("DetailsService", ["$log", "DataService", "ComponentService",
+    "COMPONENT", "FIELD", "UtilityService", DetailsService]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/msoService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/msoService.js
index 67211d4..273f8e9 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/msoService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/msoService.js
@@ -20,7 +20,7 @@
 
 "use strict";
 
-var MsoService = function($http, $log, $q, PropertyService, AaiService, UtilityService, COMPONENT, FIELD) {
+var MsoService = function($http, $log, $q, PropertyService, AaiService, UtilityService, COMPONENT, FIELD, moment) {
 
     var _this = this;
 
@@ -36,7 +36,7 @@
             timeout : PropertyService.getServerResponseTimeoutMsec()
         }).then(successCallbackFunction)["catch"]
         (UtilityService.runHttpErrorHandler);
-    }
+    };
 
     var checkValidStatus = function(response) {
         if (response.data.status < 200 || response.data.status > 202) {
@@ -55,7 +55,7 @@
         }
     };
 
-    var buildPayloadForServiceActivateDeactivate = function (model, userId, aicZone) {
+    var buildPayloadForServiceActivateDeactivate = function (model, userId) {
         var requestDetails = {
                 "modelInfo": {
                     "modelType": "service",
@@ -69,10 +69,8 @@
                     "requestorId": userId
                 },
                 "requestParameters": {
-                    "userParams": [{
-                        "name": "aic_zone",
-                        "value": aicZone
-                    }]
+                    // aicZone was sent from here
+                    "userParams": []
                 }
         };
 
@@ -83,14 +81,14 @@
     };
 
     var activateInstance = function(requestParams) {
-        var requestDetails = buildPayloadForServiceActivateDeactivate(requestParams.model, requestParams.userId, requestParams.aicZone);
+        var requestDetails = buildPayloadForServiceActivateDeactivate(requestParams.model, requestParams.userId);
 
         return sendPostRequest(COMPONENT.MSO_ACTIVATE_INSTANCE.replace('@serviceInstanceId', requestParams.instance.serviceInstanceId),
             requestDetails);
     };
 
     var deactivateInstance = function(requestParams) {
-        var requestDetails = buildPayloadForServiceActivateDeactivate(requestParams.model, requestParams.userId, requestParams.aicZone);
+        var requestDetails = buildPayloadForServiceActivateDeactivate(requestParams.model, requestParams.userId);
 
         return sendPostRequest(COMPONENT.MSO_DEACTIVATE_INSTANCE.replace('@serviceInstanceId', requestParams.instance.serviceInstanceId),
             requestDetails);
@@ -154,7 +152,7 @@
             UtilityService.checkUndefined(COMPONENT.STATUS, response.data.status);
             checkValidStatus(response);
 
-            var list = response.data.entity.requestList
+            var list = response.data.entity.requestList;
             UtilityService.checkUndefined(FIELD.ID.REQUEST_LIST, list);
 
             var message = "";
@@ -168,8 +166,10 @@
                 if (status === undefined) {
                     message += addListEntry(FIELD.ID.REQUEST_STATUS, undefined) + "\n";
                 } else {
-                    message += addListEntry(FIELD.ID.TIMESTAMP, status.timestamp)
-                        + ",\n";
+                    if(status.finishTime) {
+                        message += addListEntry(FIELD.ID.TIMESTAMP, moment(new Date(status.finishTime)).format("ddd, DD MMM YYYY HH:mm:ss"))
+                            + ",\n";
+                    }
                     message += addListEntry(FIELD.ID.REQUEST_STATE, status.requestState)
                         + ",\n";
                     message += addListEntry(FIELD.ID.REQUEST_STATUS,
@@ -203,7 +203,7 @@
                 if (status === undefined) {
                     message += addListEntry(FIELD.ID.REQUEST_STATUS, undefined) + "\n";
                 } else {
-                    message += addListEntry(FIELD.ID.TIMESTAMP, status.timestamp)
+                    message += addListEntry(FIELD.ID.TIMESTAMP, moment(new Date()).format("ddd, DD MMM YYYY HH:mm:ss"))
                         + ",\n";
                     message += addListEntry(FIELD.ID.REQUEST_STATE, status.requestState)
                         + ",\n";
@@ -272,7 +272,7 @@
                     showFunction(FIELD.ERROR.SYSTEM_FAILURE, error.message);
                     break;
                 case "msoFailure":
-                    showFunction(FIELD.ERROR.MSO, "")
+                    showFunction(FIELD.ERROR.MSO, "");
                     break;
                 default:
                     showFunction(FIELD.ERROR.SYSTEM_FAILURE);
@@ -341,15 +341,16 @@
                             }
                         },
                         {
-                            "relatedInstance": {
-                                "instanceId": requestParams.configurationByPolicy ?
-                                    requestParams.portMirroringConfigFields.destinationInstance.properties['pnfName']:
-                                    requestParams.portMirroringConfigFields.destinationInstance.properties['vnf-id'],
+                            "relatedInstance": requestParams.configurationByPolicy ? {
+                                "instanceName": requestParams.portMirroringConfigFields.destinationInstance.properties['pnfName'],
                                 "instanceDirection": "destination",
-                                "modelInfo":
-                                    requestParams.configurationByPolicy ?
-                                        {"modelType": "pnf"} :
-                                        modelInfoOf(requestParams.portMirroringConfigFields.destinationInstance)
+                                "modelInfo": {
+                                    "modelType": "pnf"
+                                }
+                            } : {
+                                "instanceId": requestParams.portMirroringConfigFields.destinationInstance.properties['vnf-id'],
+                                "instanceDirection": "destination",
+                                "modelInfo": modelInfoOf(requestParams.portMirroringConfigFields.destinationInstance)
                             }
                         }
                     ],
@@ -375,13 +376,31 @@
             });
             return deferred.promise;
         },
-
-        toggleConfigurationStatus: function(requestParams) {
+        deleteConfiguration: function(requestParams, configuration) {
 
             var requestDetails = {
                 "modelInfo": requestParams.configurationModel,
                 "cloudConfiguration": {
-                    "lcpCloudRegionId": "mdt1"
+                    "lcpCloudRegionId": configuration.configData.cloudRegionId
+                },
+                "requestInfo": {
+                    "source": "VID",
+                    "requestorId": requestParams.userId
+                },
+                "requestParameters": {
+                    "userParams": []
+                }
+            };
+
+            var url = "mso/mso_delete_configuration/" + requestParams.serviceInstanceId + "/configurations/" + requestParams.configurationId;
+            return sendPostRequest(url, requestDetails);
+        },
+        toggleConfigurationStatus: function(requestParams, configuration) {
+
+            var requestDetails = {
+                "modelInfo": requestParams.configurationModel,
+                "cloudConfiguration": {
+                    "lcpCloudRegionId": configuration && configuration.configData ? configuration.configData.cloudRegionId : null
                 },
                 "requestInfo": {
                     "source": "VID",
@@ -412,11 +431,12 @@
             return sendPostRequest(url, requestDetails);
         },
 
-        togglePortStatus: function(requestParams) {
+        togglePortStatus: function(requestParams, configuration, defaultParams) {
+
             var requestDetails = {
                 "modelInfo": requestParams.configurationModel,
                 "cloudConfiguration": {
-                    "lcpCloudRegionId": "mdt1"
+                    "lcpCloudRegionId": configuration && configuration.configData ? configuration.configData.cloudRegionId : null
                 },
                 "requestInfo": {
                     "source": "VID",
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/utilityService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/utilityService.js
index 942bd79..b8ef406 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/utilityService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/utilityService.js
@@ -63,29 +63,24 @@
  * string for some known conditions.
  */
 
-var UtilityService = function($log, DataService, PARAMETER) {
+var UtilityService = function($log, DataService, PARAMETER, _) {
 
     var _this = this;
+
+    function hasCustomizationUuidFields(mapOfVfs) {
+        return _.some(mapOfVfs, function (o) {
+            return _.has(o, "customizationUuid");
+        });
+    }
+
     var convertModel = function (serviceModel) {
 
-        var isNewFlow = false;
+        var isNewFlow =
+			hasCustomizationUuidFields(serviceModel.networks)
+			|| hasCustomizationUuidFields(serviceModel.pnfs)
+			|| hasCustomizationUuidFields(serviceModel.vnfs)
+			|| hasCustomizationUuidFields(serviceModel.configurations);
 
-        for (var networkCustomizationName in serviceModel.networks) {
-            var networkModel = serviceModel.networks[networkCustomizationName];
-            if ( networkModel.customizationUuid != null ) {
-                isNewFlow = true;
-                break;
-            }
-        }
-        if ( !isNewFlow ) {
-            for (var vnfCustomizationName in serviceModel.vnfs) {
-                var vnfModel = serviceModel.vnfs[vnfCustomizationName];
-                if ( vnfModel.customizationUuid != null ) {
-                    isNewFlow = true;
-                    break;
-                }
-            }
-        }
         if ( isNewFlow ) {
             return (convertNewModel (serviceModel) );
         }
@@ -179,7 +174,7 @@
         	element.isPnf= true;
         	element.modelCustomizationName= key;
         });
-        var mergedVnfs = Object.assign(serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
+        var mergedVnfs = Object.assign({}, serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
 
 		for (var vnfCustomizationName in mergedVnfs) {
 			var vnfModel = mergedVnfs[vnfCustomizationName];
@@ -279,13 +274,13 @@
 				convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfFunction"] = vnf_function;
 				convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfCode"] = vnf_code;
 				//
-				for (var vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
-					var vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
+				for (var vfModuleCustomizationName in vnfModel.vfModules) {
+					var vfModuleModel = vnfModel.vfModules[vfModuleCustomizationName];
 					convertedAsdcModel.vnfs[vnfCustomizationUuid].vfModules[vfModuleModel.customizationUuid] = vfModuleModel;
 				}
 				
-				for (var volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
-					var volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
+				for (var volumeGroupCustomizationName in mergedVnfs[vnfCustomizationName].volumeGroups) {
+					var volumeGroupModel = mergedVnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
 					convertedAsdcModel.vnfs[vnfCustomizationUuid].volumeGroups[volumeGroupModel.customizationUuid] = volumeGroupModel;
 				}
 			}
@@ -391,7 +386,7 @@
             element.isPnf= true;
             element.modelCustomizationName= key;
         });
-        var mergedVnfs = Object.assign(serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
+        var mergedVnfs = Object.assign({}, serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
 
 		for (var vnfCustomizationName in mergedVnfs) {
 			var vnfModel = mergedVnfs[vnfCustomizationName];
@@ -458,13 +453,13 @@
 				convertedAsdcModel.vnfs[vnfModel.uuid].displayInputs=vnfModelDisplayInputs;
 			}
 			
-			for (var vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
-				var vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
+			for (var vfModuleCustomizationName in vnfModel.vfModules) {
+				var vfModuleModel = vnfModel.vfModules[vfModuleCustomizationName];
 				convertedAsdcModel.vnfs[vnfModel.uuid].vfModules[vfModuleModel.uuid] = vfModuleModel;
 			}
 			
-			for (var volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
-				var volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
+			for (var volumeGroupCustomizationName in vnfModel.volumeGroups) {
+				var volumeGroupModel = vnfModel.volumeGroups[volumeGroupCustomizationName];
 				convertedAsdcModel.vnfs[vnfModel.uuid].volumeGroups[volumeGroupModel.uuid] = volumeGroupModel;
 			}
 		}
@@ -682,4 +677,4 @@
 }
 
 //app.factory("UtilityService", UtilityService);
-appDS2.factory("UtilityService", [ "$log", "DataService", "PARAMETER", UtilityService ]);
+appDS2.factory("UtilityService", [ "$log", "DataService", "PARAMETER", "_", UtilityService ]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/change-management.html b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/change-management.html
index 65c8ec7..4f7cc3c 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/change-management.html
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/change-management.html
@@ -1,3 +1,4 @@
+<script src="../controller/change-management.controller.js"></script>
 <link rel="stylesheet" type="text/css" href="app/vid/styles/change-management.css" />
 <link rel="stylesheet" type="text/css" href="app/vid/styles/change-management-icons.css" />
 <div class="changes-management">
@@ -46,20 +47,29 @@
                             </thead>
                             <tbody ng-show="!collapseInProgress">
 
-                                <tr  data-tests-id="active-table-cm-row" ng-repeat="changeManagement in vm.changeManagements | changeManagementsByStatuses:{statuses: ['FAILED', 'IN_PROGRESS', 'PENDING']}">
-                                    <th scope="row">{{changeManagement.instanceReferences.vnfInstanceName || 'No-Instance-Name'}}</th>
+                                <tr  data-tests-id="active-table-cm-row" ng-repeat="changeManagement in vm.changeManagements | changeManagementsByStatuses:{statuses: ['COMPLETE'], notContains: true}">
+                                    <th scope="row">{{
+                                        changeManagement.vnfNameFromScheduler ||
+                                        changeManagement.instanceReferences.vnfInstanceId ||
+                                        'No-Instance-Name'
+                                        }}</th>
                                     <td>{{changeManagement.requestScope}}</td>
                                     <td>{{changeManagement.requestType}}</td>
                                     <td>{{changeManagement.startTime}}</td>
-                                    <td class="centered" ng-if="changeManagement.requestStatus.requestState == 'FAILED'"><span class="icon-x" ng-click="vm.openFailedModal({details: changeManagement.requestStatus.statusMessage, job: changeManagement})"></span></td>
-                                    <td class="centered" ng-if="changeManagement.requestStatus.requestState == 'IN_PROGRESS'"><span class="icon-process" ng-click="vm.openInProgressModal({details: changeManagement.requestStatus.statusMessage, job: changeManagement})"></span></td>
-                                    <td class="centered" ng-if="changeManagement.requestStatus.requestState == 'PENDING'"><span class="icon-alert" ng-click="vm.openAlertModal({details: changeManagement.requestStatus.statusMessage, job: changeManagement})"></span></td>
+                                    <td class="centered" ng-if="changeManagement.requestStatus.requestState.toUpperCase() === 'FAILED'"><span class="icon-x" ng-click="vm.openFailedModal($event, {details: changeManagement.requestStatus.statusMessage, job: changeManagement})"></span></td>
+                                    <td class="centered" ng-if="changeManagement.requestStatus.requestState.toUpperCase() === 'IN_PROGRESS'"><span class="icon-process" ng-click="vm.openInProgressModal($event, {details: changeManagement.requestStatus.statusMessage, job: changeManagement})"></span></td>
+                                    <td class="centered"
+                                        ng-if="['PENDING_MANUAL_TASK','PENDING'].indexOf(changeManagement.requestStatus.requestState.toUpperCase()) !== -1"
+                                    ><span class="icon-alert" ng-click="vm.openAlertModal($event, {details: changeManagement.requestStatus.statusMessage, job: changeManagement})"></span></td>
+                                    <td class="centered"
+                                        ng-if="['FAILED','IN_PROGRESS','PENDING_MANUAL_TASK','PENDING'].indexOf(changeManagement.requestStatus.requestState.toUpperCase()) == -1"
+                                    ><span class="icon-alert" ng-click="vm.openFailedModal($event, {requestState: changeManagement.requestStatus.requestState, details: changeManagement.requestStatus.statusMessage, job: changeManagement})"></span></td>
                                 </tr>
                             </tbody>
                         </table>
                         </div>
                         <div class="table-wrapper">
-                        <table ng-if="vm.hasScheduler" class="table table-bordered"  data-tests-id="pending-table-cm" id="pending-table">
+                        <table class="table table-bordered"  data-tests-id="pending-table-cm" id="pending-table">
                             <thead ng-click="collapsePending=!collapsePending">
                             <tr class="table-headline-row">
                                 <th class="col-md-6">
@@ -96,8 +106,12 @@
                                     <td>{{changeManagement.scheduleRequest.domainData[1].value}}</td>
                                     <td>{{changeManagement.scheduleRequest.createDateTime }}</td><!--| date:"MM/dd/yyyy HH:mm:ss"-->
                                     <td>{{changeManagement.scheduleRequest.status}}</td>
-                                    <td class="centered"><span class="cancel-action" ng-class="{'icon-pending':changeManagement.scheduleRequest.status!=='Deleted', 'icon-deleted': changeManagement.scheduleRequest.status=='Deleted'}"
-                                                                ng-click="vm.openPendingModal($event, changeManagement)"></span></td>
+                                    <td class="centered"><span class="cancel-action"
+                                                               ng-class="{'icon-pending':changeManagement.scheduleRequest.status!=='Deleted', 'icon-deleted': changeManagement.scheduleRequest.status=='Deleted'}"
+                                                               ng-click="vm.openPendingModal($event, changeManagement)"
+                                                               ng-show="vm.isChangeManagementDeleted(changeManagement)"
+                                                               data-tests-id="icon-status-{{changeManagement.scheduleRequest.scheduleId}}"></span>
+                                    </td>
                                 </tr>
                             </tbody>
                         </table>
@@ -127,7 +141,11 @@
                                 <th></th>
                             </tr>
                             <tr ng-repeat="changeManagement in vm.changeManagements | changeManagementsByStatuses:{statuses: ['COMPLETE']}">
-                                <th scope="row">{{changeManagement.instanceReferences.vnfInstanceName || 'No-Instance-Name'}}</th>
+                                <th scope="row">{{
+                                    changeManagement.vnfNameFromScheduler ||
+                                    changeManagement.instanceReferences.vnfInstanceId ||
+                                    'No-Instance-Name'
+                                    }}</th>
                                 <td>{{changeManagement.requestScope}}</td>
                                 <td>{{changeManagement.requestType}}</td>
                                 <td>{{changeManagement.startTime}}</td>
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/creationDialog.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/creationDialog.htm
index ca13ca2..75f6b68 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/creationDialog.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/creationDialog.htm
@@ -1,40 +1,42 @@
-<div ng-controller="creationDialogController">
-
+<div  ng-controller="creationDialogController">
 	<div ng-show="isDialogVisible">
-		<div class="titleLine">
-			<img src="app/vid/images/spinner.gif"
-				ngx-visible="{{isSpinnerVisible}}"></img>
-			<h3 data-tests-id="create-modal-title">Create {{componentName}} -- {{createType}}</h3>
-		</div>
-
-		<div class="error" ng-show="isErrorVisible">
-			<img src="app/vid/images/error.png"></img>{{error}}
-		</div>
-
-		<div ngx-visible="{{isDataVisible}}">
-			<parameter-block control="summaryControl"></parameter-block>
-			<h4>
-				User Provided Data (<img class="requiredIndicator"
-					src="app/vid/images/asterisk.png" height='10' width='10'></img> indicates required field)
-			</h4>
-			<parameter-block control="userProvidedControl"
-				callback="userParameterChanged(id);" editable></parameter-block>
-			<div class="prompt">
-				<p>
-					Enter Data and <span>Confirm</span> to<br />Create <span>{{componentName}}</span>
-				</p>
-				<p>
-					<span>Cancel</span> to Return to Previous Page.<br />Data entered
-					will be lost
-				</p>
+		<iframe class="popup" scrolling="no" ng-if="!shouldShowOldPopup()" id="iframe_callback"  ng-src={{url}}></iframe>
+		<div ng-if="shouldShowOldPopup()">
+			<div class="titleLine">
+				<img src="app/vid/images/spinner.gif"
+					ngx-visible="{{isSpinnerVisible}}"></img>
+				<h3 data-tests-id="create-modal-title">Create {{componentName}} -- {{createType}}</h3>
 			</div>
 
-		</div>
-		<div class="buttonRow">
-			<button data-tests-id="confirmButton" ngx-enabled="{{isConfirmEnabled}}" att-button size="small"
-				ng-click="confirm();">Confirm</button>
-			<button type="button" data-tests-id="cancelButton" ng-click="cancel();" att-button
-				btn-type="primary" size="small">Cancel</button>
+			<div class="error" ng-show="isErrorVisible">
+				<img src="app/vid/images/error.png"></img>{{error}}
+			</div>
+
+			<div ngx-visible="{{isDataVisible}}">
+				<parameter-block control="summaryControl"></parameter-block>
+				<h4>
+					User Provided Data (<img class="requiredIndicator"
+						src="app/vid/images/asterisk.png" height='10' width='10'></img> indicates required field)
+				</h4>
+				<parameter-block control="userProvidedControl"
+					callback="userParameterChanged(id);" editable></parameter-block>
+				<div class="prompt">
+					<p>
+						Enter Data and <span>Confirm</span> to<br />Create <span>{{componentName}}</span>
+					</p>
+					<p>
+						<span>Cancel</span> to Return to Previous Page.<br />Data entered
+						will be lost
+					</p>
+				</div>
+
+			</div>
+			<div class="buttonRow">
+				<button data-tests-id="confirmButton" ngx-enabled="{{isConfirmEnabled}}" att-button size="small"
+					ng-click="confirm();">Confirm</button>
+				<button type="button" data-tests-id="cancelButton" ng-click="cancel();" att-button
+					btn-type="primary" size="small">Cancel</button>
+			</div>
 		</div>
 	</div>
 
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/detailsDialog.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/detailsDialog.htm
index 0e72e77..7aebfd3 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/detailsDialog.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/detailsDialog.htm
@@ -38,10 +38,10 @@
 
 	<h4>Instantiation Transactions</h4>
 
-	<pre class="log">{{log}}</pre>
+	<pre data-tests-id="detailsLog" class="log">{{log}}</pre>
 
 	<div class="buttonRow">
-		<button type="button" ng-click="close();" att-button
+			<button type="button" ng-click="close();" att-button data-tests-id="detailsCloseBtn"
 			btn-type="primary" size="small">Close</button>
 	</div>
 
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/iframe.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/iframe.htm
new file mode 100644
index 0000000..a708af9
--- /dev/null
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/iframe.htm
@@ -0,0 +1 @@
+<iframe ng-src="{{url}}"></iframe>
\ No newline at end of file
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/iframeDialog.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/iframeDialog.htm
new file mode 100644
index 0000000..3b2da52
--- /dev/null
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/iframeDialog.htm
@@ -0,0 +1,6 @@
+<div  ng-controller="iframeDialogController">
+	<div ng-if="isDialogVisible">
+		<iframe class="popup iframeDialog" scrolling="no" id="iframe_callback"  ng-src={{url}}></iframe>
+	</div>
+	<div ng-include="'app/vid/scripts/view-models/msoCommit.htm'"></div>
+</div>
\ No newline at end of file
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/instantiate.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/instantiate.htm
index 0740c07..64f7132 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/instantiate.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/instantiate.htm
@@ -18,7 +18,7 @@
   ============LICENSE_END=========================================================
   -->
 
-<div ng-controller="InstantiationController">
+<div>
 
 	<div popup-window class="popupContents" ngx-show="{{popup.isVisible}}"
 		 ng-cloak>
@@ -26,6 +26,7 @@
 		<div ng-include="'app/vid/scripts/view-models/deleteResumeDialog.htm'"></div>
 		<div ng-include="'app/vid/scripts/view-models/detailsDialog.htm'"></div>
 		<div ng-include="'app/vid/scripts/view-models/statusDialog.htm'"></div>
+	    <div ng-include="'app/vid/scripts/view-models/iframeDialog.htm'"></div>
 	</div>
 	<div ng-controller="aaiSubscriberController" ng-init="getComponentList() ">
 		<div class="statusLine" ng-class="{true:'aaiVisible', false:'aaiHidden'}[isSpinnerVisible]">
@@ -33,272 +34,441 @@
 			<label>Status:</label><span class="status">{{status}}</span>
 		</div>
 
-		<div ng-if="errorMsg != null"><font color='red'>{{errorMsg}}<pre>{{errorDetails | json}}</pre></font></div>
+        <div ng-if="errorMsg != null" style="white-space: pre-line"><font color='red'>{{errorMsg}}
+            <pre>{{errorDetails | json}}</pre>
+        </font></div>
 
-		<h1 class="heading1" style="margin-top: 20px;">{{isPermitted ? "View/Edit" : "View"}} Service Instance</h1>
-		<a class="btn btn-primary btn-xs pull-right" ng-click="reloadRoute();" ><span class="glyphicon glyphicon-refresh"></span></a>
+        <h1 class="heading1" style="margin-top: 20px;">{{isPermitted ? "View/Edit" : "View"}} Service Instance</h1>
+        <a class="btn btn-primary btn-xs pull-right" ng-click="reloadRoute();"><span
+                class="glyphicon glyphicon-refresh"></span></a>
 
-		<br>
+        <br>
 
-		<center>
-			<table att-table border="1" ng-model="service">
-				<tr>
-					<th style="text-align: center" width="33%">SUBSCRIBER:
-						{{service.instance.subscriberName}}</th>
-					<th style="text-align: center" width="34%">SERVICE TYPE:
-						{{service.instance.serviceType}}</th>
-					<th data-tests-id="service-instanceId-th-id" style="text-align: center" width="33%">SERVICE INSTANCE
-						ID: {{service.instance.serviceInstanceId}}</th>
-				<tr>
-				<tr>
-					<td colspan='3' style="text-align: center">Service Instance
-						Name: {{service.instance.name || "Not defined"}}
-					</td>
-				<tr>
-			</table>
+        <center>
+            <table att-table border="1" ng-model="service">
+                <tr>
+                    <th style="text-align: center" width="33%">SUBSCRIBER:
+                        {{service.instance.subscriberName}}
+                    </th>
+                    <th style="text-align: center" width="34%">SERVICE TYPE:
+                        {{service.instance.serviceType}}
+                    </th>
+                    <th data-tests-id="service-instanceId-th-id" style="text-align: center" width="33%">SERVICE INSTANCE
+                        ID: {{service.instance.serviceInstanceId}}
+                    </th>
+                <tr>
+                <tr>
+                    <td colspan='3' style="text-align: center">Service Instance
+                        Name: {{service.instance.name || "Not defined"}}
+                    </td>
+                <tr>
+            </table>
 
-		</center>
+        </center>
 
-		<div ui-tree data-drag-enabled="false" data-nodrop-enabled="true" style="margin: 30px">
+        <div ui-tree data-drag-enabled="false" data-nodrop-enabled="true" style="margin: 30px">
 
-			<ol ui-tree-nodes="" ng-model="service"  >
-				<li ng-repeat="aService in [service]" ui-tree-node>
-					<div ui-tree-handle class="tree-node tree-node-content">
-						<a class="btn btn-success btn-xs" ng-if="(aService.instance.vnfs && aService.instance.vnfs.length > 0) ||(aService.instance.pnfs && aService.instance.pnfs.length > 0) || (aService.instance.networks && aService.instance.networks.length > 0)" data-nodrag ng-click="this.toggle()">
-							<span class="glyphicon" ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span>
-						</a>
-						SERVICE INSTANCE: {{aService.instance.name}} | ORCH STATUS: {{serviceOrchestrationStatus}}
-						<a ng-if="((isMacro()) ||  (isObjectEmpty(aService.instance.vnfs) && isObjectEmpty(aService.instance.networks) && isObjectEmpty(aService.instance.pnfs))) && isPermitted" data-tests-id="deleteServiceButton" class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="deleteService(aService.instance);">
-							<span class="glyphicon glyphicon-remove"></span>
-						</a>
-						<div class="pull-right btn-group" ng-if="(aService.convertedModel.vnfs||aService.convertedModel.vnfs) &&(!isObjectEmpty(aService.convertedModel.pnfs)||!isObjectEmpty(aService.convertedModel.pnfs))  && !aService.convertedModel.isNewFlow && isPermitted">
-							<button type="button" data-tests-id="addVNFButton" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-								Add node instance<span class="caret"></span>
-							</button>
-							<ul class="dropdown-menu" ng-model="aService.convertedModel.vnfs">
-								<a role="menuitem" ng-repeat="(vnfUuid, vnf) in aService.convertedModel.vnfs" data-tests-id="addVNFOption-{{vnf.modelCustomizationName}}" ng-click="addVnfInstance(vnf, aService.instance.vnfs)">{{vnf.modelCustomizationName}}</a>
+            <ol ui-tree-nodes="" ng-model="service">
+                <li ng-repeat="aService in [service]" ui-tree-node>
 
-							</ul>
-						</div>
-						<div class="pull-right btn-group" ng-if="aService.convertedModel.vnfs && !isObjectEmpty(aService.convertedModel.vnfs) && aService.convertedModel.isNewFlow && isPermitted">
-							<button type="button" data-tests-id="addVNFButton" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-								Add node instance<span class="caret"></span>
-							</button>
-							<ul class="dropdown-menu" ng-model="aService.convertedModel.vnfs" data-tests-id="addVnfsDropdown">
-								<li role="menuitem" ng-repeat="(vnfUuid, vnf) in aService.convertedModel.vnfs">
-									<a data-tests-id="addVNFOption-{{vnf.modelCustomizationName}}" ng-click="addVnfInstance(vnf, aService.instance.vnfs)">{{vnf.modelCustomizationName}} {{vnf.nfType}} {{vnf.nfRole}} {{vnf.nfFunction}} {{vnf.nfCode}}</a>
-								</li>
-							</ul>
-						</div>
-						<!--  <div class="pull-right btn-group" ng-if="aService.model.networks && !equals(aService.model.networks, {})">-->
-						<div class="pull-right btn-group" ng-if="aService.convertedModel.networks && (!(isObjectEmpty(aService.convertedModel.networks))) && isPermitted">
-							<!--<div class="pull-right btn-group" ng-if="aService.model.networks">-->
-							<button type="button" data-tests-id="addNetworkButton" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-								Add Network<span class="caret"></span>
-							</button>
-							<ul class="dropdown-menu" ng-model="aService.convertedModel.networks">
-								<li ng-repeat="(networkUuid, network) in aService.convertedModel.networks">
-									<a data-tests-id="addNetworkOption-{{network.modelCustomizationName}}" ng-click="addNetworkInstance(network, aService.instance.vnfs)">{{network.modelCustomizationName}}</a>
-								</li>
-							</ul>
-						</div>
-						<a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="describeService(aService.instance)" style="margin-right: 8px;">
-							<span class="glyphicon glyphicon-info-sign"></span>
-						</a>
-						<a data-tests-id="deactivateButton" ng-disabled="!isActivateDeactivateEnabled('deactivate')" class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="deactivateMSOInstance()" style="margin-right: 8px;">
-							Deactivate
-						</a>
-						<a data-tests-id="activateButton" ng-disabled="!isActivateDeactivateEnabled('activate')" class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="activateMSOInstance()" style="margin-right: 8px;">
-							Activate
-						</a>
-					</div>
-					<ol ui-tree-nodes="" ng-model="aService.instance.vnfs" ng-class="{hidden: collapsed}">
-						<li ng-repeat="vnf in aService.instance.vnfs" ui-tree-node>
-							<div ui-tree-handle class="tree-node tree-node-content">
-								<a class="btn btn-success btn-xs" ng-if="(vnf.vfModules && vnf.vfModules.length > 0) || (vnf.volumeGroups && vnf.volumeGroups.length > 0)" data-nodrag ng-click="this.toggle()">
-									<span class="glyphicon" ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span>
-								</a>
-								VNF: {{vnf.name}} | TYPE: {{vnf.nodeType}} | ORCH STATUS: {{vnf.nodeStatus}}
+                    <div ng-if="isCR && collectionResource != null">
+                        <div ui-tree-handle class="tree-node tree-node-content">
+                            <a class="btn btn-success btn-xs" data-nodrag ng-click="this.toggle()">
+                                <span class="glyphicon"
+                                      ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span>
+                            </a>
+                            SERVICE INSTANCE: {{aService.instance.name}} | ORCH STATUS: {{serviceOrchestrationStatus}}
+                            <a ng-if="isPermitted" data-tests-id="deleteServiceButton"
+                               class="pull-right btn btn-danger btn-xs" data-nodrag
+                               ng-click="deleteService(aService.instance);">
+                                <span class="glyphicon glyphicon-remove"></span>
+                            </a>
 
-								<a ng-if="(vnf.vfModules.length == 0) && (vnf.volumeGroups.length == 0) && isPermitted" data-tests-id="deleteVNFButton" class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="deleteVnf(aService.instance, vnf)">
-									<span class="glyphicon glyphicon-remove"></span>
-								</a>
-								<!--  <div class="pull-right btn-group" ng-if="aService.convertedModel.vnfs[vnf.object['model-invariant-id']][vnf.object['model-version-id']].vfModules">-->
-								<div class="pull-right btn-group" ng-if="(hasVfModules(vnf.object) && (aService.convertedModel.isNewFlow)) && isPermitted">
+                            <a class="pull-right btn btn-primary btn-xs" data-tests-id="infoServiceButton" data-nodrag
+                               ng-click="describeService(aService.instance)" style="margin-right: 8px;">
+                                <span class="glyphicon glyphicon-info-sign service-info"></span>
+                            </a>
+                        </div>
+                        <ol ui-tree-nodes="" ng-model="collections" ng-class="{hidden: collapsed}">
+                            <li ng-repeat="collection in collections" ui-tree-node>
+                                <div ui-tree-handle class="tree-node tree-node-content" data-tests-id="collectionDiv">
+                                    <a class="btn btn-success btn-xs" data-nodrag ng-click="this.toggle()">
+                                        <span class="glyphicon"
+                                              ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span>
+                                    </a>
+                                    COLLECTION: {{collection["collection-name"]}} | TYPE:
+                                    {{collection["collection-type"]}}
+                                </div>
+                                <ol ui-tree-nodes="" ng-model="networks" ng-class="{hidden: collapsed}">
+                                    <li ng-repeat="network in networks" ui-tree-node>
+                                        <div ui-tree-handle class="tree-node tree-node-content"
+                                             data-tests-id="collectionNetworkDiv">
+                                            NETWORK INSTANCE GROUP: {{network["network-id"]}} | ROLE:
+                                            {{network["network-role"]}} | TYPE: {{network["network-type"]}} | # OF
+                                            NETWORKS: {{collectionResource.networks.length}}
+                                        </div>
+                                    </li>
+                                </ol>
+                            </li>
+                        </ol>
+                    </div>
+                    <div ng-if="!isCR">
+                        <div ui-tree-handle class="tree-node tree-node-content">
+                            <a class="btn btn-success btn-xs"
+                               ng-if="(aService.instance.vnfs && aService.instance.vnfs.length > 0) ||(aService.instance.pnfs && aService.instance.pnfs.length > 0) || (aService.instance.networks && aService.instance.networks.length > 0)"
+                               data-nodrag ng-click="this.toggle()">
+                                <span class="glyphicon"
+                                      ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span>
+                            </a>
+                            SERVICE INSTANCE: {{aService.instance.name}} | ORCH STATUS: {{serviceOrchestrationStatus}}
+                            <a ng-if="((isMacro()) ||  (isObjectEmpty(aService.instance.vnfs) && isObjectEmpty(aService.instance.networks) && isObjectEmpty(aService.instance.pnfs))) && isPermitted"
+                               data-tests-id="deleteServiceButton" class="pull-right btn btn-danger btn-xs" data-nodrag
+                               ng-click="deleteService(aService.instance, serviceOrchestrationStatus);">
+                                <span class="glyphicon glyphicon-remove"></span>
+                            </a>
+                            <div class="pull-right btn-group"
+                                 ng-if="(aService.convertedModel.vnfs||aService.convertedModel.vnfs) &&(!isObjectEmpty(aService.convertedModel.pnfs)||!isObjectEmpty(aService.convertedModel.pnfs))  && !aService.convertedModel.isNewFlow && isPermitted">
+                                <button type="button" data-tests-id="addVNFButton"
+                                        class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown"
+                                        aria-haspopup="true" aria-expanded="false">
+                                    Add node instance<span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu" ng-model="aService.convertedModel.vnfs">
+                                    <a role="menuitem" ng-repeat="(vnfUuid, vnf) in aService.convertedModel.vnfs"
+                                       data-tests-id="addVNFOption-{{vnf.modelCustomizationName}}"
+                                       ng-click="addVnfInstance(vnf, aService.instance.vnfs)">{{vnf.modelCustomizationName}}</a>
 
-									<button type="button" data-tests-id="addVFModuleButton" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-										Add VF-Module<span class="caret"></span>
-									</button>
-									<ul class="dropdown-menu" ng-model="vfModule" >
-										<a ng-repeat="(vfModuleCustomizationUuid, vfModule) in aService.convertedModel.vnfs[vnf.object['model-customization-id']].vfModules" data-tests-id="addVFModuleOption-{{vfModule.modelCustomizationName}}" ng-click="addVfModuleInstance(vnf, vfModule)">{{vfModule.modelCustomizationName}} </a>
-									</ul>
-								</div>
+                                </ul>
+                            </div>
+                            <div class="pull-right btn-group"
+                                 ng-if="aService.convertedModel.vnfs && !isObjectEmpty(aService.convertedModel.vnfs) && aService.convertedModel.isNewFlow && isPermitted">
+                                <button type="button" data-tests-id="addVNFButton"
+                                        class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown"
+                                        aria-haspopup="true" aria-expanded="false">
+                                    Add node instance<span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu" ng-model="aService.convertedModel.vnfs"
+                                    data-tests-id="addVnfsDropdown">
+                                    <li role="menuitem" ng-repeat="(vnfUuid, vnf) in aService.convertedModel.vnfs">
+                                        <a data-tests-id="addVNFOption-{{vnf.modelCustomizationName}}"
+                                           ng-click="addVnfInstance(vnf, aService.instance.vnfs)">{{vnf.modelCustomizationName}}
+                                            {{vnf.nfType}} {{vnf.nfRole}} {{vnf.nfFunction}} {{vnf.nfCode}}</a>
+                                    </li>
+                                </ul>
+                            </div>
+                            <!--  <div class="pull-right btn-group" ng-if="aService.model.networks && !equals(aService.model.networks, {})">-->
+                            <div class="pull-right btn-group"
+                                 ng-if="aService.convertedModel.networks && (!(isObjectEmpty(aService.convertedModel.networks))) && isPermitted">
+                                <!--<div class="pull-right btn-group" ng-if="aService.model.networks">-->
+                                <button type="button" data-tests-id="addNetworkButton"
+                                        class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown"
+                                        aria-haspopup="true" aria-expanded="false">
+                                    Add Network<span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu" ng-model="aService.convertedModel.networks">
+                                    <li ng-repeat="(networkUuid, network) in aService.convertedModel.networks">
+                                        <a data-tests-id="addNetworkOption-{{network.modelCustomizationName}}"
+                                           ng-click="addNetworkInstance(network, aService.instance.vnfs)">{{network.modelCustomizationName}}</a>
+                                    </li>
+                                </ul>
+                            </div>
+                            <a class="pull-right btn btn-primary btn-xs" data-nodrag
+                               ng-click="describeService(aService.instance)" style="margin-right: 8px;">
+                                <span class="glyphicon glyphicon-info-sign service-info"></span>
+                            </a>
+                            <a data-tests-id="deactivateButton" ng-disabled="!isActivateDeactivateEnabled('deactivate')"
+                               class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="deactivateMSOInstance()"
+                               style="margin-right: 8px;">
+                                Deactivate
+                            </a>
+                            <a data-tests-id="activateButton" ng-disabled="!isActivateDeactivateEnabled('activate')"
+                               class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="activateMSOInstance()"
+                               style="margin-right: 8px;">
+                                Activate
+                            </a>
+                            <a data-tests-id="showAssignmentsButton" ng-disabled="!isShowAssignmentsEnabled()"
+                               class="pull-right btn btn-primary btn-xs" data-nodrag style="margin-right: 8px;"
+                               target="_blank" ng-href="{{showAssignmentsSDNC()}}">
+                                Show Assignments
+                            </a>
+                            <a data-tests-id="verifyServiceButton" ng-if="isShowVerifyService()" ng-disabled="!isEnableVerifyService()"
+                               class="pull-right btn btn-primary btn-xs" data-nodrag style="margin-right: 8px;"
+                               target="_blank" ng-click="activateVerifyService()">
+                                Verify Service
+                            </a>
+                        </div>
+                        <ol ui-tree-nodes="" ng-model="aService.instance.vnfs" ng-class="{hidden: collapsed}">
+                            <li ng-repeat="vnf in aService.instance.vnfs" ui-tree-node>
+                                <div ui-tree-handle class="tree-node tree-node-content">
+                                    <a class="btn btn-success btn-xs"
+                                       ng-if="(vnf.vfModules && vnf.vfModules.length > 0) || (vnf.volumeGroups && vnf.volumeGroups.length > 0)"
+                                       data-nodrag ng-click="this.toggle()">
+                                        <span class="glyphicon"
+                                              ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span>
+                                    </a>
+                                    VNF: {{vnf.name}} | TYPE: {{vnf.nodeType}} | ORCH STATUS: {{vnf.nodeStatus}}
+
+                                    <a ng-if="(vnf.vfModules.length == 0) && (vnf.volumeGroups.length == 0) && isPermitted"
+                                       data-tests-id="deleteVNFButton" class="pull-right btn btn-danger btn-xs"
+                                       data-nodrag ng-click="deleteVnf(aService.instance, vnf)">
+                                        <span class="glyphicon glyphicon-remove"></span>
+                                    </a>
+                                    <!--  <div class="pull-right btn-group" ng-if="aService.convertedModel.vnfs[vnf.object['model-invariant-id']][vnf.object['model-version-id']].vfModules">-->
+                                    <div class="pull-right btn-group"
+                                         ng-if="(hasVfModules(vnf.object) && (aService.convertedModel.isNewFlow)) && isPermitted">
+
+                                        <button type="button" data-tests-id="addVFModuleButton"
+                                                class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown"
+                                                aria-haspopup="true" aria-expanded="false">
+                                            Add VF-Module<span class="caret"></span>
+                                        </button>
+                                        <ul class="dropdown-menu" ng-model="vfModule">
+                                            <a ng-repeat="(vfModuleCustomizationUuid, vfModule) in aService.convertedModel.vnfs[vnf.object['model-customization-id']].vfModules"
+                                               data-tests-id="addVFModuleOption-{{vfModule.modelCustomizationName}}"
+                                               ng-click="addVfModuleInstance(vnf, vfModule)">{{vfModule.modelCustomizationName}} </a>
+                                        </ul>
+                                    </div>
 
 
-								<div class="pull-right btn-group" ng-if="(hasVfModules(vnf.object) && (!(aService.convertedModel.isNewFlow))) && isPermitted">
+                                    <div class="pull-right btn-group"
+                                         ng-if="(hasVfModules(vnf.object) && (!(aService.convertedModel.isNewFlow))) && isPermitted">
 
-									<button type="button" data-tests-id="addVFModuleButton" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-										Add VF-Module<span class="caret"></span>
-									</button>
-									<ul class="dropdown-menu" ng-model="vnf">
-										<a ng-repeat="(vfModuleUuid, vfModule) in aService.convertedModel.vnfs[vnf.object['model-version-id']].vfModules" data-tests-id="addVFModuleOption-{{vfModule.modelCustomizationName}}" ng-click="addVfModuleInstance(vnf, vfModule)">{{vfModule.modelCustomizationName}}</a>
-										</li>
-									</ul>
+                                        <button type="button" data-tests-id="addVFModuleButton"
+                                                class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown"
+                                                aria-haspopup="true" aria-expanded="false">
+                                            Add VF-Module<span class="caret"></span>
+                                        </button>
+                                        <ul class="dropdown-menu" ng-model="vnf">
+                                            <a ng-repeat="(vfModuleUuid, vfModule) in aService.convertedModel.vnfs[vnf.object['model-version-id']].vfModules"
+                                               data-tests-id="addVFModuleOption-{{vfModule.modelCustomizationName}}"
+                                               ng-click="addVfModuleInstance(vnf, vfModule)">{{vfModule.modelCustomizationName}}</a>
+                                            </li>
+                                        </ul>
 
-								</div>
+                                    </div>
 
-								<div class="pull-right btn-group" ng-if="(hasVolumeGroups(vnf.object) && (aService.convertedModel.isNewFlow)) && isPermitted">
-									<button type="button" data-tests-id="addVolumeGroupButton" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-										Add Volume Group<span class="caret"></span>
-									</button>
-									<ul class="dropdown-menu" ng-model="volumeGroup" >
-										<a ng-repeat="(volumeGroupCustomizationUuid, volumeGroup) in aService.convertedModel.vnfs[vnf.object['model-customization-id']].volumeGroups" data-tests-id="addVolumeGroupOption-{{volumeGroup.modelCustomizationName}}" ng-click="addVolumeGroupInstance(vnf, volumeGroup)">{{volumeGroup.modelCustomizationName}}</a>
-									</ul>
-								</div>
+                                    <div class="pull-right btn-group"
+                                         ng-if="(hasVolumeGroups(vnf.object) && (aService.convertedModel.isNewFlow)) && isPermitted">
+                                        <button type="button" data-tests-id="addVolumeGroupButton"
+                                                class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown"
+                                                aria-haspopup="true" aria-expanded="false">
+                                            Add Volume Group<span class="caret"></span>
+                                        </button>
+                                        <ul class="dropdown-menu" ng-model="volumeGroup">
+                                            <a ng-repeat="(volumeGroupCustomizationUuid, volumeGroup) in aService.convertedModel.vnfs[vnf.object['model-customization-id']].volumeGroups"
+                                               data-tests-id="addVolumeGroupOption-{{volumeGroup.modelCustomizationName}}"
+                                               ng-click="addVolumeGroupInstance(vnf, volumeGroup)">{{volumeGroup.modelCustomizationName}}</a>
+                                        </ul>
+                                    </div>
 
-								<div class="pull-right btn-group" ng-if="(hasVolumeGroups(vnf.object) && (!(aService.convertedModel.isNewFlow))) && isPermitted">
+                                    <div class="pull-right btn-group"
+                                         ng-if="(hasVolumeGroups(vnf.object) && (!(aService.convertedModel.isNewFlow))) && isPermitted">
 
-									<button type="button" data-tests-id="addVolumeGroupButton" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-										Add Volume Group<span class="caret"></span>
-									</button>
-									<ul class="dropdown-menu" ng-model="vnf">
-										<a ng-repeat="(volumeGroupUuid, volumeGroup) in aService.convertedModel.vnfs[vnf.object['model-version-id']].volumeGroups" data-tests-id="addVolumeGroupOption-{{volumeGroup.modelCustomizationName}}" ng-click="addVolumeGroupInstance(vnf, volumeGroup)">{{volumeGroup.modelCustomizationName}}</a>
-										</li>
-									</ul>
+                                        <button type="button" data-tests-id="addVolumeGroupButton"
+                                                class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown"
+                                                aria-haspopup="true" aria-expanded="false">
+                                            Add Volume Group<span class="caret"></span>
+                                        </button>
+                                        <ul class="dropdown-menu" ng-model="vnf">
+                                            <a ng-repeat="(volumeGroupUuid, volumeGroup) in aService.convertedModel.vnfs[vnf.object['model-version-id']].volumeGroups"
+                                               data-tests-id="addVolumeGroupOption-{{volumeGroup.modelCustomizationName}}"
+                                               ng-click="addVolumeGroupInstance(vnf, volumeGroup)">{{volumeGroup.modelCustomizationName}}</a>
+                                            </li>
+                                        </ul>
 
-								</div>
+                                    </div>
 
-								<!-- VID-374/378 - switching-off feature <a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="getStatusOfVnf(aService.instance, vnf)" style="margin-right: 8px;">
-                                    <span class="glyphicon glyphicon-exclamation-sign"></span>
-                                </a>  -->
-								<a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="describeVnf(aService.instance, vnf)" style="margin-right: 8px;">
-									<span class="glyphicon glyphicon-info-sign"></span>
-								</a>
-							</div>
-							<ol ui-tree-nodes="" ng-model="vnf.vfModules" ng-class="{hidden: collapsed}">
-								<li ng-repeat="vfModule in vnf.vfModules" ui-tree-node>
-									<div ui-tree-handle class="tree-node tree-node-content">
-										<a class="btn btn-success btn-xs" ng-if="(vfModule.volumeGroups && vfModule.volumeGroups.length > 0)" data-nodrag ng-click="this.toggle()">
-											<span class="glyphicon" ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span>
-										</a>
-										VFMODULE: {{vfModule.name}} | TYPE: {{vfModule.nodeType}} | ORCH STATUS: {{vfModule.nodeStatus}}
-										<!--  -->
-										<a class="pull-right btn btn-danger btn-xs" ng-if="isPermitted" data-tests-id="deleteVFModuleButton-{{vfModule.name}}" data-nodrag ng-click="deleteVfModule(aService.instance, vfModule, vnf)">
-											<span class="glyphicon glyphicon-remove"></span>
-										</a>
-										<div class="pull-right btn-group">
-											<!--   <button type="button" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                                Attach Volume Group<span class="caret"></span>
-                                              </button>
-                                              <ul class="dropdown-menu" ng-model="vnf.volumeGroups">
-                                                <li ng-repeat="volumeGroup in vnf.availableVolumeGroups">
-                                                    <a ng-click="attachVolumeGroupInstance(vfModule, volumeGroup)">{{volumeGroup.name}}</a>
-                                                </li>
-                                              </ul> -->
-										</div>
-										<a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="describeVfModule(aService.instance, vfModule, vnf)" style="margin-right: 8px;">
-											<span class="glyphicon glyphicon-info-sign"></span>
-										</a>
-										<div class="resume" ng-if="isPermitted&&(vfModule.nodeStatus==resumeStatus)">
-											<a data-tests-id="resumeVFModuleButton-{{vfModule.name}}" class="pull-right btn btn-success btn-xs button-margin" ng-click="resume(aService.instance, vfModule, vnf)" >
-												Resume
-											</a>
-										</div>
+                                    <!-- VID-374/378 - switching-off feature <a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="getStatusOfVnf(aService.instance, vnf)" style="margin-right: 8px;">
+                                        <span class="glyphicon glyphicon-exclamation-sign"></span>
+                                    </a>  -->
+                                    <a class="pull-right btn btn-primary btn-xs" data-nodrag
+                                       ng-click="describeVnf(aService.instance, vnf)" style="margin-right: 8px;">
+                                        <span class="glyphicon glyphicon-info-sign vnf-info"></span>
+                                    </a>
+                                </div>
+                                <ol ui-tree-nodes="" ng-model="vnf.instanceGroups" ng-class="{hidden: collapsed}">
+                                    <li ng-repeat="instanceGroup in vnf.instanceGroups" ui-tree-node>
+                                        <div ui-tree-handle class="tree-node tree-node-content"
+                                             ng-class="'instanceGroupTreeNode'">
+                                            INSTANCE-GROUP: {{instanceGroup.name}} | TYPE: Instance-Group
+                                        </div>
 
-									</div>
-									<ol ui-tree-nodes="" ng-model="vfModule.volumeGroups" ng-class="{hidden: collapsed}">
-										<li ng-repeat="volumeGroup in vfModule.volumeGroups" ui-tree-node>
-											<div ui-tree-handle class="tree-node tree-node-content">
-												VOLUME GROUP: {{volumeGroup.name}} | TYPE: {{volumeGroup.nodeType}} | ORCH STATUS: {{volumeGroup.nodeStatus}}
-												<!-- <a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="deleteVolumeGroup(aService.instance, vnf, vfModule, volumeGroup)">
-                                                    <span class="glyphicon glyphicon-remove"></span>
-                                                </a> -->
-												<a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="describeVolumeGroup(aService.instance, vnf, volumeGroup)" style="margin-right: 8px;">
-													<span class="glyphicon glyphicon-info-sign"></span>
-												</a>
-											</div>
-										</li>
-									</ol>
-								</li>
-							</ol>
-							<ol ui-tree-nodes="" ng-model="vnf.availableVolumeGroups" ng-class="{hidden: collapsed}">
-								<li ng-repeat="volumeGroup in vnf.availableVolumeGroups" ui-tree-node>
-									<div ui-tree-handle class="tree-node tree-node-content">
-										VOLUME GROUP: {{volumeGroup.name}} | TYPE: {{volumeGroup.nodeType}} | ORCH STATUS: {{volumeGroup.nodeStatus}}
-										<a class="pull-right btn btn-danger btn-xs" ng-if="isPermitted" data-tests-id="deleteVNFVolumeGroupButton" data-nodrag ng-click="deleteVnfVolumeGroup(aService.instance, vnf, volumeGroup)">
-											<span class="glyphicon glyphicon-remove"></span>
-										</a>
-										<a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="describeVolumeGroup(aService.instance, vnf, volumeGroup)" style="margin-right: 8px;">
-											<span class="glyphicon glyphicon-info-sign"></span>
-										</a>
-									</div>
-								</li>
-							</ol>
-						</li>
-					</ol>
+                                    </li>
+                                </ol>
 
-					<ol ui-tree-nodes="" ng-model="aService.instance.networks" ng-class="{hidden: collapsed}">
-						<li ng-repeat="network in aService.instance.networks" ui-tree-node>
-							<div ui-tree-handle class="tree-node tree-node-content">
-								NETWORK: {{network.name}} | TYPE: {{network.nodeType}} | ORCH	STATUS: {{network.nodeStatus}}
+                                <ol ui-tree-nodes="" ng-model="vnf.vfModules" ng-class="{hidden: collapsed}">
+                                    <li ng-repeat="vfModule in vnf.vfModules" ui-tree-node>
+                                        <div ui-tree-handle class="tree-node tree-node-content"
+                                             ng-class="'vfModuleTreeNode-' + vfModule.nodeStatus.toLowerCase()">
+                                            <a class="btn btn-success btn-xs"
+                                               ng-if="(vfModule.volumeGroups && vfModule.volumeGroups.length > 0)"
+                                               data-nodrag ng-click="this.toggle()">
+                                                <span class="glyphicon"
+                                                      ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span>
+                                            </a>
+                                            VFMODULE: {{vfModule.name}} | TYPE: {{vfModule.nodeType}} | ORCH STATUS:
+                                            {{vfModule.nodeStatus}}
+                                            <!--  -->
+                                            <a class="pull-right btn btn-danger btn-xs" ng-if="isPermitted"
+                                               data-tests-id="deleteVFModuleButton-{{vfModule.name}}" data-nodrag
+                                               ng-click="deleteVfModule(aService.instance, vfModule, vnf)">
+                                                <span class="glyphicon glyphicon-remove"></span>
+                                            </a>
+                                            <div class="pull-right btn-group">
+                                                <!--   <button type="button" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                                                    Attach Volume Group<span class="caret"></span>
+                                                  </button>
+                                                  <ul class="dropdown-menu" ng-model="vnf.volumeGroups">
+                                                    <li ng-repeat="volumeGroup in vnf.availableVolumeGroups">
+                                                        <a ng-click="attachVolumeGroupInstance(vfModule, volumeGroup)">{{volumeGroup.name}}</a>
+                                                    </li>
+                                                  </ul> -->
+                                            </div>
+                                            <a class="pull-right btn btn-primary btn-xs" data-nodrag
+                                               ng-click="describeVfModule(aService.instance, vfModule, vnf)"
+                                               style="margin-right: 8px;">
+                                                <span class="glyphicon glyphicon-info-sign vfmodule-info"></span>
+                                            </a>
+                                            <div class="resume"
+                                                 ng-if="isPermitted && isResumeShown(vfModule.nodeStatus)">
+                                                <a data-tests-id="resumeVFModuleButton-{{vfModule.name}}"
+                                                   class="pull-right btn btn-success btn-xs button-margin"
+                                                   ng-click="resume(aService.instance, vfModule, vnf)">
+                                                    Resume
+                                                </a>
+                                            </div>
 
-								<a class="pull-right btn btn-danger btn-xs" ng-if="!isMacro() && isPermitted" data-tests-id="deleteNetworkButton" data-nodrag ng-click="deleteNetwork(aService.instance, network)">
-									<span class="glyphicon glyphicon-remove"></span>
-								</a>
-								<!--  <a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="deleteNetwork(aService.instance, network)">
-                                   <span class="glyphicon glyphicon-remove"></span>
-                               </a>-->
-								<a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="describeNetwork(aService.instance, network)" style="margin-right: 8px;">
-									<span class="glyphicon glyphicon-info-sign"></span>
-								</a>
-							</div>
-						</li>
-					</ol>
+                                        </div>
+                                        <ol ui-tree-nodes="" ng-model="vfModule.volumeGroups"
+                                            ng-class="{hidden: collapsed}">
+                                            <li ng-repeat="volumeGroup in vfModule.volumeGroups" ui-tree-node>
+                                                <div ui-tree-handle class="tree-node tree-node-content">
+                                                    VOLUME GROUP: {{volumeGroup.name}} | TYPE: {{volumeGroup.nodeType}}
+                                                    | ORCH STATUS: {{volumeGroup.nodeStatus}}
+                                                    <!-- <a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="deleteVolumeGroup(aService.instance, vnf, vfModule, volumeGroup)">
+                                                        <span class="glyphicon glyphicon-remove"></span>
+                                                    </a> -->
+                                                    <a class="pull-right btn btn-primary btn-xs" data-nodrag
+                                                       ng-click="describeVolumeGroup(aService.instance, vnf, volumeGroup)"
+                                                       style="margin-right: 8px;">
+                                                        <span class="glyphicon glyphicon-info-sign"></span>
+                                                    </a>
+                                                </div>
+                                            </li>
+                                        </ol>
+                                    </li>
+                                </ol>
+                                <ol ui-tree-nodes="" ng-model="vnf.availableVolumeGroups"
+                                    ng-class="{hidden: collapsed}">
+                                    <li ng-repeat="volumeGroup in vnf.availableVolumeGroups" ui-tree-node>
+                                        <div ui-tree-handle class="tree-node tree-node-content">
+                                            VOLUME GROUP: {{volumeGroup.name}} | TYPE: {{volumeGroup.nodeType}} | ORCH
+                                            STATUS: {{volumeGroup.nodeStatus}}
+                                            <a class="pull-right btn btn-danger btn-xs" ng-if="isPermitted"
+                                               data-tests-id="deleteVNFVolumeGroupButton" data-nodrag
+                                               ng-click="deleteVnfVolumeGroup(aService.instance, vnf, volumeGroup)">
+                                                <span class="glyphicon glyphicon-remove"></span>
+                                            </a>
+                                            <a class="pull-right btn btn-primary btn-xs" data-nodrag
+                                               ng-click="describeVolumeGroup(aService.instance, vnf, volumeGroup)"
+                                               style="margin-right: 8px;">
+                                                <span class="glyphicon glyphicon-info-sign volume-group-info"></span>
+                                            </a>
+                                        </div>
+                                    </li>
+                                </ol>
+                            </li>
+                        </ol>
+
+                        <ol ui-tree-nodes="" ng-model="aService.instance.networks" ng-class="{hidden: collapsed}">
+                            <li ng-repeat="network in aService.instance.networks" ui-tree-node>
+                                <div ui-tree-handle class="tree-node tree-node-content">
+                                    NETWORK: {{network.name}} | TYPE: {{network.nodeType}} | ORCH STATUS:
+                                    {{network.nodeStatus}}
+
+                                    <a class="pull-right btn btn-danger btn-xs" ng-if="!isMacro() && isPermitted"
+                                       data-tests-id="deleteNetworkButton" data-nodrag
+                                       ng-click="deleteNetwork(aService.instance, network)">
+                                        <span class="glyphicon glyphicon-remove"></span>
+                                    </a>
+                                    <!--  <a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="deleteNetwork(aService.instance, network)">
+                                       <span class="glyphicon glyphicon-remove"></span>
+                                   </a>-->
+                                    <a class="pull-right btn btn-primary btn-xs" data-nodrag
+                                       ng-click="describeNetwork(aService.instance, network)"
+                                       style="margin-right: 8px;">
+                                        <span class="glyphicon glyphicon-info-sign network-info"></span>
+                                    </a>
+                                </div>
+                            </li>
+                        </ol>
+
+                        <ol ui-tree-nodes="" ng-model="aService.instance.configurations" ng-class="{hidden: collapsed}">
+                            <li ng-repeat="configuration in aService.instance.configurations" ui-tree-node>
+                                <div ui-tree-handle class="tree-node tree-node-content">
+                                    <a class="btn btn-success btn-xs"
+                                       ng-if="(configuration.ports && configuration.ports.length > 0)" data-nodrag
+                                       ng-click="this.toggle()">
+                                        <span class="glyphicon"
+                                              ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span>
+                                    </a>
+                                    CONFIGURATION: {{configuration.name}} | TYPE: {{configuration.nodeType}} | ORCH
+                                    STATUS: {{configuration.nodeStatus}}
+
+                                    <a class="pull-right btn btn-danger btn-xs"
+                                       ng-if="!isMacro() && isPermitted && configuration.nodeStatus !== STATUS_CONSTANTS.AAI_ACTIVE"
+                                       ng-disabled="!isConfigurationDataAvailiable(configuration)"
+                                       data-tests-id="deleteConfigurationButton"
+                                       data-nodrag
+                                       ng-click="deleteConfiguration(aService, configuration)">
+                                        <span class="glyphicon glyphicon-remove"></span>
+                                    </a>
 
 
-					<ol ui-tree-nodes="" ng-model="aService.instance.configurations" ng-class="{hidden: collapsed}">
-						<li ng-repeat="configuration in aService.instance.configurations" ui-tree-node>
-							<div ui-tree-handle class="tree-node tree-node-content">
-								<a class="btn btn-success btn-xs" ng-if="(configuration.ports && configuration.ports.length > 0)" data-nodrag ng-click="this.toggle()">
-									<span class="glyphicon" ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span>
-								</a>
-								CONFIGURATION: {{configuration.name}} | TYPE: {{configuration.nodeType}} | ORCH	STATUS: {{configuration.nodeStatus}}
+                                    <a class="pull-right btn btn-primary btn-xs" data-nodrag
+                                       ng-click="toggleConfigurationStatus(aService, configuration)"
+                                       ng-if="isPermitted && allowConfigurationActions"
+                                       ng-disabled="!isConfigurationDataAvailiable(configuration)"
+                                       data-tests-id="activateDeactivateButton">
+                                        {{configuration.nodeStatus === STATUS_CONSTANTS.AAI_ACTIVE ? "Deactivate" :
+                                        "Activate"}}
+                                    </a>
+                                </div>
+                                <ol ui-tree-nodes="" ng-model="configuration.ports" ng-class="{hidden: collapsed}">
+                                    <li ng-repeat="port in configuration.ports" ui-tree-node>
+                                        <div ui-tree-handle class="tree-node tree-node-content">
+                                            PORT: {{port.portName}} | ORCH STATUS: {{port.portStatus}}
 
-								<a class="pull-right btn btn-danger btn-xs" ng-if="!isMacro() && isPermitted && configuration.nodeStatus === STATUS_CONSTANTS.AAI_INACTIVE" data-tests-id="deleteConfigurationButton" data-nodrag ng-click="deleteConfiguration(aService.instance, configuration)">
-									<span class="glyphicon glyphicon-remove"></span>
-								</a>
+                                            <button type="button" data-tests-id="enableDisableButton"
+                                                    class="pull-right btn btn-primary btn-xs"
+                                                    ng-if="configuration.nodeStatus == STATUS_CONSTANTS.AAI_ACTIVE"
+                                                    ng-disabled="!isConfigurationDataAvailiable(configuration)"
+                                                    ng-click="togglePortStatus(aService, configuration, port)">
+                                                {{port.portStatus === STATUS_CONSTANTS.AAI_ENABLED ? "Disable" :
+                                                "Enable"}}
+                                            </button>
+                                        </div>
+                                    </li>
+                                </ol>
+                            </li>
+                        </ol>
 
-								<a class="pull-right btn btn-primary btn-xs" data-nodrag ng-click="toggleConfigurationStatus(aService, configuration)" ng-if="isPermitted && allowConfigurationActions">
-									{{configuration.nodeStatus === STATUS_CONSTANTS.AAI_ACTIVE ? "Deactivate" : "Activate"}}
-								</a>
-							</div>
-							<ol ui-tree-nodes="" ng-model="configuration.ports" ng-class="{hidden: collapsed}">
-								<li ng-repeat="port in configuration.ports" ui-tree-node>
-									<div ui-tree-handle class="tree-node tree-node-content">
-										PORT: {{port.portName}} | ORCH STATUS: {{port.portStatus}}
+                        <ol id="pnfs-tree" ui-tree-nodes="" ng-model="pnfs"
+                            ng-class="{hidden: collapsed || pnf.length === 0}">
+                            <li ng-repeat="pnf in pnfs" ui-tree-node>
+                                <div ui-tree-handle class="tree-node tree-node-content">
+                                    PNF: {{pnf}}
 
-										<button type="button" class="pull-right btn btn-primary btn-xs" ng-if="configuration.nodeStatus == STATUS_CONSTANTS.AAI_ACTIVE" ng-click="togglePortStatus(aService, configuration, port)">
-											{{port.portStatus === STATUS_CONSTANTS.AAI_ENABLED ? "Disable" : "Enable"}}
-										</button>
-									</div>
-								</li>
-							</ol>
-						</li>
-					</ol>
-
-					<ol id="pnfs-tree" ui-tree-nodes="" ng-model="pnfs" ng-class="{hidden: collapsed || pnf.length === 0}">
-						<li ng-repeat="pnf in pnfs" ui-tree-node>
-							<div ui-tree-handle class="tree-node tree-node-content">
-								PNF: {{pnf}}
-
-								<a class="dissociate-pnf pull-right btn btn-primary btn-xs" data-nodrag ng-click="dissociatePnf(pnf)" style="margin-right: 8px;">
-									<span>Dissociate</span>
-								</a>
-							</div>
-						</li>
-					</ol>
-				</li>
-			</ol>
-		</div>
-	</div>
+                                    <a class="dissociate-pnf pull-right btn btn-primary btn-xs" data-nodrag
+                                       ng-click="dissociatePnf(pnf)" style="margin-right: 8px;">
+                                        <span>Dissociate</span>
+                                    </a>
+                                </div>
+                            </li>
+                        </ol>
+                    </div>
+                </li>
+            </ol>
+        </div>
+    </div>
 </div>
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/previousVersionDialog.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/previousVersionDialog.htm
index 2912c70..10cf339 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/previousVersionDialog.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/previousVersionDialog.htm
@@ -10,7 +10,7 @@
 		<div class="error" ng-show="isTableErrorVisible">
 			<img src="app/vid/images/error.png"></img>{{error}}
 		</div>
-		<table att-table table-data="tableData" view-per-page="viewPerPage" current-page="currentPage" search-category="searchCategory" search-string="searchString" total-page="totalPage">
+		<table att-table table-data="tableData" data-tests-id="Previous-version-pop-up-table" view-per-page="viewPerPage" current-page="currentPage" search-category="searchCategory" search-string="searchString" total-page="totalPage">
 		    <thead  att-table-row type="header">
 				<tr>
 					<th att-table-header key="action">Action</th>
@@ -25,8 +25,8 @@
 		        </tr>
 		    </thead>
 		    <tbody att-table-row type="body" row-repeat="row in tableData">
-		        <tr>
-		        	<td att-table-body ><button type=button ng-click="deployService(row)" att-button btn-type="{{deployButtonType}}" size="small">Deploy</button></td>
+		        <tr data-tests-id="Previous-version-pop-up-uuid-{{row['uuid']}}">
+		        	<td att-table-body ><button type=button data-tests-id="deploy-{{row['uuid']}}" ng-click="deployService(row)" att-button btn-type="{{deployButtonType}}" size="small">Deploy</button></td>
 	            	<td att-table-body ng-bind="row['uuid']"></td>
 	            	<td att-table-body ng-bind="row['invariantUUID']"></td>
 	            	<td att-table-body ng-bind="row['name']"></td>
@@ -41,7 +41,7 @@
 		
 		
 		<div class="buttonRow">
-			<button type="button" ng-click="cancelTable();" att-button
+			<button type="button" id="cancel" ng-click="cancelTable();" att-button
 				btn-type="primary" size="small">Cancel</button>
 		</div>
 	</div>
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/serviceModels.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/serviceModels.htm
index 17b87bf..4463875 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/serviceModels.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/serviceModels.htm
@@ -17,7 +17,6 @@
   limitations under the License.
   ============LICENSE_END=========================================================
   -->
-
 <link rel="stylesheet" type="text/css" href="app/vid/styles/serviceModels.css" />
 <div popup-window class="popupContents" ngx-show="{{popup.isTablePopUpVisible}}" ng-cloak>
 	<div ng-include="'app/vid/scripts/view-models/previousVersionDialog.htm'"/>
@@ -42,8 +41,7 @@
 
 	<h1 class="heading1" style="margin-top:20px;">Browse SDC Service Models</h1>
 	<div style="margin-top:30px" ng-init="getServiceModels();">
-		
-		<table att-table table-data="services" view-per-page="viewPerPage" current-page="currentPage" search-category="searchCategory" search-string="searchString" total-page="totalPage">
+		<table data-tests-id="serviceModelsTable" id="sdcModelsTable" att-table table-data="services" view-per-page="viewPerPage" current-page="currentPage" search-category="searchCategory" search-string="searchString" total-page="totalPage">
 		    <thead  att-table-row type="header">
 				<tr>
 					<th att-table-header key="action">Action</th>
@@ -58,21 +56,21 @@
 					<th att-table-header key="actions">Action</th>
 		        </tr>
 		    </thead>
-		    <tbody att-table-row type="body" row-repeat="service in services">
-		        <tr>
-		        	<td att-table-body ><button class="deploy-service-class" type=button data-tests-id="deploy-{{service['uuid']}}" ng-click="deployService(service)" att-button btn-type="{{deployButtonType}}" size="small">Deploy</button></td>
-	            	<td att-table-body ng-bind="service['uuid']"></td>
-	            	<td att-table-body ng-bind="service['invariantUUID']"></td>
-	            	<td att-table-body ng-bind="service['name']"></td>
-	            	<td att-table-body ng-bind="service['version']"></td>
-	            	<td att-table-body ng-bind="service['category']"></td>
-	            	<td att-table-body ng-bind="service['distributionStatus']"></td>
-	            	<td att-table-body ng-bind="service['lastUpdaterUserId']"></td>
-	            	<td att-table-body ng-bind="service['toscaModelUrl']"></td>
-					<td att-table-body ng-show="service.hasPreviousVersion"><button type=button ng-click="loadPreviousVersionData(service['invariantUUID'],service['name'],service['version'])" att-button btn-type="primary" size="small">Previous Versions</button></td>
-	            	<td att-table-body ng-show="!service.hasPreviousVersion">&nbsp;</td>
-		        </tr>     
-		    </tbody>	  
+			<tbody att-table-row type="body" row-repeat="service in services">
+				<tr class="sdcServiceModel" data-tests-id="Browse_SDC_Service_Models-uuid-{{service['uuid']}}">
+					<td class="deploy" att-table-body ><button class="deploy-service-class" type=button data-tests-id="deploy-{{service['uuid']}}" ng-click="deployService(service)" att-button btn-type="{{deployButtonType}}" size="small">Deploy</button></td>
+					<td class="uuid" att-table-body ng-bind="service['uuid']"></td>
+					<td class="invariantUUID" att-table-body data-tests-id="Invariant-{{service['invariantUUID']}}" ng-bind="service['invariantUUID']"></td>
+					<td class="name" att-table-body ng-bind="service['name']"></td>
+					<td class="version" att-table-body ng-bind="service['version']"></td>
+					<td class="category" att-table-body ng-bind="service['category']"></td>
+					<td class="distributionStatus" att-table-body ng-bind="service['distributionStatus']"></td>
+					<td class="lastUpdaterUserId" att-table-body ng-bind="service['lastUpdaterUserId']"></td>
+					<td class="toscaModelUrl" att-table-body ng-bind="service['toscaModelUrl']"></td>
+					<td class="PreviousVersion" att-table-body data-tests-id="PreviousVersion-{{service['invariantUUID']}}" ng-show="service.hasPreviousVersion"><button type=button ng-click="loadPreviousVersionData(service['invariantUUID'],service['name'],service['version'])" att-button btn-type="primary" size="small">Previous Versions</button></td>
+					<td class="hasPreviousVersion" att-table-body ng-show="!service.hasPreviousVersion">&nbsp;</td>
+				</tr>
+			</tbody>
 		</table>
 		<table width='100%'>
 			<tr>
@@ -91,7 +89,7 @@
 					</td>
 			</tr>
 		</table>
-		
+
 	</div>
 	</div>
 
