Global Read only role, Support VID specific Roles

Issue-ID: VID-46 , VID-47
Change-Id: Ib100d20ac40a65d39e27a6e2741b19a173a2b8ea
Signed-off-by: Ofir Sonsino <os0695@att.com>
diff --git a/vid-app-common/src/main/java/org/ecomp/aai/model/AaiAICZones/AicZones.java b/vid-app-common/src/main/java/org/ecomp/aai/model/AaiAICZones/AicZones.java
new file mode 100644
index 0000000..ee8bcf0
--- /dev/null
+++ b/vid-app-common/src/main/java/org/ecomp/aai/model/AaiAICZones/AicZones.java
@@ -0,0 +1,10 @@
+package org.ecomp.aai.model.AaiAICZones;
+
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class AicZones {
+	@JsonProperty("zone")
+	public List<Zone> zones;
+}
diff --git a/vid-app-common/src/main/java/org/ecomp/aai/model/AaiAICZones/Zone.java b/vid-app-common/src/main/java/org/ecomp/aai/model/AaiAICZones/Zone.java
new file mode 100644
index 0000000..00d387c
--- /dev/null
+++ b/vid-app-common/src/main/java/org/ecomp/aai/model/AaiAICZones/Zone.java
@@ -0,0 +1,13 @@
+package org.ecomp.aai.model.AaiAICZones;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Zone {
+    @JsonProperty("zone-id")
+    public String zoneId;
+    
+    @JsonProperty("zone-name")
+    public String zoneName;
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/aai/util/HttpsAuthClient.java b/vid-app-common/src/main/java/org/openecomp/aai/util/HttpsAuthClient.java
index 6a3665e..3323b3f 100755
--- a/vid-app-common/src/main/java/org/openecomp/aai/util/HttpsAuthClient.java
+++ b/vid-app-common/src/main/java/org/openecomp/aai/util/HttpsAuthClient.java
@@ -80,7 +80,7 @@
 				useClientCert = true;

 			}

 			

-		    System.setProperty("javax.net.ssl.trustStore", truststore_path);

+  		    System.setProperty("javax.net.ssl.trustStore", truststore_path);

 		    System.setProperty("javax.net.ssl.trustStorePassword", decrypted_truststore_password);

 			HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){

 			    public boolean verify(String string,SSLSession ssls) {

diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/AaiClient.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/AaiClient.java
new file mode 100644
index 0000000..af1f404
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/AaiClient.java
@@ -0,0 +1,284 @@
+package org.openecomp.vid.aai;
+
+import org.apache.http.HttpStatus;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.ecomp.aai.model.AaiAICZones.AicZones;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.openecomp.aai.util.AAIRestInterface;
+import org.apache.tiles.request.ApplicationContext;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+import org.openecomp.vid.aai.model.AaiGetServicesRequestModel.GetServicesAAIRespone;
+import org.openecomp.vid.aai.model.AaiGetTenatns.GetTenantsResponse;
+import org.openecomp.vid.model.SubscriberList;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.ServletContext;
+import javax.ws.rs.BadRequestException;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Response;
+import java.io.File;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.UUID;
+
+
+/**
+ * Created by Oren on 7/4/17.
+ */
+public class AaiClient implements AaiClientInterface {
+
+	/**
+	 * The Constant dateFormat.
+	 */
+	final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
+	protected String fromAppId = "VidAaiController";
+	@Autowired
+	ServletContext servletContext;
+	/**
+	 * The logger
+	 */
+
+	EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(AaiClient.class);
+
+
+	public AaiClient() {
+		//        certiPath = getCertificatesFile().getAbsolutePath();
+		//        depth = "0";
+	}
+
+	public AaiClient(ServletContext context) {
+		servletContext = context;
+	}
+
+
+
+	private static String checkForNull(String local) {
+		if (local != null)
+			return local;
+		else
+			return "";
+
+	}
+
+	@Override
+	public AaiResponse<SubscriberList> getAllSubscribers() {
+		String certiPath = getCertificatesFile().getAbsolutePath();
+		String depth = "0";
+		Response resp = doAaiGet(certiPath, "business/customers?subscriber-type=INFRA&depth=" + depth, false);
+		UserUtils userUtils = new UserUtils();
+		return proccessAaiResponse(resp, SubscriberList.class,null);
+	}
+
+
+	@Override
+	public AaiResponse getAllAicZones() {
+		String certiPath = getCertificatesFile().getAbsolutePath();
+		Response resp = doAaiGet(certiPath, "network/zones" , false);
+		AaiResponse aaiAicZones = proccessAaiResponse(resp, AicZones.class,null);
+		return aaiAicZones;
+	}
+
+	@Override
+	public AaiResponse getSubscriberData(String subscriberId) {
+
+		File certiPath = getCertificatesFile();
+		String depth = "2";
+		AaiResponse subscriberDataResponse;
+		Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + subscriberId + "?depth=" + depth, false);
+		subscriberDataResponse = proccessAaiResponse(resp, Services.class,null);
+		return subscriberDataResponse;
+	}
+
+	@Override
+	public AaiResponse getServices() {
+		File certiPath = getCertificatesFile();
+		Response resp = doAaiGet(certiPath.getAbsolutePath(), "service-design-and-creation/services", false);
+		AaiResponse<GetServicesAAIRespone> getServicesResponse = proccessAaiResponse(resp, GetServicesAAIRespone.class,null);
+
+		return getServicesResponse;
+	}
+
+	@Override
+	public AaiResponse getTenants(String globalCustomerId, String serviceType) {
+		File certiPath = getCertificatesFile();
+		String url = "business/customers/customer/" + globalCustomerId + "/service-subscriptions/service-subscription/" + serviceType;
+
+		Response resp = doAaiGet(certiPath.getAbsolutePath(), url, false);
+		String responseAsString  = parseForTenantsByServiceSubscription(resp.readEntity(String.class));
+
+		AaiResponse<GetTenantsResponse[]> getTenantsResponse = proccessAaiResponse(resp, GetTenantsResponse[].class,responseAsString);
+		return getTenantsResponse;
+	}
+
+	private AaiResponse proccessAaiResponse(Response resp, Class classType,String responseBody) {
+		AaiResponse subscriberDataResponse;
+		if (resp == null) {
+			subscriberDataResponse = new AaiResponse<>(null, null, HttpStatus.SC_INTERNAL_SERVER_ERROR);
+			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "Invalid response from AAI");
+		} else {
+			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getSubscribers() resp=" + resp.getStatusInfo().toString());
+			if (resp.getStatus() != HttpStatus.SC_OK) {
+				logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "Invalid response from AAI");
+				subscriberDataResponse = new AaiResponse<>(null, resp.readEntity(String.class), resp.getStatus());
+			} else {
+				String finalResponse;
+				try {
+					if (responseBody != null){
+						finalResponse = responseBody;
+					}
+					else{
+						finalResponse =  resp.readEntity(String.class);;
+					}
+
+					subscriberDataResponse = new AaiResponse<>((new ObjectMapper().readValue(finalResponse, classType)), null, HttpStatus.SC_OK);
+
+				} catch (IOException e) {
+					subscriberDataResponse = new AaiResponse<>(null, null, HttpStatus.SC_INTERNAL_SERVER_ERROR);
+				}
+
+			}
+		}
+		return subscriberDataResponse;
+	}
+
+	private File getCertificatesFile() {
+		if (servletContext != null)
+			return new File(servletContext.getRealPath("/WEB-INF/cert/"));
+		return null;
+	}
+
+	@SuppressWarnings("all")
+	protected Response doAaiGet(String certiPath, String uri, boolean xml) {
+		String methodName = "getSubscriberList";
+		String transId = UUID.randomUUID().toString();
+		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");
+
+		Response resp = null;
+		try {
+
+			AAIRestInterface restContrller = new AAIRestInterface(certiPath);
+			resp = restContrller.RestGet(fromAppId, transId, uri, xml);
+
+		} catch (WebApplicationException e) {
+			final String message = ((BadRequestException) e).getResponse().readEntity(String.class);
+			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + message);
+			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + message);
+		} catch (Exception e) {
+			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
+			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
+		}
+
+		return resp;
+	}
+
+	private String parseForTenantsByServiceSubscription(String resp) {
+		String tenantList = "";
+
+		try {
+			JSONParser jsonParser = new JSONParser();
+
+			JSONObject jsonObject = (JSONObject) jsonParser.parse(resp);
+
+			return parseServiceSubscriptionObjectForTenants(jsonObject);
+		} catch (Exception ex) {
+
+		}
+
+		return tenantList;
+	}
+
+
+
+	public static String parseServiceSubscriptionObjectForTenants(JSONObject jsonObject) {
+
+		JSONArray tenantArray = new JSONArray();
+		boolean bconvert = false;
+
+		try {
+			JSONObject relationShipListsObj = (JSONObject) jsonObject.get("relationship-list");
+			if (relationShipListsObj != null) {
+				JSONArray rShipArray = (JSONArray) relationShipListsObj.get("relationship");
+				if (rShipArray != null) {
+					Iterator i1 = rShipArray.iterator();
+
+					while (i1.hasNext()) {
+
+						JSONObject inner1Obj = (JSONObject) i1.next();
+
+						if (inner1Obj == null)
+							continue;
+
+						String relatedTo = checkForNull((String) inner1Obj.get("related-to"));
+						if (relatedTo.equalsIgnoreCase("tenant")) {
+							JSONObject tenantNewObj = new JSONObject();
+
+							String relatedLink = checkForNull((String) inner1Obj.get("related-link"));
+							tenantNewObj.put("link", relatedLink);
+
+							JSONArray rDataArray = (JSONArray) inner1Obj.get("relationship-data");
+							if (rDataArray != null) {
+								Iterator i2 = rDataArray.iterator();
+
+								while (i2.hasNext()) {
+									JSONObject inner2Obj = (JSONObject) i2.next();
+
+									if (inner2Obj == null)
+										continue;
+
+									String rShipKey = checkForNull((String) inner2Obj.get("relationship-key"));
+									String rShipVal = checkForNull((String) inner2Obj.get("relationship-value"));
+									if (rShipKey.equalsIgnoreCase("cloud-region.cloud-owner")) {
+										tenantNewObj.put("cloudOwner", rShipVal);
+									} else if (rShipKey.equalsIgnoreCase("cloud-region.cloud-region-id")) {
+										tenantNewObj.put("cloudRegionID", rShipVal);
+									}
+
+									if (rShipKey.equalsIgnoreCase("tenant.tenant-id")) {
+										tenantNewObj.put("tenantID", rShipVal);
+									}
+								}
+							}
+
+							JSONArray relatedTPropArray = (JSONArray) inner1Obj.get("related-to-property");
+							if (relatedTPropArray != null) {
+								Iterator i3 = relatedTPropArray.iterator();
+
+								while (i3.hasNext()) {
+									JSONObject inner3Obj = (JSONObject) i3.next();
+
+									if (inner3Obj == null)
+										continue;
+
+									String propKey = checkForNull((String) inner3Obj.get("property-key"));
+									String propVal = checkForNull((String) inner3Obj.get("property-value"));
+									if (propKey.equalsIgnoreCase("tenant.tenant-name")) {
+										tenantNewObj.put("tenantName", propVal);
+									}
+								}
+							}
+							bconvert = true;
+							tenantArray.add(tenantNewObj);
+						}
+					}
+
+				}
+			}
+		} catch (NullPointerException ex) {
+
+
+		}
+
+		if (bconvert)
+			return tenantArray.toJSONString();
+		else
+			return "";
+
+	}
+
+}
\ No newline at end of file
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/AaiClientInterface.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/AaiClientInterface.java
new file mode 100644
index 0000000..fdaf602
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/AaiClientInterface.java
@@ -0,0 +1,22 @@
+package org.openecomp.vid.aai;
+
+import org.openecomp.vid.aai.model.AaiGetTenatns.GetTenantsResponse;
+import org.openecomp.vid.model.SubscriberList;
+
+import java.util.List;
+
+/**
+ * Created by Oren on 7/4/17.
+ */
+public interface AaiClientInterface {
+
+    AaiResponse<SubscriberList> getAllSubscribers();
+
+    AaiResponse getSubscriberData(String subscriberId);
+
+    AaiResponse getServices();
+
+    AaiResponse<GetTenantsResponse[]> getTenants(String globalCustomerId, String serviceType);
+    
+    AaiResponse getAllAicZones();
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/AaiResponse.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/AaiResponse.java
new file mode 100644
index 0000000..337d137
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/AaiResponse.java
@@ -0,0 +1,21 @@
+package org.openecomp.vid.aai;
+
+import org.openecomp.vid.model.ProxyResponse;
+
+/**
+ * Created by Oren on 7/10/17.
+ */
+public class AaiResponse<T> extends ProxyResponse{
+
+    T t;
+
+    public AaiResponse(T t, String errorMessage, int aaiHttpCode) {
+        this.t = t;
+        this.errorMessage = errorMessage;
+        this.httpCode = aaiHttpCode;
+    }
+
+    public T getT() {
+        return t;
+    }
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceInstance.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceInstance.java
new file mode 100644
index 0000000..45f7947
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceInstance.java
@@ -0,0 +1,33 @@
+package org.openecomp.vid.aai;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ServiceInstance {
+	
+	@JsonProperty("service-instance-id")
+	public String serviceInstanceId;
+
+	@JsonProperty("service-instance-name")
+	public String serviceInstanceName;
+	
+	@JsonProperty("persona-model-id")
+	public String personaModelId;
+	
+	@JsonProperty("persona-model-version")
+	public String personaModelVersion;
+	
+	@JsonProperty("resource-version")
+	public String resourceVersion;
+	
+	@JsonProperty("orchestration-status")
+	public String orchestrationStatus;
+
+	@JsonProperty("model-invariant-id")
+	public String modelInvariantId;
+
+	@JsonProperty("model-version-id")
+	public String modelVersionId;
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceInstances.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceInstances.java
new file mode 100644
index 0000000..063317e
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceInstances.java
@@ -0,0 +1,14 @@
+package org.openecomp.vid.aai;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ServiceInstances {
+	
+	@JsonProperty("service-instance")
+	public List<ServiceInstance> serviceInstance;
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceSubscription.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceSubscription.java
new file mode 100644
index 0000000..6a178d9
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceSubscription.java
@@ -0,0 +1,20 @@
+package org.openecomp.vid.aai;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ServiceSubscription {
+	
+    @JsonProperty("service-type")
+    public String serviceType;
+
+    @JsonProperty("resource-version")
+    public String resourceVersion;
+
+    @JsonProperty("service-instances")
+    public ServiceInstances serviceInstances;
+
+    @JsonProperty("is-permitted")
+    public boolean isPermitted =false;
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceSubscriptions.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceSubscriptions.java
new file mode 100644
index 0000000..eaadba2
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/ServiceSubscriptions.java
@@ -0,0 +1,17 @@
+package org.openecomp.vid.aai;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import java.util.List;
+
+/**
+ * Created by Oren on 7/9/17.
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+
+public class ServiceSubscriptions {
+
+    @JsonProperty("service-subscription")
+    public List<ServiceSubscription> serviceSubscription;
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/Services.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/Services.java
new file mode 100644
index 0000000..e8148a9
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/Services.java
@@ -0,0 +1,24 @@
+package org.openecomp.vid.aai;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Services {
+    @JsonProperty("global-customer-id")
+    public String globalCustomerId;
+
+    @JsonProperty("subscriber-name")
+    public String subscriberName;
+
+    @JsonProperty("subscriber-type")
+    public String subscriberType;
+
+    @JsonProperty("resource-version")
+    public String resourceVersion;
+    
+    @JsonProperty("service-subscriptions")
+    public ServiceSubscriptions serviceSubscriptions;
+
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberAaiResponse.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberAaiResponse.java
new file mode 100644
index 0000000..53304e9
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberAaiResponse.java
@@ -0,0 +1,24 @@
+package org.openecomp.vid.aai;
+
+import org.openecomp.vid.model.ProxyResponse;
+import org.openecomp.vid.model.SubscriberList;
+
+/**
+ * Created by Oren on 7/5/17.
+ */
+public class SubscriberAaiResponse extends ProxyResponse {
+
+
+    private SubscriberList subscriberList;
+
+    public SubscriberAaiResponse(SubscriberList subscriberList, String errorMessage, int aaiHttpCode) {
+        this.subscriberList = subscriberList;
+        this.errorMessage = errorMessage;
+        this.httpCode = aaiHttpCode;
+    }
+
+
+    public SubscriberList getSubscriberList() {
+        return subscriberList;
+    }
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberData.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberData.java
new file mode 100644
index 0000000..efaa478
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberData.java
@@ -0,0 +1,7 @@
+package org.openecomp.vid.aai;
+
+/**
+ * Created by Oren on 7/10/17.
+ */
+public class SubscriberData {
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberFilteredResults.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberFilteredResults.java
new file mode 100644
index 0000000..c2afee3
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberFilteredResults.java
@@ -0,0 +1,29 @@
+package org.openecomp.vid.aai;
+
+import org.openecomp.vid.model.ProxyResponse;
+import org.openecomp.vid.model.SubscriberList;
+import org.openecomp.vid.roles.RoleValidator;
+
+/**
+ * Created by Oren on 7/5/17.
+ */
+
+public class SubscriberFilteredResults extends ProxyResponse {
+
+    private SubscriberListWithFilterData subscriberList;
+
+    public SubscriberFilteredResults(RoleValidator roleValidator,SubscriberList subscribers, String errorMessage, int aaiHttpCode) {
+        this.subscriberList = new SubscriberListWithFilterData(subscribers,roleValidator);
+        this.errorMessage = errorMessage;
+        this.httpCode = aaiHttpCode;
+    }
+
+
+    public SubscriberListWithFilterData getSubscriberList() {
+        return subscriberList;
+    }
+
+    public void setSubscriberList(SubscriberListWithFilterData subscriberList) {
+        this.subscriberList = subscriberList;
+    }
+}
\ No newline at end of file
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberListWithFilterData.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberListWithFilterData.java
new file mode 100644
index 0000000..75f505f
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberListWithFilterData.java
@@ -0,0 +1,31 @@
+package org.openecomp.vid.aai;
+
+import org.openecomp.vid.model.Subscriber;
+import org.openecomp.vid.model.SubscriberList;
+import org.openecomp.vid.roles.RoleValidator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Oren on 7/5/17.
+ */
+public class SubscriberListWithFilterData {
+
+    public SubscriberListWithFilterData(SubscriberList subscriberList, RoleValidator roleValidator){
+        List<Subscriber> subscribers = subscriberList.customer;
+        List<SubscriberWithFilter> subscribersWithFilter = new ArrayList<>();
+        for (Subscriber subscriber :subscribers){
+            SubscriberWithFilter subscriberWithFilter = new SubscriberWithFilter();
+            subscriberWithFilter.setIsPermitted(roleValidator.isSubscriberPermitted(subscriber.globalCustomerId));
+            subscriberWithFilter.subscriberType = subscriber.subscriberType;
+            subscriberWithFilter.resourceVersion = subscriber.resourceVersion;
+            subscriberWithFilter.subscriberName = subscriber.subscriberName;
+            subscriberWithFilter.globalCustomerId = subscriber.globalCustomerId;
+            subscribersWithFilter.add(subscriberWithFilter);
+        }
+        this.customer = subscribersWithFilter;
+     }
+
+    public List<SubscriberWithFilter> customer;
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberWithFilter.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberWithFilter.java
new file mode 100644
index 0000000..abd9c0f
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/SubscriberWithFilter.java
@@ -0,0 +1,21 @@
+package org.openecomp.vid.aai;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.openecomp.vid.model.Subscriber;
+
+/**
+ * Created by Oren on 7/5/17.
+ */
+public class SubscriberWithFilter extends Subscriber{
+
+    @JsonProperty("is-permitted")
+    private boolean isPermitted;
+
+    public boolean getIsPermitted() {
+        return isPermitted;
+    }
+
+    public void setIsPermitted(boolean isPermitted) {
+        this.isPermitted = isPermitted;
+    }
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/exceptions/InvalidAAIResponseException.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/exceptions/InvalidAAIResponseException.java
new file mode 100644
index 0000000..f84c09a
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/exceptions/InvalidAAIResponseException.java
@@ -0,0 +1,7 @@
+package org.openecomp.vid.aai.exceptions;
+
+/**
+ * Created by Oren on 7/4/17.
+ */
+public class InvalidAAIResponseException extends Exception {
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/model/AaiGetServicesRequestModel/GetServicesAAIRespone.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/AaiGetServicesRequestModel/GetServicesAAIRespone.java
new file mode 100644
index 0000000..27c38ce
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/AaiGetServicesRequestModel/GetServicesAAIRespone.java
@@ -0,0 +1,11 @@
+package org.openecomp.vid.aai.model.AaiGetServicesRequestModel;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+import java.util.List;
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class GetServicesAAIRespone {
+
+    public List<Service> service;
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/model/AaiGetServicesRequestModel/Service.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/AaiGetServicesRequestModel/Service.java
new file mode 100644
index 0000000..977e57e
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/AaiGetServicesRequestModel/Service.java
@@ -0,0 +1,21 @@
+package org.openecomp.vid.aai.model.AaiGetServicesRequestModel;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * Created by Oren on 7/17/17.
+ */
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Service {
+    @JsonProperty("service-id")
+    public String serviceId;
+    @JsonProperty("service-description")
+    public String serviceDescription;
+    @JsonProperty("resource-version")
+    public String resourceVersion;
+    @JsonProperty("is-permitted")
+    public boolean isPermitted;
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/model/AaiGetTenatns/GetTenantsResponse.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/AaiGetTenatns/GetTenantsResponse.java
new file mode 100644
index 0000000..5e88bf3
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/AaiGetTenatns/GetTenantsResponse.java
@@ -0,0 +1,26 @@
+package org.openecomp.vid.aai.model.AaiGetTenatns;
+
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * Created by Oren on 7/18/17.
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class GetTenantsResponse {
+
+    @JsonProperty("cloudRegionID")
+    public String cloudRegionId;
+
+    @JsonProperty("tenantName")
+    public String tenantName;
+
+    @JsonProperty("tenantID")
+    public String tenantID;
+
+    @JsonProperty("is-permitted")
+    public boolean isPermitted;
+
+
+
+}
\ No newline at end of file
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/model/ServiceInstance.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/ServiceInstance.java
new file mode 100644
index 0000000..9fe4c06
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/ServiceInstance.java
@@ -0,0 +1,26 @@
+package org.openecomp.vid.aai.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class ServiceInstance {
+	
+	@JsonProperty("service-instance-id")
+	public String serviceInstanceId;
+
+	@JsonProperty("service-instance-name")
+	public String serviceInstanceName;
+	
+	@JsonProperty("persona-model-id")
+	public String personaModelId;
+	
+	@JsonProperty("persona-model-version")
+	public String personaModelVersion;
+	
+	@JsonProperty("resource-version")
+	public String resourceVersion;
+	
+	@JsonProperty("orchestration-status")
+	public String orchestrationStatus;
+
+	
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/model/ServiceInstances.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/ServiceInstances.java
new file mode 100644
index 0000000..163ed04
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/ServiceInstances.java
@@ -0,0 +1,12 @@
+package org.openecomp.vid.aai.model;
+
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class ServiceInstances {
+	
+	@JsonProperty("service-instance")
+	public List<ServiceInstance> serviceInstance;
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/model/ServiceSubscription.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/ServiceSubscription.java
new file mode 100644
index 0000000..02ddfd1
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/ServiceSubscription.java
@@ -0,0 +1,17 @@
+package org.openecomp.vid.aai.model;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class ServiceSubscription {
+	
+    @JsonProperty("service-type")
+    public String serviceType;
+
+    @JsonProperty("resource-version")
+    public String resourceVersion;
+
+    @JsonProperty("service-instances")
+    public ServiceInstances serviceInstances;
+
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/aai/model/Services.java b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/Services.java
new file mode 100644
index 0000000..6e7b890
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/aai/model/Services.java
@@ -0,0 +1,24 @@
+package org.openecomp.vid.aai.model;
+
+import java.util.List;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class Services {
+    @JsonProperty("global-customer-id")
+    public String globalCustomerId;
+
+    @JsonProperty("subscriber-name")
+    public String subscriberName;
+
+    @JsonProperty("subscriber-type")
+    public String subscriberType;
+
+    @JsonProperty("resource-version")
+    public String resourceVersion;
+    
+    @JsonProperty("service-subscriptions")
+    public List<ServiceSubscription> serviceSubscriptions;
+
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/SecureService.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/SecureService.java
new file mode 100644
index 0000000..1372472
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/SecureService.java
@@ -0,0 +1,9 @@
+package org.openecomp.vid.asdc.beans;
+
+/**
+ * Created by Oren on 6/27/17.
+ */
+public class SecureService extends  Service{
+
+    public boolean isPermmited = true;
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/SecureServices.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/SecureServices.java
new file mode 100644
index 0000000..0d2c2fb
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/SecureServices.java
@@ -0,0 +1,30 @@
+package org.openecomp.vid.asdc.beans;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by Oren on 6/27/17.
+ */
+public class SecureServices {
+
+    private Collection<Service> services;
+    private boolean isReadOnly = true;
+
+    public void setServices(Collection<Service> services) {
+        this.services = services;
+    }
+
+    public Collection<Service> getServices() {
+
+        return services;
+    }
+    public boolean isReadOnly() {
+        return isReadOnly;
+    }
+
+    public void setReadOnly(boolean readOnly) {
+        isReadOnly = readOnly;
+    }
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMetadata.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMetadata.java
index d42c1f1..41c7ca5 100755
--- a/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMetadata.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/beans/tosca/ToscaMetadata.java
@@ -61,6 +61,9 @@
 	/** The resource vendor release. */

 	private String resourceVendorRelease;

 	

+	/** the resourceVendorModelNumber */

+	private String resourceVendorModelNumber;

+

 	/** The service ecomp naming. */

 	private String serviceEcompNaming;

 	

@@ -88,6 +91,11 @@
 	

 	/** The vf module model version. */

 	private String vfModuleModelVersion;

+

+        /** serviceType */

+        private String serviceType;

+        /** serviceRole */

+        private String serviceRole;

 	

 	/**

 	 * Instantiates a new tosca metadata.

@@ -458,4 +466,26 @@
 		

 		return vfModuleModelCustomizationUUID;

 	}

+

+        /** serviceType */

+        public String getServiceType() {

+                return serviceType;

+        }

+        public void setServiceType(String serviceType) {

+                this.serviceType= serviceType;

+        }

+        /** serviceRole */

+        public String getServiceRole() {

+                return serviceRole;

+        }

+        public void setServiceRole(String serviceRole) {

+                this.serviceRole= serviceRole;

+        }

+        /** resourceVendorModelNumber */

+        public String getResourceVendorModelNumber() {

+                return resourceVendorModelNumber;

+        }

+        public void setResourceVendorModelNumber(String resourceVendorModelNumber) {

+                this.resourceVendorModelNumber= resourceVendorModelNumber;

+        }

 }

diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/local/LocalAsdcClient.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/local/LocalAsdcClient.java
index 8538f6b..d73c75b 100644
--- a/vid-app-common/src/main/java/org/openecomp/vid/asdc/local/LocalAsdcClient.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/local/LocalAsdcClient.java
@@ -264,7 +264,7 @@
      * @see org.openecomp.vid.asdc.AsdcClient#getResourceArtifact(java.util.UUID, java.util.UUID)
      */
     public Artifact getResourceArtifact(UUID resourceUuid, UUID artifactUuid) throws AsdcCatalogException {
-        final JSONArray artifacts = getCatalog().getJSONObject("resources")
+        final  JSONArray artifacts = getCatalog().getJSONObject("resources")
                 .getJSONObject(resourceUuid.toString())
                 .getJSONArray("artifacts");
 
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/parser/ToscaParserImpl2.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/parser/ToscaParserImpl2.java
index 4819cae..3f0dd8c 100644
--- a/vid-app-common/src/main/java/org/openecomp/vid/asdc/parser/ToscaParserImpl2.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/parser/ToscaParserImpl2.java
@@ -7,7 +7,6 @@
 import org.openecomp.sdc.toscaparser.api.Group;
 import org.openecomp.sdc.toscaparser.api.NodeTemplate;
 import org.openecomp.sdc.toscaparser.api.Property;
-import org.openecomp.sdc.toscaparser.api.elements.constraints.Constraint;
 import org.openecomp.sdc.toscaparser.api.parameters.Input;
 import org.openecomp.vid.asdc.beans.Service;
 import org.openecomp.vid.model.*;
@@ -23,8 +22,11 @@
 	public class Constants {
 		public final static String uuid = "UUID";
 		public final static String description = "description";
-		public final static String ecompGeneratedNaming = "ecompGeneratedNaming";
-		public final static String customizationUUID = "customizationUUID";
+		public final static String serviceType = "serviceType";
+        public final static String serviceRole = "serviceRole";
+        public final static String ecompGeneratedNaming = "ecompGeneratedNaming";
+
+        public final static String customizationUUID = "customizationUUID";
 		public final static String vfModuleModelVersion = "vfModuleModelVersion";
 		public final static String vfModuleModelCustomizationUUID = "vfModuleModelCustomizationUUID";
 		public final static String volume_group = "volume_group";
@@ -49,7 +51,7 @@
         serviceModel.setService(extractServiceFromCsar(asdcServiceMetadata, sdcCsarHelper));
         serviceModel.setVolumeGroups(extractVolumeGroups(sdcCsarHelper));
         serviceModel.setVfModules(extractVfModuleFromCsar(sdcCsarHelper));
-        serviceModel.setVnfs(extractVnfsFromCsar(sdcCsarHelper));
+        serviceModel.setVnfs(extractVnfsFromCsar(serviceModel,sdcCsarHelper));
         serviceModel.setNetworks(extractNetworksFromCsar(sdcCsarHelper));
         return serviceModel;
     }
@@ -65,22 +67,52 @@
         service.setDescription(csarHelper.getServiceMetadata().getValue(Constants.description));
         service.setInputs(inputsListToInputsMap(csarHelper.getServiceInputs()));
         service.setServiceEcompNaming(csarHelper.getServiceMetadata().getValue(Constants.ecompGeneratedNaming));
+        service.setServiceType(csarHelper.getServiceMetadata().getValue(Constants.serviceType));
+        service.setServiceRole(csarHelper.getServiceMetadata().getValue(Constants.serviceRole));
+
         return service;
     }
     
-    private Map<String, VNF> extractVnfsFromCsar(ISdcCsarHelper csarHelper) {
+    private Map<String, VNF> extractVnfsFromCsar(ServiceModel serviceModel,ISdcCsarHelper csarHelper) {
         List<NodeTemplate> nodeTemplates = csarHelper.getServiceVfList();
         Map<String, VNF> vnfsMaps = new HashMap<String, VNF>();
 
         for (NodeTemplate nodeTemplate : nodeTemplates) {
             VNF vnf = new VNF();
             populateNodeFromNodeTemplate(nodeTemplate, csarHelper, vnf);
+
             vnf.setModelCustomizationName(nodeTemplate.getName());
+            Map<String, VfModule> vfModuleHashMap = getVfModulesFromVF(csarHelper, vnf.getCustomizationUuid());
+            vnf.setVfModules(vfModuleHashMap);
+
+            Map<String, VolumeGroup> volumeGroupMap = getVolumeGroupsFromVF(csarHelper, vnf.getCustomizationUuid());
+            vnf.setVolumeGroups(volumeGroupMap);
+
             vnfsMaps.put(nodeTemplate.getName(), vnf);
         }
         return vnfsMaps;
     }
 
+    private Map<String, VfModule> getVfModulesFromVF(ISdcCsarHelper csarHelper, String vfUuid) {
+        Map<String,VfModule> vfModuleHashMap = new HashMap<String,VfModule>();
+        for (Group group : csarHelper.getVfModulesByVf(vfUuid)) {
+            vfModuleHashMap.put(group.getName(), populateVfModuleFromGroup(group));
+        }
+        return vfModuleHashMap;
+    }
+
+    private Map<String, VolumeGroup> getVolumeGroupsFromVF(ISdcCsarHelper csarHelper, String vfCustomizationUuid) {
+        Map<String,VolumeGroup> volumeGroupMap = new HashMap<String,VolumeGroup>();
+        List<Group> groups = csarHelper.getVfModulesByVf(vfCustomizationUuid);
+        for (Group group : groups) {
+            boolean isVolumeGroup = Boolean.valueOf(group.getPropertyValue(Constants.volume_group).toString());
+            if (isVolumeGroup) {
+                volumeGroupMap.put(group.getName(), populateVolumeGroupFromGroup(group));
+            }
+        }
+        return volumeGroupMap;
+    }
+
     private Map<String, Network> extractNetworksFromCsar(ISdcCsarHelper csarHelper) {
         List<NodeTemplate> nodeTemplates = csarHelper.getServiceVlList();
         Map<String, Network> networksMap = new HashMap<String, Network>();
@@ -99,25 +131,19 @@
         HashMap<String, VfModule> vfModuleHashMap = new HashMap<>();
 
         for (NodeTemplate nodeTemplate : serviceVfList) {
-            List<Group> groups = csarHelper.getVfModulesByVf(nodeTemplate.getMetaData().getValue(Constants.customizationUUID));
-            for (Group group : groups) {
-                vfModuleHashMap.put(group.getName(), populateVfModuleFromGroup(group));
-            }
+            Map<String, VfModule> nodeTemplateVfModule =
+                    getVfModulesFromVF(csarHelper, nodeTemplate.getMetaData().getValue(Constants.customizationUUID));
+            vfModuleHashMap.putAll(nodeTemplateVfModule);
         }
         return vfModuleHashMap;
     }
 
-
     private Map<String, VolumeGroup> extractVolumeGroups(ISdcCsarHelper csarHelper) {
         HashMap<String, VolumeGroup> volumeGroupHashMap = new HashMap<>();
         for (NodeTemplate nodeTemplate : csarHelper.getServiceVfList()) {
-            List<Group> groups = csarHelper.getVfModulesByVf(csarHelper.getNodeTemplateCustomizationUuid(nodeTemplate));
-            for (Group group : groups) {
-                boolean isVolumeGroup = Boolean.valueOf(group.getPropertyValue(Constants.volume_group).toString());
-                if (isVolumeGroup) {
-                    volumeGroupHashMap.put(group.getName(), populateVolumeGroupFromGroup(group));
-                }
-            }
+            Map<String, VolumeGroup> nodeTemplateVolumeGroups =
+                    getVolumeGroupsFromVF(csarHelper, csarHelper.getNodeTemplateCustomizationUuid(nodeTemplate));
+            volumeGroupHashMap.putAll(nodeTemplateVolumeGroups);
         }
         return volumeGroupHashMap;
     }
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/asdc/rest/RestfulAsdcClient.java b/vid-app-common/src/main/java/org/openecomp/vid/asdc/rest/RestfulAsdcClient.java
index 5b783f5..67375aa 100755
--- a/vid-app-common/src/main/java/org/openecomp/vid/asdc/rest/RestfulAsdcClient.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/asdc/rest/RestfulAsdcClient.java
@@ -57,6 +57,7 @@
 /**

  * The Class RestfulAsdcClient.

  */

+@SuppressWarnings("Duplicates")

 public class RestfulAsdcClient implements AsdcClient {

 

     /**

@@ -183,6 +184,7 @@
      * @see org.openecomp.vid.asdc.AsdcClient#getResource(java.util.UUID)

      */

     public Resource getResource(UUID uuid) throws AsdcCatalogException {

+

         String path = VidProperties.getPropertyWithDefault(ModelConstants.ASDC_RESOURCE_API_PATH, ModelConstants.DEFAULT_ASDC_RESOURCE_API_PATH);

         try {

             return getClient()

diff --git a/vid-app-common/src/main/java/org/openecomp/vid/client/FakeHttpSession.java b/vid-app-common/src/main/java/org/openecomp/vid/client/FakeHttpSession.java
new file mode 100644
index 0000000..226e6c4
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/client/FakeHttpSession.java
@@ -0,0 +1,224 @@
+package org.openecomp.vid.client;
+
+import org.apache.commons.io.IOUtils;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpSession;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by pickjonathan on 03/07/2017.
+ */
+public class FakeHttpSession implements HttpSession {
+
+    /**
+     * Setup the creation time
+     */
+    public FakeHttpSession() {
+        File file = new File("resources/roles.json");
+
+        String rolesInputStream = null;
+        try {
+            rolesInputStream = IOUtils.toString(FakeHttpSession.class.getClassLoader().getResourceAsStream("roles.json"),"UTF8");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        JSONTokener tokener = new JSONTokener(rolesInputStream);
+        JSONObject roles = new JSONObject(tokener);
+
+        JSONArray rolesArray = roles.getJSONArray("roles");
+
+        //set permissions to the roles from file.
+        this.setAttribute("role", rolesArray);
+
+        creationTime = System.currentTimeMillis();
+    }
+
+
+    /**
+     * Setup the creation time
+     * @param id The new session id
+     */
+    public FakeHttpSession(String id)
+    {
+        this.id = id;
+        creationTime = System.currentTimeMillis();
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#getCreationTime()
+     */
+    public long getCreationTime()
+    {
+        return creationTime;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#getId()
+     */
+    public String getId()
+    {
+        if (id == null)
+        {
+            System.out.println("Inventing data in FakeHttpSession.getId() to remain plausible.");
+            id = "fake";
+        }
+
+        return id;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#getLastAccessedTime()
+     */
+    public long getLastAccessedTime()
+    {
+        return creationTime;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#getServletContext()
+     */
+    public ServletContext getServletContext()
+    {
+        return null;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#setMaxInactiveInterval(int)
+     */
+    public void setMaxInactiveInterval(int maxInactiveInterval)
+    {
+        this.maxInactiveInterval = maxInactiveInterval;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#getMaxInactiveInterval()
+     */
+    public int getMaxInactiveInterval()
+    {
+        return maxInactiveInterval;
+    }
+
+    /**
+     * @see javax.servlet.http.HttpSession#getSessionContext()
+     * @deprecated
+     */
+    @SuppressWarnings({"UnnecessaryFullyQualifiedName"})
+    @Deprecated
+    public javax.servlet.http.HttpSessionContext getSessionContext()
+    {
+        return null;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#getAttribute(java.lang.String)
+     */
+    public Object getAttribute(String name)
+    {
+        return attributes.get(name);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#getValue(java.lang.String)
+     */
+    @Deprecated
+    public Object getValue(String name)
+    {
+        return attributes.get(name);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#getAttributeNames()
+     */
+    public Enumeration<String> getAttributeNames()
+    {
+        return Collections.enumeration(attributes.keySet());
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#getValueNames()
+     */
+    @Deprecated
+    public String[] getValueNames()
+    {
+        return attributes.keySet().toArray(new String[attributes.keySet().size()]);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#setAttribute(java.lang.String, java.lang.Object)
+     */
+    public void setAttribute(String name, Object value)
+    {
+        attributes.put(name, value);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#putValue(java.lang.String, java.lang.Object)
+     */
+    @Deprecated
+    public void putValue(String name, Object value)
+    {
+        attributes.put(name, value);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#removeAttribute(java.lang.String)
+     */
+    public void removeAttribute(String name)
+    {
+        attributes.remove(name);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#removeValue(java.lang.String)
+     */
+    @Deprecated
+    public void removeValue(String name)
+    {
+        attributes.remove(name);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#invalidate()
+     */
+    public void invalidate()
+    {
+    }
+
+    /* (non-Javadoc)
+     * @see javax.servlet.http.HttpSession#isNew()
+     */
+    public boolean isNew()
+    {
+        return true;
+    }
+
+    /**
+     * The session id
+     */
+    private String id = null;
+
+    /**
+     * The list of attributes
+     */
+    private Map<String, Object> attributes = new HashMap<String, Object>();
+
+    /**
+     * When were we created
+     */
+    private long creationTime;
+
+    /**
+     * How long before we timeout?
+     */
+    private int maxInactiveInterval = 30 * 60 * 1000;
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/client/HttpsBasicClient.java b/vid-app-common/src/main/java/org/openecomp/vid/client/HttpsBasicClient.java
index dc0e355..676a7e7 100755
--- a/vid-app-common/src/main/java/org/openecomp/vid/client/HttpsBasicClient.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/client/HttpsBasicClient.java
@@ -95,7 +95,7 @@
 			//May need to make the algorithm a parameter. MSO requires TLSv1.1	or TLSv1.2

 			ctx = SSLContext.getInstance("TLSv1.2");

 			

-			/* 

+			/*

 			KeyManagerFactory kmf = null;

 			try {

 				kmf = KeyManagerFactory.getInstance("SunX509");

@@ -113,7 +113,7 @@
 			ctx.init(kmf.getKeyManagers(), null, null);

 			*/

 			ctx.init(null, null, null);

-			//config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, 

+			//config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,

 			//							new HTTPSProperties( , ctx));

 			

 			return ClientBuilder.newBuilder()

diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/AaiController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/AaiController.java
index 861ddf8..c0b6a51 100755
--- a/vid-app-common/src/main/java/org/openecomp/vid/controller/AaiController.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/AaiController.java
@@ -18,31 +18,27 @@
  * ============LICENSE_END=========================================================

  */

 

-package  org.openecomp.vid.controller;

+package org.openecomp.vid.controller;

 

-import java.io.File;

-import java.io.IOException;

-import java.text.DateFormat;

-import java.text.SimpleDateFormat;

-import java.util.Date;

-import java.util.HashMap;

-import java.util.Iterator;

-import java.util.Map;

-import java.util.UUID;

-

-import javax.servlet.ServletContext;

-import javax.servlet.http.HttpServletRequest;

-import javax.servlet.http.HttpSession;

-import javax.ws.rs.BadRequestException;

-import javax.ws.rs.DefaultValue;

-import javax.ws.rs.QueryParam;

-import javax.ws.rs.WebApplicationException;

-import javax.ws.rs.core.Response;

-

+import org.codehaus.jackson.JsonGenerationException;

+import org.codehaus.jackson.map.JsonMappingException;

+import org.codehaus.jackson.map.ObjectMapper;

 import org.json.simple.JSONArray;

 import org.json.simple.JSONObject;

 import org.json.simple.parser.JSONParser;

 import org.openecomp.aai.util.AAIRestInterface;

+import org.openecomp.portalsdk.core.controller.RestrictedBaseController;

+import org.openecomp.portalsdk.core.domain.User;

+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;

+import org.openecomp.portalsdk.core.util.SystemProperties;

+import org.openecomp.vid.aai.AaiResponse;

+import org.openecomp.vid.aai.SubscriberData;

+import org.openecomp.vid.aai.SubscriberFilteredResults;

+import org.openecomp.vid.aai.model.AaiGetTenatns.GetTenantsResponse;

+import org.openecomp.vid.roles.Role;

+import org.openecomp.vid.roles.RoleProvider;

+import org.openecomp.vid.roles.RoleValidator;

+import org.openecomp.vid.services.AaiService;

 import org.springframework.beans.factory.annotation.Autowired;

 import org.springframework.http.HttpStatus;

 import org.springframework.http.MediaType;

@@ -53,575 +49,74 @@
 import org.springframework.web.bind.annotation.RestController;

 import org.springframework.web.servlet.ModelAndView;

 

-import org.openecomp.portalsdk.core.controller.RestrictedBaseController;

-import org.openecomp.portalsdk.core.domain.User;

-import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;

-import org.openecomp.portalsdk.core.util.SystemProperties;

+

+import javax.servlet.ServletContext;

+import javax.servlet.http.HttpServletRequest;

+import javax.servlet.http.HttpSession;

+import javax.ws.rs.BadRequestException;

+import javax.ws.rs.DefaultValue;

+import javax.ws.rs.QueryParam;

+import javax.ws.rs.WebApplicationException;

+import javax.ws.rs.core.Response;

+import java.io.File;

+import java.io.IOException;

+import java.text.DateFormat;

+import java.text.SimpleDateFormat;

+import java.util.*;

 

 /**

  * Controller to handle a&ai requests.

  */

 

 @RestController

-public class AaiController extends RestrictedBaseController{

+public class AaiController extends RestrictedBaseController {

+	

+	public AaiController() {

+		

+	}

+public  AaiController(ServletContext servletContext) {

+	this.servletContext = servletContext;

+		

+	}

+	

+	

+	

 

-	/** The view name. */

+	/**

+	 * The Constant dateFormat.

+	 */

+	final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");

+	/**

+	 * The from app id.

+	 */

+	protected String fromAppId = "VidAaiController";

+	/**

+	 * The view name.

+	 */

 	String viewName;

-

-	/** The logger. */

+	/**

+	 * The logger.

+	 */

 	EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(AaiController.class);

 

-	/** The Constant dateFormat. */

-	final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");

-

-	/** The from app id. */

-	protected String fromAppId = "VidAaiController";

-

-	/** The model. */

-	private Map<String,Object> model = new HashMap<String,Object>();

-

-	/** The servlet context. */

-	private @Autowired ServletContext servletContext;

 

 	/**

-	 * Welcome method.

-	 *

-	 * @param request the request

-	 * @return ModelAndView The view

+	 * The model.

 	 */

-	@RequestMapping(value = {"/subscriberSearch" }, method = RequestMethod.GET)

-	public ModelAndView welcome(HttpServletRequest request) {

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== AaiController welcome start");

-		return new ModelAndView(getViewName());		

-	}

-

-	/* (non-Javadoc)

-	 * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName()

+	private Map<String, Object> model = new HashMap<String, Object>();

+	/**

+	 * The servlet context.

 	 */

-	public String getViewName() {

-		return viewName;

-	}

-

-	/* (non-Javadoc)

-	 * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String)

-	 */

-	public void setViewName(String viewName) {

-		this.viewName = viewName;

-	}

+	@Autowired

+	private ServletContext servletContext;

 

 	/**

-	 * Get services from a&ai.

-	 *

-	 * @return ResponseEntity<String> The response entity with the logged in user uuid.

-	 * @throws IOException Signals that an I/O exception has occurred.

-	 * @throws InterruptedException the interrupted exception

+	 * aai service

 	 */

-	@RequestMapping(value = {"/getuserID" }, method = RequestMethod.GET)

-	public ResponseEntity<String> getUserID(HttpServletRequest request) throws IOException, InterruptedException {

-

-		String userId = "";

-		HttpSession session = request.getSession();

-		if (session != null)

-		{

-			User user = (User) session.getAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME));

-			if (user != null)

-			{

-				//userId = user.getHrid();

-				userId = user.getLoginId();

-				if (userId == null)

-					userId = user.getOrgUserId();

-			}

-		}

-

-		return new ResponseEntity<String>( userId, HttpStatus.OK);

-	}

-

-

-	/**

-	 * Get services from a&ai.

-	 *

-	 * @return ResponseEntity<String> The response entity

-	 * @throws IOException Signals that an I/O exception has occurred.

-	 * @throws InterruptedException the interrupted exception

-	 */

-	@RequestMapping(value="/aai_get_services",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 

-	public ResponseEntity<String> doGetServices() throws IOException, InterruptedException {	

-		File certiPath = GetCertificatesPath();

-		Response resp = doAaiGet(certiPath.getAbsolutePath(), "service-design-and-creation/services", false);

-

-		return convertResponseToResponseEntity(resp);

-	}

-

-	/**

-	 * Lookup single service instance in a&ai.  Get the service-subscription and customer, too, i guess?

-	 *

-	 * @param serviceInstanceId the service instance Id

-	 * @return ResponseEntity The response entity

-	 * @throws IOException Signals that an I/O exception has occurred.

-	 * @throws InterruptedException the interrupted exception

-	 */

-	@RequestMapping(value="/aai_get_service_instance/{service-instance-id}/{service-instance-type}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 

-	public ResponseEntity<String> doGetServiceInstance(@PathVariable("service-instance-id") String serviceInstanceId,@PathVariable("service-instance-type") String serviceInstanceType) throws IOException, InterruptedException {	

-		File certiPath = GetCertificatesPath();

-		Response resp=null;

-

-		if(serviceInstanceType.equalsIgnoreCase("Service Instance Id")){

-			resp = doAaiGet( certiPath.getAbsolutePath(), 

-					"search/nodes-query?search-node-type=service-instance&filter=service-instance-id:EQUALS:" 

-							+ serviceInstanceId, false);

-		} else {

-			resp = doAaiGet( certiPath.getAbsolutePath(), 

-					"search/nodes-query?search-node-type=service-instance&filter=service-instance-name:EQUALS:" 

-							+ serviceInstanceId, false);

-		}

-		return convertResponseToResponseEntity(resp);

-	}

-

-

-	/**

-	 * Get services from a&ai.

-	 *

-	 * @param globalCustomerId the global customer id

-	 * @param serviceSubscriptionId the service subscription id

-	 * @return ResponseEntity The response entity

-	 * @throws IOException Signals that an I/O exception has occurred.

-	 * @throws InterruptedException the interrupted exception

-	 */

-	@RequestMapping(value="/aai_get_service_subscription/{global-customer-id}/{service-subscription-id}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 

-	public ResponseEntity<String> doGetServices(@PathVariable("global-customer-id") String globalCustomerId,

-			@PathVariable("service-subscription-id") String serviceSubscriptionId) throws IOException, InterruptedException {	

-		File certiPath = GetCertificatesPath();

-		Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + globalCustomerId 

-				+ "/service-subscriptions/service-subscription/" + serviceSubscriptionId + "?depth=0", false);

-		return convertResponseToResponseEntity(resp);

-	}

-

-	/**

-	 * Obtain the subscriber list from a&ai.

-	 *

-	 * @param fullSet the full set

-	 * @return ResponseEntity The response entity

-	 * @throws IOException Signals that an I/O exception has occurred.

-	 * @throws InterruptedException the interrupted exception

-	 */

-	@RequestMapping(value="/aai_get_subscribers",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)  	

-	public ResponseEntity<String> doGetSubscriberList(@DefaultValue("n") @QueryParam("fullSet") String fullSet) throws IOException, InterruptedException {

-		Response resp = getSubscribers(false);

-		return convertResponseToResponseEntity(resp);

-	}

-

-	/**

-	 * Obtain the Target Prov Status from the System.Properties file.

-	 *

-	 * @return ResponseEntity The response entity

-	 * @throws IOException Signals that an I/O exception has occurred.

-	 * @throws InterruptedException the interrupted exception

-	 */	

-	@RequestMapping(value="/get_system_prop_vnf_prov_status",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)  	

-	public ResponseEntity<String> getTargetProvStatus() throws IOException, InterruptedException {

-		String p = SystemProperties.getProperty("aai.vnf.provstatus");

-		return new ResponseEntity<String>(p, HttpStatus.OK);

-	}

-

-	/**

-	 * Obtain the full subscriber list from a&ai.

-	 *

-	 * @return ResponseEntity The response entity

-	 * @throws IOException Signals that an I/O exception has occurred.

-	 * @throws InterruptedException the interrupted exception

-	 */

-	@RequestMapping(value="/aai_get_full_subscribers",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)  	

-	public ResponseEntity<String> getFullSubscriberList() throws IOException, InterruptedException {

-		Response resp = getSubscribers(true);

-		return convertResponseToResponseEntity(resp);

-	}

-

-

-	/**

-	 * Refresh the subscriber list from a&ai.

-	 *

-	 * @return ResponseEntity The response entity

-	 * @throws IOException Signals that an I/O exception has occurred.

-	 */

-	@RequestMapping(value="/aai_refresh_subscribers",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)  	

-	public ResponseEntity<String> doRefreshSubscriberList() throws IOException {

-		Response resp = getSubscribers(false);

-		return convertResponseToResponseEntity(resp);

-	}

-

-	/**

-	 * Refresh the full subscriber list from a&ai.

-	 *

-	 * @return ResponseEntity The response entity

-	 * @throws IOException Signals that an I/O exception has occurred.

-	 */

-	@RequestMapping(value="/aai_refresh_full_subscribers",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)  	

-	public ResponseEntity<String> doRefreshFullSubscriberList() throws IOException {

-		Response resp = getSubscribers(false);

-		return convertResponseToResponseEntity(resp);

-	}

-

-	/**

-	 * Get subscriber details from a&ai.

-	 *

-	 * @param subscriberId the subscriber id

-	 * @return ResponseEntity The response entity

-	 */

-	@RequestMapping(value="/aai_sub_details/{subscriberId}", method = RequestMethod.GET)

-	public ResponseEntity<String> GetSubscriber(@PathVariable("subscriberId") String subscriberId) {

-		Response resp = getSubscriberDetails(subscriberId);

-		return convertResponseToResponseEntity(resp);

-	}

-

-	/**

-	 * Issue a named query to a&ai.

-	 *

-	 * @param namedQueryId the named query id

-	 * @param globalCustomerId the global customer id

-	 * @param serviceType the service type

-	 * @param serviceInstance the service instance

-	 * @return ResponseEntity The response entity

-	 */

-	@RequestMapping(value="/aai_sub_viewedit/{namedQueryId}/{globalCustomerId}/{serviceType}/{serviceInstance}", method = RequestMethod.GET)

-	public ResponseEntity<String> viewEditGetComponentList(

-			@PathVariable("namedQueryId") String namedQueryId,

-			@PathVariable("globalCustomerId") String globalCustomerId,

-			@PathVariable("serviceType") String serviceType,

-			@PathVariable("serviceInstance") String serviceInstance) { 

-

-		String componentListPayload = getComponentListPutPayload(namedQueryId, globalCustomerId, serviceType, serviceInstance);

-		File certiPath = GetCertificatesPath();

-

-		Response resp = doAaiPost(certiPath.getAbsolutePath(), "search/named-query", componentListPayload, false); 

-        return convertResponseToResponseEntity(resp);

-	}

-

-	/**

-	 * Issue a named query to a&ai.

-	 *

-	 * @param namedQueryId the named query id

-	 * @param globalCustomerId the global customer id

-	 * @param serviceType the service type

-	 * @return ResponseEntity The response entity

-	 */

-	@RequestMapping(value="/aai_get_models_by_service_type/{namedQueryId}/{globalCustomerId}/{serviceType}", method = RequestMethod.GET)

-	public ResponseEntity<String> viewEditGetComponentList(

-			@PathVariable("namedQueryId") String namedQueryId,

-			@PathVariable("globalCustomerId") String globalCustomerId,

-			@PathVariable("serviceType") String serviceType) { 

-

-		String componentListPayload = getModelsByServiceTypePayload(namedQueryId, globalCustomerId, serviceType);

-		File certiPath = GetCertificatesPath();

-

-		Response resp = doAaiPost(certiPath.getAbsolutePath(), "search/named-query", componentListPayload, false); 

-        return convertResponseToResponseEntity(resp);

-	}

-	

-	/**

-	 * Parses the for tenants.

-	 *

-	 * @param resp the resp

-	 * @return the string

-	 */

-	private String parseForTenants(String resp)

-	{

-		String tenantList = "";

-

-		try

-		{

-			JSONParser jsonParser = new JSONParser();

-

-			JSONObject jsonObject = (JSONObject) jsonParser.parse(resp);

-

-			return  parseCustomerObjectForTenants(jsonObject);

-		}

-		catch (Exception ex) {

-

-		}

-

-		return tenantList;

-	}

-

-	/**

-	 * Parses the for tenants by service subscription.

-	 *

-	 * @param resp the resp

-	 * @return the string

-	 */

-	private String parseForTenantsByServiceSubscription(String resp)

-	{

-		String tenantList = "";

-

-		try

-		{

-			JSONParser jsonParser = new JSONParser();

-

-			JSONObject jsonObject = (JSONObject) jsonParser.parse(resp);

-

-			return  parseServiceSubscriptionObjectForTenants(jsonObject);

-		}

-		catch (Exception ex) {

-

-		}

-

-		return tenantList;

-	}

-

-

-	//	@RequestMapping(value="/aai_get_tenants/{global-customer-id}", method = RequestMethod.GET)

-	//	public ResponseEntity<String> viewEditGetComponentList(

-	//			@PathVariable("global-customer-id") String globalCustomerId) {

-	//		return new ResponseEntity<String>(getTenants(globalCustomerId), HttpStatus.OK);

-	//	}

-

-	/**

-	 * Obtain tenants for a given service type.

-	 *

-	 * @param globalCustomerId the global customer id

-	 * @param serviceType the service type

-	 * @return ResponseEntity The response entity

-	 */

-	@RequestMapping(value="/aai_get_tenants/{global-customer-id}/{service-type}", method = RequestMethod.GET)

-	public ResponseEntity<String> viewEditGetTenantsFromServiceType(

-			@PathVariable("global-customer-id") String globalCustomerId, @PathVariable("service-type") String serviceType) {

-        return getTenantsFromServiceType(globalCustomerId, serviceType);

-	}

-

-	private ResponseEntity<String> convertResponseToResponseEntity(Response resp) { 

-		ResponseEntity<String> respEnt;

-		if (resp == null) { 

-			respEnt = new ResponseEntity<String>("Failed to fetch data from A&AI, check server logs for details.", HttpStatus.INTERNAL_SERVER_ERROR);

-		} else { 

-			respEnt = new ResponseEntity<String>((String)resp.readEntity(String.class), HttpStatus.valueOf(resp.getStatus()));

-		}

-		return respEnt;

-	}

-

-	/**

-	 * Gets the tenants.

-	 *

-	 * @param globalCustomerId the global customer id

-	 * @return the tenants

-	 */

-	private ResponseEntity<String> getTenants(String globalCustomerId)

-	{

-		File certiPath = GetCertificatesPath();

-        Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + globalCustomerId, false);

-        

-        ResponseEntity<String> respEnt;

-        if (resp.getStatus() >= 200 && resp.getStatus() <= 299) { 

-            respEnt = new ResponseEntity<String>(parseForTenants((String)resp.readEntity(String.class)), HttpStatus.OK);

-        } else {

-            respEnt = new ResponseEntity<String>((String)resp.readEntity(String.class), HttpStatus.valueOf(resp.getStatus()));

-        }

-        return respEnt;

-

-	}

-

-	/**

-	 * Gets the tenants from service type.

-	 *

-	 * @param globalCustomerId the global customer id

-	 * @param serviceType the service type

-	 * @return the tenants from service type

-	 */

-	private ResponseEntity<String> getTenantsFromServiceType(String globalCustomerId, String serviceType)

-	{

-		File certiPath = GetCertificatesPath();

-        String url = "business/customers/customer/" + globalCustomerId + "/service-subscriptions/service-subscription/" + serviceType;

-

-        Response resp = doAaiGet(certiPath.getAbsolutePath(), url, false);

-        

-        ResponseEntity<String> respEnt;

-        if (resp.getStatus() >= 200 && resp.getStatus() <= 299) { 

-            respEnt = new ResponseEntity<String>(parseForTenantsByServiceSubscription((String)resp.readEntity(String.class)), HttpStatus.OK);

-        } else {

-            respEnt = new ResponseEntity<String>((String)resp.readEntity(String.class), HttpStatus.valueOf(resp.getStatus()));

-        }

-        return respEnt;

-

-	}

-

-	/**

-	 * Gets the services.

-	 *

-	 * @return the services

-	 */

-	private Response getServices()

-	{

-		File certiPath = GetCertificatesPath();

-        Response resp  = doAaiGet(certiPath.getAbsolutePath(), "service-design-and-creation/services", false);

-        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getServices() resp=" + resp.getStatusInfo());

-

-		//model.put("aai_get_services", resp);

-		return resp;

-	}

-

-

-	/**

-	 * Gets the subscribers.

-	 *

-	 * @param isFullSet the is full set

-	 * @return the subscribers

-	 */

-	private Response getSubscribers(boolean isFullSet)

-	{

-		File certiPath = GetCertificatesPath();

-		String depth = "0";

-

-        Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers?subscriber-type=INFRA&depth=" + depth, false);

-        if (resp != null) { 

-        	logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getSubscribers() resp=" + resp.getStatusInfo().toString());

-        }

-		return resp;

-	}

-

+	@Autowired

+	private AaiService aaiService;

 	

 	

-	/**

-	 * Gets the subscriber details.

-	 *

-	 * @param subscriberId the subscriber id

-	 * @return the subscriber details

-	 */

-	private Response getSubscriberDetails(String subscriberId)

-	{

-		File certiPath = GetCertificatesPath();

-		Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + subscriberId + "?depth=2", false);

-		//String resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + subscriberId, false);

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getSubscriberDetails() resp=" + resp.getStatusInfo().toString());

-		return resp;

-	}

-

-	/**

-	 * Gets the certificates path.

-	 *

-	 * @return the file

-	 */

-	private File GetCertificatesPath()

-	{

-		if (servletContext != null)

-			return new File( servletContext.getRealPath("/WEB-INF/cert/") );

-		return null;

-	}

-

-	/**

-	 * Send a GET request to a&ai.

-	 *

-	 * @param certiPath the certi path

-	 * @param uri the uri

-	 * @param xml the xml

-	 * @return String The response

-	 */

-	protected Response doAaiGet(String certiPath, String uri, boolean xml) {

-		String methodName = "getSubscriberList";		

-		String transId = UUID.randomUUID().toString();

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-

-		Response resp = null;

-		try {

-

-			AAIRestInterface restContrller = new AAIRestInterface(certiPath);

-			resp = restContrller.RestGet(fromAppId, transId, uri, xml);

-

-		} catch (WebApplicationException e) {

-			final String message = ((BadRequestException) e).getResponse().readEntity(String.class);

-			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + message);

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + message);

-		} catch (Exception e) {

-			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-		}

-

-		return resp;

-	}

-

-	/**

-	 * Send a POST request to a&ai.

-	 *

-	 * @param certiPath the certi path

-	 * @param uri the uri

-	 * @param payload the payload

-	 * @param xml the xml

-	 * @return String The response

-	 */

-	protected Response doAaiPost(String certiPath, String uri, String payload, boolean xml) {

-		String methodName = "getSubscriberList";		

-		String transId = UUID.randomUUID().toString();

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-

-		Response resp = null;

-		try {

-

-			AAIRestInterface restContrller = new AAIRestInterface(certiPath);

-			resp = restContrller.RestPost(fromAppId, transId, uri, payload, xml);

-

-		} catch (Exception e) {

-			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-		}

-

-		return resp;

-	}

-

-	/**

-	 * Gets the component list put payload.

-	 *

-	 * @param namedQueryId the named query id

-	 * @param globalCustomerId the global customer id

-	 * @param serviceType the service type

-	 * @param serviceInstance the service instance

-	 * @return the component list put payload

-	 */

-	private String getComponentListPutPayload(String namedQueryId, String globalCustomerId, String serviceType, String serviceInstance) {

-		return 

-				"		{" +

-				"    \"instance-filters\": {" +

-				"        \"instance-filter\": [" +

-				"            {" +

-				"                \"customer\": {" +

-				"                    \"global-customer-id\": \"" + globalCustomerId + "\"" +

-				"                }," +

-				"                \"service-instance\": {" +

-				"                    \"service-instance-id\": \"" + serviceInstance + "\"" +

-				"                }," +

-				"                \"service-subscription\": {" +

-				"                    \"service-type\": \"" + serviceType + "\"" +

-				"                }" +

-				"            }" +

-				"        ]" +

-				"    }," +

-				"    \"query-parameters\": {" +

-				"        \"named-query\": {" +

-				"            \"named-query-uuid\": \"" + namedQueryId + "\"" +

-				"        }" +

-				"    }" +

-				"}";

-

-	}

-	private String getModelsByServiceTypePayload(String namedQueryId, String globalCustomerId, String serviceType) {

-		// TODO Auto-generated method stub

-		return 			"		{" +

-		"    \"instance-filters\": {" +

-		"        \"instance-filter\": [" +

-		"            {" +

-		"                \"customer\": {" +

-		"                    \"global-customer-id\": \"" + globalCustomerId + "\"" +

-		"                }," +

-		"                \"service-subscription\": {" +

-		"                    \"service-type\": \"" + serviceType + "\"" +

-		"                }" +

-		"            }" +

-		"        ]" +

-		"    }," +

-		"    \"query-parameters\": {" +

-		"        \"named-query\": {" +

-		"            \"named-query-uuid\": \"" + namedQueryId + "\"" +

-		"        }" +

-		"    }" +

-		"}";

-	

-	}

 

 	/**

 	 * Return tenant details.

@@ -638,12 +133,10 @@
 

 			JSONObject serviceSubsObj = (JSONObject) jsonObject.get("service-subscriptions");

 

-			if (serviceSubsObj != null)

-			{

+			if (serviceSubsObj != null) {

 				JSONArray srvcSubArray = (JSONArray) serviceSubsObj.get("service-subscription");

 

-				if (srvcSubArray != null)

-				{

+				if (srvcSubArray != null) {

 					Iterator i = srvcSubArray.iterator();

 

 					while (i.hasNext()) {

@@ -654,11 +147,9 @@
 							continue;

 

 						JSONObject relationShipListsObj = (JSONObject) innerObj.get("relationship-list");

-						if (relationShipListsObj != null)

-						{

+						if (relationShipListsObj != null) {

 							JSONArray rShipArray = (JSONArray) relationShipListsObj.get("relationship");

-							if (rShipArray != null)

-							{

+							if (rShipArray != null) {

 								Iterator i1 = rShipArray.iterator();

 

 								while (i1.hasNext()) {

@@ -668,17 +159,15 @@
 									if (inner1Obj == null)

 										continue;

 

-									String relatedTo = checkForNull((String)inner1Obj.get("related-to"));

-									if (relatedTo.equalsIgnoreCase("tenant"))

-									{

+									String relatedTo = checkForNull((String) inner1Obj.get("related-to"));

+									if (relatedTo.equalsIgnoreCase("tenant")) {

 										JSONObject tenantNewObj = new JSONObject();

 

 										String relatedLink = checkForNull((String) inner1Obj.get("related-link"));

 										tenantNewObj.put("link", relatedLink);

 

 										JSONArray rDataArray = (JSONArray) inner1Obj.get("relationship-data");

-										if (rDataArray != null)

-										{

+										if (rDataArray != null) {

 											Iterator i2 = rDataArray.iterator();

 

 											while (i2.hasNext()) {

@@ -687,27 +176,22 @@
 												if (inner2Obj == null)

 													continue;

 

-												String rShipKey = checkForNull((String)inner2Obj.get("relationship-key"));

-												String rShipVal = checkForNull((String)inner2Obj.get("relationship-value"));

-												if (rShipKey.equalsIgnoreCase("cloud-region.cloud-owner"))

-												{

+												String rShipKey = checkForNull((String) inner2Obj.get("relationship-key"));

+												String rShipVal = checkForNull((String) inner2Obj.get("relationship-value"));

+												if (rShipKey.equalsIgnoreCase("cloud-region.cloud-owner")) {

 													tenantNewObj.put("cloudOwner", rShipVal);

-												}

-												else if (rShipKey.equalsIgnoreCase("cloud-region.cloud-region-id"))

-												{

+												} else if (rShipKey.equalsIgnoreCase("cloud-region.cloud-region-id")) {

 													tenantNewObj.put("cloudRegionID", rShipVal);

 												}

 

-												if (rShipKey.equalsIgnoreCase("tenant.tenant-id"))

-												{

+												if (rShipKey.equalsIgnoreCase("tenant.tenant-id")) {

 													tenantNewObj.put("tenantID", rShipVal);

 												}

 											}

 										}

 

 										JSONArray relatedTPropArray = (JSONArray) inner1Obj.get("related-to-property");

-										if (relatedTPropArray != null)

-										{

+										if (relatedTPropArray != null) {

 											Iterator i3 = relatedTPropArray.iterator();

 

 											while (i3.hasNext()) {

@@ -716,10 +200,9 @@
 												if (inner3Obj == null)

 													continue;

 

-												String propKey = checkForNull((String)inner3Obj.get("property-key"));

-												String propVal = checkForNull((String)inner3Obj.get("property-value"));

-												if (propKey.equalsIgnoreCase("tenant.tenant-name"))

-												{

+												String propKey = checkForNull((String) inner3Obj.get("property-key"));

+												String propVal = checkForNull((String) inner3Obj.get("property-value"));

+												if (propKey.equalsIgnoreCase("tenant.tenant-name")) {

 													tenantNewObj.put("tenantName", propVal);

 												}

 											}

@@ -746,6 +229,7 @@
 	}

 

 

+

 	/**

 	 * Retrieve the service subscription from the jsonObject.

 	 *

@@ -759,11 +243,9 @@
 

 		try {

 			JSONObject relationShipListsObj = (JSONObject) jsonObject.get("relationship-list");

-			if (relationShipListsObj != null)

-			{

+			if (relationShipListsObj != null) {

 				JSONArray rShipArray = (JSONArray) relationShipListsObj.get("relationship");

-				if (rShipArray != null)

-				{

+				if (rShipArray != null) {

 					Iterator i1 = rShipArray.iterator();

 

 					while (i1.hasNext()) {

@@ -773,17 +255,15 @@
 						if (inner1Obj == null)

 							continue;

 

-						String relatedTo = checkForNull((String)inner1Obj.get("related-to"));

-						if (relatedTo.equalsIgnoreCase("tenant"))

-						{

+						String relatedTo = checkForNull((String) inner1Obj.get("related-to"));

+						if (relatedTo.equalsIgnoreCase("tenant")) {

 							JSONObject tenantNewObj = new JSONObject();

 

 							String relatedLink = checkForNull((String) inner1Obj.get("related-link"));

 							tenantNewObj.put("link", relatedLink);

 

 							JSONArray rDataArray = (JSONArray) inner1Obj.get("relationship-data");

-							if (rDataArray != null)

-							{

+							if (rDataArray != null) {

 								Iterator i2 = rDataArray.iterator();

 

 								while (i2.hasNext()) {

@@ -792,27 +272,22 @@
 									if (inner2Obj == null)

 										continue;

 

-									String rShipKey = checkForNull((String)inner2Obj.get("relationship-key"));

-									String rShipVal = checkForNull((String)inner2Obj.get("relationship-value"));

-									if (rShipKey.equalsIgnoreCase("cloud-region.cloud-owner"))

-									{

+									String rShipKey = checkForNull((String) inner2Obj.get("relationship-key"));

+									String rShipVal = checkForNull((String) inner2Obj.get("relationship-value"));

+									if (rShipKey.equalsIgnoreCase("cloud-region.cloud-owner")) {

 										tenantNewObj.put("cloudOwner", rShipVal);

-									}

-									else if (rShipKey.equalsIgnoreCase("cloud-region.cloud-region-id"))

-									{

+									} else if (rShipKey.equalsIgnoreCase("cloud-region.cloud-region-id")) {

 										tenantNewObj.put("cloudRegionID", rShipVal);

 									}

 

-									if (rShipKey.equalsIgnoreCase("tenant.tenant-id"))

-									{

+									if (rShipKey.equalsIgnoreCase("tenant.tenant-id")) {

 										tenantNewObj.put("tenantID", rShipVal);

 									}

 								}

 							}

 

 							JSONArray relatedTPropArray = (JSONArray) inner1Obj.get("related-to-property");

-							if (relatedTPropArray != null)

-							{

+							if (relatedTPropArray != null) {

 								Iterator i3 = relatedTPropArray.iterator();

 

 								while (i3.hasNext()) {

@@ -821,10 +296,9 @@
 									if (inner3Obj == null)

 										continue;

 

-									String propKey = checkForNull((String)inner3Obj.get("property-key"));

-									String propVal = checkForNull((String)inner3Obj.get("property-value"));

-									if (propKey.equalsIgnoreCase("tenant.tenant-name"))

-									{

+									String propKey = checkForNull((String) inner3Obj.get("property-key"));

+									String propVal = checkForNull((String) inner3Obj.get("property-value"));

+									if (propKey.equalsIgnoreCase("tenant.tenant-name")) {

 										tenantNewObj.put("tenantName", propVal);

 									}

 								}

@@ -854,13 +328,601 @@
 	 * @param local the local

 	 * @return the string

 	 */

-	private static String checkForNull(String local)

-	{

+	private static String checkForNull(String local) {

 		if (local != null)

 			return local;

 		else

 			return "";

 

 	}

+

+	/**

+	 * Welcome method.

+	 *

+	 * @param request the request

+	 * @return ModelAndView The view

+	 */

+	@RequestMapping(value = {"/subscriberSearch"}, method = RequestMethod.GET)

+	public ModelAndView welcome(HttpServletRequest request) {

+		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== AaiController welcome start");

+		return new ModelAndView(getViewName());

+	}

+

+	@RequestMapping(value = {"/aai_get_aic_zones"}, method = RequestMethod.GET)

+	public  ResponseEntity<String> getAicZones(HttpServletRequest request) throws JsonGenerationException, JsonMappingException, IOException {

+		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== getAicZones controller start");

+		AaiResponse response = aaiService.getAaiZones();

+		return aaiResponseToResponseEntity(response);

+			

+	}

+

+	/* (non-Javadoc)

+	 * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName()

+	 */

+	public String getViewName() {

+		return viewName;

+	}

+

+	/* (non-Javadoc)

+	 * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String)

+	 */

+	public void setViewName(String viewName) {

+		this.viewName = viewName;

+	}

+

+	/**

+	 * Get services from a&ai.

+	 *

+	 * @return ResponseEntity<String> The response entity with the logged in user uuid.

+	 * @throws IOException          Signals that an I/O exception has occurred.

+	 * @throws InterruptedException the interrupted exception

+	 */

+	@RequestMapping(value = {"/getuserID"}, method = RequestMethod.GET)

+	public ResponseEntity<String> getUserID(HttpServletRequest request) throws IOException, InterruptedException {

+

+		String userId = "";

+		HttpSession session = request.getSession();

+		if (session != null) {

+			User user = (User) session.getAttribute(SystemProperties.getProperty(SystemProperties.USER_ATTRIBUTE_NAME));

+			if (user != null) {

+				//userId = user.getHrid();

+				userId = user.getLoginId();

+				if (userId == null)

+					userId = user.getOrgUserId();

+			}

+		}

+

+		return new ResponseEntity<String>(userId, HttpStatus.OK);

+	}

+

+	/**

+	 * Get services from a&ai.

+	 *

+	 * @return ResponseEntity<String> The response entity

+	 * @throws IOException          Signals that an I/O exception has occurred.

+	 * @throws InterruptedException the interrupted exception

+	 */

+	@RequestMapping(value = "/aai_get_services", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)

+	public ResponseEntity<String> doGetServices(HttpServletRequest request) throws IOException, InterruptedException {

+	

+		RoleValidator roleValidator = new RoleValidator(new RoleProvider().getUserRoles(request));

+

+		AaiResponse subscriberList = aaiService.getServices(roleValidator);

+		ResponseEntity<String> responseEntity = aaiResponseToResponseEntity( subscriberList);

+

+		return responseEntity;

+	}

+

+

+

+	private ResponseEntity<String> aaiResponseToResponseEntity( AaiResponse aaiResponseData)

+			throws IOException, JsonGenerationException, JsonMappingException {

+		ResponseEntity<String> responseEntity;

+		ObjectMapper objectMapper = new ObjectMapper();

+		if (aaiResponseData.getHttpCode() == 200) {

+			responseEntity = new ResponseEntity<String>(objectMapper.writeValueAsString(aaiResponseData.getT()), HttpStatus.OK);

+		} else {

+			responseEntity = new ResponseEntity<String>(aaiResponseData.getErrorMessage(), HttpStatus.valueOf(aaiResponseData.getHttpCode()));

+		}

+		return responseEntity;

+	}

+

+	/**

+	 * Lookup single service instance in a&ai.  Get the service-subscription and customer, too, i guess?

+	 *

+	 * @param serviceInstanceId the service instance Id

+	 * @return ResponseEntity The response entity

+	 * @throws IOException          Signals that an I/O exception has occurred.

+	 * @throws InterruptedException the interrupted exception

+	 */

+	@RequestMapping(value = "/aai_get_service_instance/{service-instance-id}/{service-instance-type}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)

+	public ResponseEntity<String> doGetServiceInstance(@PathVariable("service-instance-id") String serviceInstanceId, @PathVariable("service-instance-type") String serviceInstanceType) throws IOException, InterruptedException {

+		File certiPath = GetCertificatesPath();

+		Response resp = null;

+

+		if (serviceInstanceType.equalsIgnoreCase("Service Instance Id")) {

+			resp = doAaiGet(certiPath.getAbsolutePath(),

+					"search/nodes-query?search-node-type=service-instance&filter=service-instance-id:EQUALS:"

+							+ serviceInstanceId, false);

+		} else {

+			resp = doAaiGet(certiPath.getAbsolutePath(),

+					"search/nodes-query?search-node-type=service-instance&filter=service-instance-name:EQUALS:"

+							+ serviceInstanceId, false);

+		}

+		return convertResponseToResponseEntity(resp);

+	}

+

+	/**

+	 * Get services from a&ai.

+	 *

+	 * @param globalCustomerId      the global customer id

+	 * @param serviceSubscriptionId the service subscription id

+	 * @return ResponseEntity The response entity

+	 * @throws IOException          Signals that an I/O exception has occurred.

+	 * @throws InterruptedException the interrupted exception

+	 */

+	@RequestMapping(value = "/aai_get_service_subscription/{global-customer-id}/{service-subscription-id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)

+	public ResponseEntity<String> doGetServices(@PathVariable("global-customer-id") String globalCustomerId,

+			@PathVariable("service-subscription-id") String serviceSubscriptionId) throws IOException, InterruptedException {

+		File certiPath = GetCertificatesPath();

+		Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + globalCustomerId

+				+ "/service-subscriptions/service-subscription/" + serviceSubscriptionId + "?depth=0", false);

+		return convertResponseToResponseEntity(resp);

+	}

+

+	/**

+	 * Obtain the subscriber list from a&ai.

+	 *

+	 * @param fullSet the full set

+	 * @return ResponseEntity The response entity

+	 * @throws IOException          Signals that an I/O exception has occurred.

+	 * @throws InterruptedException the interrupted exception

+	 */

+	@RequestMapping(value = "/aai_get_subscribers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)

+	public ResponseEntity<String> doGetSubscriberList(HttpServletRequest request,@DefaultValue("n") @QueryParam("fullSet") String fullSet) throws IOException, InterruptedException {

+		return getFullSubscriberList(request);

+	}

+

+	/**

+	 * Obtain the Target Prov Status from the System.Properties file.

+	 *

+	 * @return ResponseEntity The response entity

+	 * @throws IOException          Signals that an I/O exception has occurred.

+	 * @throws InterruptedException the interrupted exception

+	 */

+	@RequestMapping(value = "/get_system_prop_vnf_prov_status", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)

+	public ResponseEntity<String> getTargetProvStatus() throws IOException, InterruptedException {

+		String p = SystemProperties.getProperty("aai.vnf.provstatus");

+		return new ResponseEntity<String>(p, HttpStatus.OK);

+	}

+

+	/**

+	 * Obtain the full subscriber list from a&ai.

+	 * <p>

+	 * g @return ResponseEntity The response entity

+	 *

+	 * @throws IOException          Signals that an I/O exception has occurred.

+	 * @throws InterruptedException the interrupted exception

+	 */

+	@RequestMapping(value = "/aai_get_full_subscribers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)

+	public ResponseEntity<String> getFullSubscriberList(HttpServletRequest request) throws IOException, InterruptedException {

+		ObjectMapper objectMapper = new ObjectMapper();

+		ResponseEntity<String> responseEntity;

+		RoleValidator roleValidator = new RoleValidator(new RoleProvider().getUserRoles(request));

+		SubscriberFilteredResults subscriberList = aaiService.getFullSubscriberList(roleValidator);

+		if (subscriberList.getHttpCode() == 200) {

+			responseEntity = new ResponseEntity<String>(objectMapper.writeValueAsString(subscriberList.getSubscriberList()), HttpStatus.OK);

+		} else {

+			responseEntity = new ResponseEntity<String>(subscriberList.getErrorMessage(), HttpStatus.valueOf(subscriberList.getHttpCode()));

+		}

+

+

+		return responseEntity;

+	}

+

+	/**

+	 * Refresh the subscriber list from a&ai.

+	 *

+	 * @return ResponseEntity The response entity

+	 * @throws IOException Signals that an I/O exception has occurred.

+	 */

+	@RequestMapping(value = "/aai_refresh_subscribers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)

+	public ResponseEntity<String> doRefreshSubscriberList() throws IOException {

+		Response resp = getSubscribers(false);

+		return convertResponseToResponseEntity(resp);

+	}

+

+	/**

+	 * Refresh the full subscriber list from a&ai.

+	 *

+	 * @return ResponseEntity The response entity

+	 * @throws IOException Signals that an I/O exception has occurred.

+	 */

+	@RequestMapping(value = "/aai_refresh_full_subscribers", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)

+	public ResponseEntity<String> doRefreshFullSubscriberList() throws IOException {

+		Response resp = getSubscribers(false);

+		return convertResponseToResponseEntity(resp);

+	}

+

+	/**

+	 * Get subscriber details from a&ai.

+	 *

+	 * @param subscriberId the subscriber id

+	 * @return ResponseEntity The response entity

+	 */

+	@RequestMapping(value = "/aai_sub_details/{subscriberId}", method = RequestMethod.GET)

+	public ResponseEntity<String> GetSubscriberDetails(HttpServletRequest request,@PathVariable("subscriberId") String subscriberId) throws IOException {

+		ObjectMapper objectMapper = new ObjectMapper();

+		ResponseEntity responseEntity;

+		List<Role> roles = new RoleProvider().getUserRoles(request);

+		RoleValidator roleValidator = new RoleValidator(roles);

+		AaiResponse<SubscriberData> subscriberData = aaiService.getSubscriberData(subscriberId,roleValidator);

+		String httpMessage = subscriberData.getT() != null ?

+				objectMapper.writeValueAsString(subscriberData.getT()) :

+					subscriberData.getErrorMessage();

+

+				responseEntity = new ResponseEntity<String>(httpMessage, HttpStatus.valueOf(subscriberData.getHttpCode()));

+				return responseEntity;

+	}

+

+	/**

+	 * Issue a named query to a&ai.

+	 *

+	 * @param namedQueryId     the named query id

+	 * @param globalCustomerId the global customer id

+	 * @param serviceType      the service type

+	 * @param serviceInstance  the service instance

+	 * @return ResponseEntity The response entity

+	 */

+	@RequestMapping(value = "/aai_sub_viewedit/{namedQueryId}/{globalCustomerId}/{serviceType}/{serviceInstance}", method = RequestMethod.GET)

+	public ResponseEntity<String> viewEditGetComponentList(

+			@PathVariable("namedQueryId") String namedQueryId,

+			@PathVariable("globalCustomerId") String globalCustomerId,

+			@PathVariable("serviceType") String serviceType,

+			@PathVariable("serviceInstance") String serviceInstance) {

+

+		String componentListPayload = getComponentListPutPayload(namedQueryId, globalCustomerId, serviceType, serviceInstance);

+		File certiPath = GetCertificatesPath();

+

+		Response resp = doAaiPost(certiPath.getAbsolutePath(), "search/named-query", componentListPayload, false);

+		return convertResponseToResponseEntity(resp);

+	}

+

+

+	//	@RequestMapping(value="/aai_get_tenants/{global-customer-id}", method = RequestMethod.GET)

+	//	public ResponseEntity<String> viewEditGetComponentList(

+	//			@PathVariable("global-customer-id") String globalCustomerId) {

+	//		return new ResponseEntity<String>(getTenants(globalCustomerId), HttpStatus.OK);

+	//	}

+

+	/**

+	 * Issue a named query to a&ai.

+	 *

+	 * @param namedQueryId     the named query id

+	 * @param globalCustomerId the global customer id

+	 * @param serviceType      the service type

+	 * @return ResponseEntity The response entity

+	 */

+	@RequestMapping(value = "/aai_get_models_by_service_type/{namedQueryId}/{globalCustomerId}/{serviceType}", method = RequestMethod.GET)

+	public ResponseEntity<String> viewEditGetComponentList(

+			@PathVariable("namedQueryId") String namedQueryId,

+			@PathVariable("globalCustomerId") String globalCustomerId,

+			@PathVariable("serviceType") String serviceType) {

+

+		String componentListPayload = getModelsByServiceTypePayload(namedQueryId, globalCustomerId, serviceType);

+		File certiPath = GetCertificatesPath();

+

+		Response resp = doAaiPost(certiPath.getAbsolutePath(), "search/named-query", componentListPayload, false);

+		return convertResponseToResponseEntity(resp);

+	}

+

+	/**

+	 * Parses the for tenants.

+	 *

+	 * @param resp the resp

+	 * @return the string

+	 */

+	private String parseForTenants(String resp) {

+		String tenantList = "";

+

+		try {

+			JSONParser jsonParser = new JSONParser();

+

+			JSONObject jsonObject = (JSONObject) jsonParser.parse(resp);

+

+			return parseCustomerObjectForTenants(jsonObject);

+		} catch (Exception ex) {

+

+		}

+

+		return tenantList;

+	}

+

+	/**

+	 * Parses the for tenants by service subscription.

+	 *

+	 * @param resp the resp

+	 * @return the string

+	 */

+	private String parseForTenantsByServiceSubscription(String resp) {

+		String tenantList = "";

+

+		try {

+			JSONParser jsonParser = new JSONParser();

+

+			JSONObject jsonObject = (JSONObject) jsonParser.parse(resp);

+

+			return parseServiceSubscriptionObjectForTenants(jsonObject);

+		} catch (Exception ex) {

+

+		}

+

+		return tenantList;

+	}

+

+	/**

+	 * Obtain tenants for a given service type.

+	 *

+	 * @param globalCustomerId the global customer id

+	 * @param serviceType      the service type

+	 * @return ResponseEntity The response entity

+	 */

+	@RequestMapping(value = "/aai_get_tenants/{global-customer-id}/{service-type}", method = RequestMethod.GET)

+	public ResponseEntity<String> viewEditGetTenantsFromServiceType(HttpServletRequest request,

+			@PathVariable("global-customer-id") String globalCustomerId, @PathVariable("service-type") String serviceType) {

+

+		ResponseEntity responseEntity;

+		try {

+			ObjectMapper objectMapper = new ObjectMapper();

+			List<Role> roles = new RoleProvider().getUserRoles(request);

+			RoleValidator roleValidator = new RoleValidator(roles);

+			AaiResponse<GetTenantsResponse[]> response = aaiService.getTenants(globalCustomerId, serviceType, roleValidator);

+			if (response.getHttpCode() == 200) {

+				responseEntity = new ResponseEntity<String>(objectMapper.writeValueAsString(response.getT()), HttpStatus.OK);

+			} else {

+				responseEntity = new ResponseEntity<String>(response.getErrorMessage(), HttpStatus.valueOf(response.getHttpCode()));

+			}

+		}

+		catch (Exception e){

+			responseEntity = new ResponseEntity<String>("Unable to proccess getTenants reponse", HttpStatus.INTERNAL_SERVER_ERROR);

+		}

+		return responseEntity;

+	}

+

+

+	private ResponseEntity<String> convertResponseToResponseEntity(Response resp) {

+		ResponseEntity<String> respEnt;

+		ObjectMapper objectMapper = new ObjectMapper();

+		if (resp == null) {

+			respEnt = new ResponseEntity<String>("Failed to fetch data from A&AI, check server logs for details.", HttpStatus.INTERNAL_SERVER_ERROR);

+		} else {

+			respEnt = new ResponseEntity<String>(resp.readEntity(String.class), HttpStatus.valueOf(resp.getStatus()));

+		}

+		return respEnt;

+	}

+

+	/**

+	 * Gets the tenants.

+	 *

+	 * @param globalCustomerId the global customer id

+	 * @return the tenants

+	 */

+	private ResponseEntity<String> getTenants(String globalCustomerId) {

+		File certiPath = GetCertificatesPath();

+		Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + globalCustomerId, false);

+

+		ResponseEntity<String> respEnt;

+		if (resp.getStatus() >= 200 && resp.getStatus() <= 299) {

+			respEnt = new ResponseEntity<String>(parseForTenants((String) resp.readEntity(String.class)), HttpStatus.OK);

+		} else {

+			respEnt = new ResponseEntity<String>((String) resp.readEntity(String.class), HttpStatus.valueOf(resp.getStatus()));

+		}

+		return respEnt;

+

+	}

+

+	/**

+	 * Gets the tenants from service type.

+	 *

+	 * @param globalCustomerId the global customer id

+	 * @param serviceType      the service type

+	 * @return the tenants from service type

+	 */

+	private ResponseEntity<String> getTenantsFromServiceType(String globalCustomerId, String serviceType) {

+

+

+

+

+

+		File certiPath = GetCertificatesPath();

+		String url = "business/customers/customer/" + globalCustomerId + "/service-subscriptions/service-subscription/" + serviceType;

+

+		Response resp = doAaiGet(certiPath.getAbsolutePath(), url, false);

+

+		ResponseEntity<String> respEnt;

+		if (resp.getStatus() >= 200 && resp.getStatus() <= 299) {

+			respEnt = new ResponseEntity<String>(parseForTenantsByServiceSubscription((String) resp.readEntity(String.class)), HttpStatus.OK);

+		} else {

+			respEnt = new ResponseEntity<String>((String) resp.readEntity(String.class), HttpStatus.valueOf(resp.getStatus()));

+		}

+		return respEnt;

+

+	}

+

+	/**

+	 * Gets the services.

+	 *

+	 * @return the services

+	 */

+	private Response getServices() {

+		File certiPath = GetCertificatesPath();

+		Response resp = doAaiGet(certiPath.getAbsolutePath(), "service-design-and-creation/services", false);

+		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getServices() resp=" + resp.getStatusInfo());

+

+		//model.put("aai_get_services", resp);

+		return resp;

+	}

+

+	/**

+	 * Gets the subscribers.

+	 *

+	 * @param isFullSet the is full set

+	 * @return the subscribers

+	 */

+	private Response getSubscribers(boolean isFullSet) {

+

+		File certiPath = GetCertificatesPath();

+		String depth = "0";

+

+		Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers?subscriber-type=INFRA&depth=" + depth, false);

+		if (resp != null) {

+			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getSubscribers() resp=" + resp.getStatusInfo().toString());

+		}

+		return resp;

+	}

+

+	/**

+	 * Gets the subscriber details.

+	 *

+	 * @param subscriberId the subscriber id

+	 * @return the subscriber details

+	 */

+	private Response getSubscriberDetails(String subscriberId) {

+		File certiPath = GetCertificatesPath();

+		Response resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + subscriberId + "?depth=2", false);

+		//String resp = doAaiGet(certiPath.getAbsolutePath(), "business/customers/customer/" + subscriberId, false);

+		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getSubscriberDetails() resp=" + resp.getStatusInfo().toString());

+		return resp;

+	}

+

+	/**

+	 * Gets the certificates path.

+	 *

+	 * @return the file

+	 */

+	private File GetCertificatesPath() {

+		if (servletContext != null)

+			return new File(servletContext.getRealPath("/WEB-INF/cert/"));

+		return null;

+	}

+

+	/**

+	 * Send a GET request to a&ai.

+	 *

+	 * @param certiPath the certi path

+	 * @param uri       the uri

+	 * @param xml       the xml

+	 * @return String The response

+	 */

+	protected Response doAaiGet(String certiPath, String uri, boolean xml) {

+		String methodName = "getSubscriberList";

+		String transId = UUID.randomUUID().toString();

+		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+

+		Response resp = null;

+		try {

+

+			AAIRestInterface restContrller = new AAIRestInterface(certiPath);

+			resp = restContrller.RestGet(fromAppId, transId, uri, xml);

+

+		} catch (WebApplicationException e) {

+			final String message = ((BadRequestException) e).getResponse().readEntity(String.class);

+			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + message);

+			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + message);

+		} catch (Exception e) {

+			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+		}

+

+		return resp;

+	}

+

+	/**

+	 * Send a POST request to a&ai.

+	 *

+	 * @param certiPath the certi path

+	 * @param uri       the uri

+	 * @param payload   the payload

+	 * @param xml       the xml

+	 * @return String The response

+	 */

+	protected Response doAaiPost(String certiPath, String uri, String payload, boolean xml) {

+		String methodName = "getSubscriberList";

+		String transId = UUID.randomUUID().toString();

+		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+

+		Response resp = null;

+		try {

+

+			AAIRestInterface restContrller = new AAIRestInterface(certiPath);

+			resp = restContrller.RestPost(fromAppId, transId, uri, payload, xml);

+

+		} catch (Exception e) {

+			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+		}

+

+		return resp;

+	}

+

+	/**

+	 * Gets the component list put payload.

+	 *

+	 * @param namedQueryId     the named query id

+	 * @param globalCustomerId the global customer id

+	 * @param serviceType      the service type

+	 * @param serviceInstance  the service instance

+	 * @return the component list put payload

+	 */

+	private String getComponentListPutPayload(String namedQueryId, String globalCustomerId, String serviceType, String serviceInstance) {

+		return

+				"		{" +

+				"    \"instance-filters\": {" +

+				"        \"instance-filter\": [" +

+				"            {" +

+				"                \"customer\": {" +

+				"                    \"global-customer-id\": \"" + globalCustomerId + "\"" +

+				"                }," +

+				"                \"service-instance\": {" +

+				"                    \"service-instance-id\": \"" + serviceInstance + "\"" +

+				"                }," +

+				"                \"service-subscription\": {" +

+				"                    \"service-type\": \"" + serviceType + "\"" +

+				"                }" +

+				"            }" +

+				"        ]" +

+				"    }," +

+				"    \"query-parameters\": {" +

+				"        \"named-query\": {" +

+				"            \"named-query-uuid\": \"" + namedQueryId + "\"" +

+				"        }" +

+				"    }" +

+				"}";

+

+	}

+

+	private String getModelsByServiceTypePayload(String namedQueryId, String globalCustomerId, String serviceType) {

+		// TODO Auto-generated method stub

+		return "		{" +

+		"    \"instance-filters\": {" +

+		"        \"instance-filter\": [" +

+		"            {" +

+		"                \"customer\": {" +

+		"                    \"global-customer-id\": \"" + globalCustomerId + "\"" +

+		"                }," +

+		"                \"service-subscription\": {" +

+		"                    \"service-type\": \"" + serviceType + "\"" +

+		"                }" +

+		"            }" +

+		"        ]" +

+		"    }," +

+		"    \"query-parameters\": {" +

+		"        \"named-query\": {" +

+		"            \"named-query-uuid\": \"" + namedQueryId + "\"" +

+		"        }" +

+		"    }" +

+		"}";

+

+	}

 }

 

diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/MsoController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/MsoController.java
index f051ed3..56fbd4c 100755
--- a/vid-app-common/src/main/java/org/openecomp/vid/controller/MsoController.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/MsoController.java
@@ -21,106 +21,80 @@
 package org.openecomp.vid.controller;

 

 

-import java.io.BufferedReader;

+import com.fasterxml.jackson.databind.ObjectMapper;

+import org.glassfish.jersey.client.ClientResponse;

+import org.json.simple.JSONArray;

+import org.json.simple.JSONObject;

+import org.json.simple.parser.JSONParser;

+import org.openecomp.portalsdk.core.controller.RestrictedBaseController;

+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;

+import org.openecomp.portalsdk.core.util.SystemProperties;

+import org.openecomp.vid.model.ExceptionResponse;

+import org.openecomp.vid.mso.*;

+import org.openecomp.vid.mso.rest.RequestDetails;

+import org.openecomp.vid.roles.RoleProvider;

+import org.openecomp.vid.roles.RoleValidator;

+import org.springframework.http.HttpStatus;

+import org.springframework.http.ResponseEntity;

+import org.springframework.web.bind.annotation.*;

+

+import javax.servlet.http.HttpServletRequest;

+import javax.servlet.http.HttpServletResponse;

+import javax.servlet.http.HttpSession;

 import java.io.IOException;

-import java.io.InputStreamReader;

-import java.io.OutputStream;

 import java.io.PrintWriter;

 import java.io.StringWriter;

 import java.text.DateFormat;

 import java.text.SimpleDateFormat;

 import java.util.ArrayList;

-//import java.util.UUID;

 import java.util.Date;

-import java.util.Iterator;

 import java.util.List;

 import java.util.Map;

-import java.util.Scanner;

-import java.util.stream.Collectors;

-

-import javax.servlet.http.HttpServletRequest;

-import javax.servlet.http.HttpServletResponse;

-

-import org.codehaus.jackson.JsonEncoding;

-import org.codehaus.jackson.JsonFactory;

-import org.codehaus.jackson.JsonGenerator;

-import org.codehaus.jackson.JsonParser;

-import org.codehaus.jackson.JsonToken;

-import org.glassfish.jersey.client.ClientResponse;

-import org.json.simple.JSONArray;

-import org.json.simple.JSONObject;

-import org.json.simple.parser.JSONParser;

-import org.openecomp.vid.domain.mso.CloudConfiguration;

-import org.openecomp.vid.domain.mso.ModelInfo;

-import org.openecomp.vid.domain.mso.ModelInfo.ModelType;

-import org.openecomp.vid.domain.mso.RequestInfo;

-import org.openecomp.vid.domain.mso.RequestParameters;

-import org.openecomp.vid.model.ExceptionResponse;

-import org.openecomp.vid.mso.MsoProperties;

-import org.openecomp.vid.mso.MsoResponseWrapper;

-import org.openecomp.vid.mso.MsoRestInterfaceFactory;

-import org.openecomp.vid.mso.MsoRestInterfaceIfc;

-import org.openecomp.vid.mso.MsoUtil;

-import org.openecomp.vid.mso.RestObject;

-import org.openecomp.vid.mso.rest.RelatedModel;

-import org.openecomp.vid.mso.rest.RequestDetails;

-import org.springframework.http.HttpStatus;

-//import org.springframework.http.ResponseEntity;

-//import org.springframework.http.RequestEntity;

-import org.springframework.http.ResponseEntity;

-import org.springframework.web.bind.annotation.ExceptionHandler;

-import org.springframework.web.bind.annotation.PathVariable;

-import org.springframework.web.bind.annotation.RequestBody;

-import org.springframework.web.bind.annotation.RequestMapping;

-import org.springframework.web.bind.annotation.RequestMethod;

-import org.springframework.web.bind.annotation.RestController;

-import org.springframework.web.servlet.ModelAndView;

-

-import org.openecomp.portalsdk.core.controller.RestrictedBaseController;

-import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;

-import org.openecomp.portalsdk.core.util.SystemProperties;

-import com.fasterxml.jackson.databind.ObjectMapper;

-import com.fasterxml.jackson.databind.ObjectReader;

-import com.fasterxml.jackson.databind.DeserializationFeature;

 

 /**

  * The Class MsoController.

  */

 @RestController

 @RequestMapping("mso")

-public class MsoController extends RestrictedBaseController{

-	

-	/** The view name. */

-	String viewName;

-	

-	/** The logger. */

-	EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoController.class);

-	

-	/** The Constant dateFormat. */

-	final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");

-	

-	/** The Constant SVC_INSTANCE_ID. */

-	public final static String SVC_INSTANCE_ID = "<service_instance_id>";

-	

-	/** The Constant VNF_INSTANCE_ID. */

-	public final static String VNF_INSTANCE_ID = "<vnf_instance_id>";

-	

-	/**

-	 * Welcome.

-	 *

-	 * @param request the request

-	 * @return the model and view

-	 

-	public ModelAndView welcome(HttpServletRequest request) {

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== MsoController welcome start");

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + " MSO_SERVER_URL=" +

-				 SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) );

-		return new ModelAndView(getViewName());		

-	}

-	*/

+public class MsoController extends RestrictedBaseController {

+

+    /**

+     * The Constant SVC_INSTANCE_ID.

+     */

+    public final static String SVC_INSTANCE_ID = "<service_instance_id>";

+    /**

+     * The Constant VNF_INSTANCE_ID.

+     */

+    public final static String VNF_INSTANCE_ID = "<vnf_instance_id>";

+    /**

+     * The Constant dateFormat.

+     */

+    final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");

+    /**

+     * The view name.

+     */

+    String viewName;

+    /**

+     * The logger.

+     */

+    EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoController.class);

+

+    /**

+     * Welcome.

+     *

+     * @param request the request

+     * @return the model and view

+

+    public ModelAndView welcome(HttpServletRequest request) {

+    logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== MsoController welcome start");

+    logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + " MSO_SERVER_URL=" +

+    SystemProperties.getProperty(MsoProperties.MSO_SERVER_URL) );

+    return new ModelAndView(getViewName());

+    }

+     */

 

 	/* (non-Javadoc)

-	 * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName()

+     * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#getViewName()

 	 

 	public String getViewName() {

 		return viewName;

@@ -128,504 +102,538 @@
 	*/

 

 	/* (non-Javadoc)

-	 * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String)

+     * @see org.openecomp.portalsdk.core.controller.RestrictedBaseController#setViewName(java.lang.String)

 	 

 	public void setViewName(String viewName) {

 		this.viewName = viewName;

 	}

 	*/

 

-	/**

-	 * Creates the svc instance.

-	 *

-	 * @param request the request

-	 * @return the response entity

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value = "/mso_create_svc_instance", method = RequestMethod.POST)

-	public ResponseEntity<String> createSvcInstance(HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

-		String methodName = "createSvcInstance";

-		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start" );

-		

+    /**

+     * Creates the svc instance.

+     *

+     * @param request the request

+     * @return the response entity

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_create_svc_instance", method = RequestMethod.POST)

+    public ResponseEntity<String> createSvcInstance(HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+

+

+        String methodName = "createSvcInstance";

+

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+

+        if (!userIsPermmited(request, mso_request)) {

+            return new ResponseEntity<String>(HttpStatus.FORBIDDEN);

+        }

 //		mso_request = retrieveRequestObject (request, mso_request);

 

-		String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);

-	    

-		MsoResponseWrapper w = createInstance(mso_request, p);

-		// always return OK, the MSO status code is embedded in the body

-		

-        return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-	

-	}

-	

-	/**

-	 * Creates the vnf.

-	 *

-	 * @param serviceInstanceId the service instance id

-	 * @param request the request

-	 * @return the response entity

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value="/mso_create_vnf_instance/{serviceInstanceId}", method = RequestMethod.POST)  	

-	public ResponseEntity<String> createVnf(@PathVariable("serviceInstanceId") String serviceInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

-		

-		String methodName = "createVnf";		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		

-		//RequestDetails mso_request = retrieveRequestObject (request);

-	    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE);

-	    

-	    if ( p == null || p.isEmpty()) {

-	    	throw new Exception ( "Vnf instance path is not defined");

-	    }

-	    // /serviceInstances/v2/<service_instance_id>/vnfs

-	    String vnf_path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId );

-	    MsoResponseWrapper w = createInstance(mso_request, vnf_path);

+        String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);

+        String userId = "";

+        HttpSession session = request.getSession();

+        System.out.println((new ObjectMapper().writeValueAsString(session.getAttribute("roles"))));

+        MsoResponseWrapper w = createInstance(mso_request, p);

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+        // always return OK, the MSO status code is embedded in the body

 

-		// always return OK, the MSO status code is embedded in the body

-		

-        return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-	

-	}

-	

-	/**

-	 * Creates the nw instance.

-	 *

-	 * @param serviceInstanceId the service instance id

-	 * @param request the request

-	 * @return the response entity

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value = "/mso_create_nw_instance/{serviceInstanceId}", method = RequestMethod.POST)

-	public ResponseEntity<String> createNwInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

-	

-		String methodName = "createNwInstance";		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start, serviceInstanceId = " + serviceInstanceId  );

-		

-		//RequestDetails mso_request = retrieveRequestObject (request);

-		

-	    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);

-	    

-	    if ( p == null || p.isEmpty()) {

-	    	throw new Exception ( "Network instance path is not defined");

-	    }

-	    // /serviceInstances/v2/<serviceInstanceId>/networks/

-	    

-	    String nw_path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId );

-	    MsoResponseWrapper w = createInstance(mso_request, nw_path);

-	   

-		// always return OK, the MSO status code is embedded in the body

-		

-        return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-	

-	}

-	

-	/**

-	 * Creates the volume group instance.

-	 *

-	 * @param serviceInstanceId the service instance id

-	 * @param vnfInstanceId the vnf instance id

-	 * @param request the request

-	 * @return the response entity

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value = "/mso_create_volumegroup_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST)

-	public ResponseEntity<String> createVolumeGroupInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId, 

-			HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

-		String methodName = "createVolumeGroupInstance";

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		

-		//RequestDetails mso_request = retrieveRequestObject (request);

-		String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);

-	    

-	    if ( p == null || p.isEmpty()) {

-	    	throw new Exception ( "Volume group instance path is not defined");

-	    }

-	    String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);

-	    path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);

-	    

-	    MsoResponseWrapper w = createInstance(mso_request, path);

-        

-		// always return OK, the MSO status code is embedded in the body

-        return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-	}

-	

-	/**

-	 * Creates the vf module instance.

-	 *

-	 * @param serviceInstanceId the service instance id

-	 * @param vnfInstanceId the vnf instance id

-	 * @param request the request

-	 * @return the response entity

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value = "/mso_create_vfmodule_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST)

-	public ResponseEntity<String> createVfModuleInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, 

-			@PathVariable("vnfInstanceId") String vnfInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

-		String methodName = "createVfModuleInstance";		

-		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		//RequestDetails mso_request = retrieveRequestObject (request);

-	    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);

-	    

-	    if ( p == null || p.isEmpty()) {

-	    	throw new Exception ( "VF module instance path is not defined");

-	    }

-	    // /serviceInstances/v2/<serviceInstanceId>/vnfs/<vnfInstanceId>/vfmodules

-	    String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);

-	    path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);

-	    

-	    MsoResponseWrapper w = createInstance(mso_request, path);

-		

-		// always return OK, the MSO status code is embedded in the body

-		

-        return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-	}

-	

-	/**

-	 * Creates the instance.

-	 *

-	 * @param request the request

-	 * @param path the path

-	 * @return the mso response wrapper

-	 * @throws ClientHandlerException the client handler exception

-	 * @throws Exception the exception

-	 */

-	protected MsoResponseWrapper createInstance(RequestDetails request, String path) throws Exception {

-		String methodName = "createInstance";	

-		logger.debug(dateFormat.format(new Date()) + "<== " + methodName + " start");

-		

-		try {

-			MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance();

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " calling Post, request = (" + request + ")");	

-			

-			RestObject<String> restObjStr = new RestObject<String>();

-			String str = new String();

-			restObjStr.set(str);

-			restController.<String>Post(str, request, "", path, restObjStr );

-			MsoResponseWrapper w = MsoUtil.wrapResponse (restObjStr);

-			

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

-			return w;

-		} catch (Exception e) {

-			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			throw e;

-		}

-	}

-	

-	/**

-	 * Delete svc instance.

-	 *

-	 * @param serviceInstanceId the service instance id

-	 * @param request the request

-	 * @return the response entity

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value = "/mso_delete_svc_instance/{serviceInstanceId}", method = RequestMethod.POST)

-	public ResponseEntity<String> deleteSvcInstance(@PathVariable("serviceInstanceId") String serviceInstanceId,

-			HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

-		

-		String methodName = "deleteSvcInstance";	

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		

-		//RequestDetails mso_request = retrieveRequestObject (request);

-	    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);

-	    String path = p + "/" + serviceInstanceId;

-	    MsoResponseWrapper w = deleteInstance ( mso_request, path );

-	  

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

-		// always return OK, the MSO status code is embedded in the body

-  		

-        return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-	    

-	}

-	

-	/**

-	 * Delete vnf.

-	 *

-	 * @param serviceInstanceId the service instance id

-	 * @param vnfInstanceId the vnf instance id

-	 * @param request the request

-	 * @return the response entity

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value = "/mso_delete_vnf_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST)

-	

-	public ResponseEntity<String> deleteVnf(@PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId, 

-			HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

-		String methodName = "deleteVnf";		

-		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		

-		//RequestDetails mso_request = retrieveRequestObject (request);

-	    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE);

-	    if ( p == null || p.isEmpty()) {

-	    	throw new Exception ( "Vnf instance path is not defined");

-	    }

-	    // /serviceInstances/v2/<service_instance_id>/vnfs/

-	    String vnf_path = p.replaceFirst(SVC_INSTANCE_ID, vnfInstanceId );

-	    MsoResponseWrapper w = deleteInstance ( mso_request, vnf_path + "/" + vnfInstanceId );

-	    

-		// always return OK, the MSO status code is embedded in the body

-        return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-		

-	}

-							  

-  							/**

-  							 * Delete vf module.

-  							 *

-  							 * @param serviceInstanceId the service instance id

-  							 * @param vnfInstanceId the vnf instance id

-  							 * @param vfModuleId the vf module id

-  							 * @param request the request

-  							 * @return the response entity

-  							 * @throws Exception the exception

-  							 */

-  							//mso_delete_vf_module/bc305d54-75b4-431b-adb2-eb6b9e546014/vnfs/fe9000-0009-9999/vfmodules/abeeee-abeeee-abeeee

-	@RequestMapping(value = "/mso_delete_vfmodule_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfModuleId}", method = RequestMethod.POST)

-	public ResponseEntity<String> deleteVfModule (

-			@PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId,

-			@PathVariable("vfModuleId") String vfModuleId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

-		

-		String methodName = "deleteVfModule";

-		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		

-		//RequestDetails mso_request = new RequestDetails();

-		//mso_request = retrieveRequestObject (request);

-	    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);

-	    if ( p == null || p.isEmpty()) {

-	    	throw new Exception ( "VF Module instance path is not defined");

-	    }

-	    // /serviceInstances/v2/<serviceInstanceId>/vnfs/<vnfInstanceId>/vfmodules

-	    String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId );

-	    path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId );

-	    MsoResponseWrapper w = deleteInstance ( mso_request, path + "/" + vfModuleId);

-	    

-		// always return OK, the MSO status code is embedded in the body

-        return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

 

-	}

+    }

 

-	/**

-	 * Delete volume group instance.

-	 *

-	 * @param serviceInstanceId the service instance id

-	 * @param vnfInstanceId the vnf instance id

-	 * @param volumeGroupId the volume group id

-	 * @param request the request

-	 * @return the response entity

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value = "/mso_delete_volumegroup_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupId}", method = RequestMethod.POST)

-	public ResponseEntity<String> deleteVolumeGroupInstance (

-			@PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId, @PathVariable("volumeGroupId") String volumeGroupId,

-			HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

-		

-		String methodName = "deleteVolumeGroupInstance";		

-		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		//RequestDetails mso_request = retrieveRequestObject (request);

-		

-	    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);

-	    if ( p == null || p.isEmpty()) {

-	    	throw new Exception ( "Volume group instance path is not defined");

-	    }

-	    // /serviceInstances/v2/{serviceInstanceId}/volumeGroups

-	    String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId );

-	    path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId );

-	    MsoResponseWrapper w = deleteInstance ( mso_request, path + "/" + volumeGroupId);

-	    

-		// always return OK, the MSO status code is embedded in the body

-        return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-	}

-	

-	/**

-	 * Delete nw instance.

-	 *

-	 * @param serviceInstanceId the service instance id

-	 * @param networkInstanceId the network instance id

-	 * @param request the request

-	 * @return the response entity

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value = "/mso_delete_nw_instance/{serviceInstanceId}/networks/{networkInstanceId}", method = RequestMethod.POST)

-	public ResponseEntity<String> deleteNwInstance(@PathVariable("serviceInstanceId") String serviceInstanceId,

-		@PathVariable("networkInstanceId") String networkInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

-	

-		String methodName = "deleteNwInstance";		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		

-		//RequestDetails mso_request = retrieveRequestObject (request);

-		

-	    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);

-	    if ( p == null || p.isEmpty()) {

-	    	throw new Exception ( "Network instance path is not defined");

-	    }

-	    // /serviceInstances/v2/<service_instance_id>/networks

-	    String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId );

-	    MsoResponseWrapper w = deleteInstance ( mso_request, path + "/" + networkInstanceId);

-	    

-		// always return OK, the MSO status code is embedded in the body

-        return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-	    

-	}

-	

-	/**

-	 * Delete instance.

-	 *

-	 * @param request the request

-	 * @param path the path

-	 * @return the mso response wrapper

-	 * @throws Exception the exception

-	 */

-	protected  MsoResponseWrapper deleteInstance(RequestDetails request, String path) throws Exception {

-		String methodName = "deleteInstance";	

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		

-		try {

-			MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance();

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " calling Delete, path =[" + path + "]");

-		

-			RestObject<String> restObjStr = new RestObject<String>();

-			String str = new String();

-			restObjStr.set(str);

-			restController.<String>Delete(str, request, "", path, restObjStr );

-			MsoResponseWrapper w = MsoUtil.wrapResponse (restObjStr);

-			

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

-			return w;

+    private boolean userIsPermmited(HttpServletRequest request, RequestDetails mso_request) {

 

-		} catch (Exception e) {

-			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			throw e;

-		}

-		

-	}

-	

-	/**

-	 * Gets the orchestration request.

-	 *

-	 * @param requestId the request id

-	 * @param request the request

-	 * @return the orchestration request

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value = "/mso_get_orch_req/{requestId}", method = RequestMethod.GET)

-	public ResponseEntity<String> getOrchestrationRequest(@PathVariable("requestId") String requestId,

-			HttpServletRequest request) throws Exception {

-		

-		String methodName = "getOrchestrationRequest";		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		MsoResponseWrapper w = null;

-		try {

-			MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance();

-		    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQ);

-		    String path = p + "/" + requestId;

-		    

-		    RestObject<String> restObjStr = new RestObject<String>();

-			String str = new String();

-			restObjStr.set(str);

+        RoleValidator roleValidator = new RoleValidator(new RoleProvider().getUserRoles(request));

+        boolean isPermitted = roleValidator.isMsoRequestValid(mso_request);

+        if (!isPermitted) {

+            return false;

+        } else {

+            return true;

+        }

+    }

 

-		    restController.<String>Get(str, "", path, restObjStr);

-		    

-		    w = MsoUtil.wrapResponse (restObjStr);

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

-			// always return OK, the MSO status code is embedded in the body

-	  		

-		} catch (Exception e) {

-			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			throw e;

-		}

-		// always return OK, the MSO status code is embedded in the body

-  		return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-	}

-	

-	

-	/**

-	 * Gets the orchestration requests.

-	 *

-	 * @param filterString the filter string

-	 * @param request the request

-	 * @return the orchestration requests

-	 * @throws Exception the exception

-	 */

-	@RequestMapping(value = "/mso_get_orch_reqs/{filterString}", method = RequestMethod.GET)

-	public ResponseEntity<String> getOrchestrationRequests(@PathVariable("filterString") String filterString,

-			HttpServletRequest request) throws Exception {

-		

-		String methodName = "getOrchestrationRequests";		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		MsoResponseWrapper w = null;

-		try {

-			MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance();

-		    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);

-		    String path = p + filterString;

-		    

-		    RestObject<String> restObjStr = new RestObject<String>();

-			String str = new String();

-			restObjStr.set(str);

+    /**

+     * Creates the vnf.

+     *

+     * @param serviceInstanceId the service instance id

+     * @param request           the request

+     * @return the response entity

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_create_vnf_instance/{serviceInstanceId}", method = RequestMethod.POST)

+    public ResponseEntity<String> createVnf(@PathVariable("serviceInstanceId") String serviceInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+//        if (!userIsPermmited(request, mso_request)) {

+            String instanceId = (String) ((Map)((Map)((ArrayList)((Map) mso_request.getAdditionalProperties().get("requestDetails")).get("relatedInstanceList")).get(0)).get("relatedInstance")).get("instanceId");

+            ResponseEntity<String> a = new AaiController(request.getServletContext()).doGetServiceInstance(instanceId,"Service Instance id");

+//            return new ResponseEntity<String>(HttpStatus.FORBIDDEN);

+//        }

+        String methodName = "createVnf";

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

 

-		    restController.<String>Get(str, "", path, restObjStr);

-		   

-		    w = MsoUtil.wrapResponse (restObjStr);

-		    logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

-		} catch (Exception e) {

-			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			throw e;

-		}

-		// always return OK, the MSO status code is embedded in the body

-  		return ( new ResponseEntity<String>(w.getResponse(), HttpStatus.OK) );

-	}

-	 	

-	/**

-	 * Gets the orchestration requests for svc instance.

-	 *

-	 * @param svc_instance_id the svc instance id

-	 * @return the orchestration requests for svc instance

-	 * @throws Exception the exception

-	 */

-	public MsoResponseWrapper getOrchestrationRequestsForSvcInstance (String svc_instance_id) throws Exception {

-		

-		String methodName = "getOrchestrationRequestsForSvcInstance";		

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

-		MsoResponseWrapper w = null;

-		

-		try {

-			MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance();

-		    String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);

-		    String path = p + svc_instance_id;

-		    

-		    RestObject<String> restObjStr = new RestObject<String>();

-			String str = new String();

-			restObjStr.set(str);

-			

-			restController.<String>Get(str, "", path, restObjStr);

-			w = MsoUtil.wrapResponse (restObjStr);

-		    logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

-		

-		} catch (Exception e) {

-			logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-			throw e;

-		}

-		return w;

-	}

-	

-	/**

-	 * Exception handler.

-	 *

-	 * @param e the e

-	 * @param response the response

-	 * @throws IOException Signals that an I/O exception has occurred.

-	 */

-	@ExceptionHandler(Exception.class)

-	private void exceptionHandler(Exception e, HttpServletResponse response) throws IOException {

+        //RequestDetails mso_request = retrieveRequestObject (request);

+        String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE);

+

+        if (p == null || p.isEmpty()) {

+            throw new Exception("Vnf instance path is not defined");

+        }

+        // /serviceInstances/v2/<service_instance_id>/vnfs

+        String vnf_path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);

+        MsoResponseWrapper w = createInstance(mso_request, vnf_path);

+

+        // always return OK, the MSO status code is embedded in the body

+

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+

+    }

+

+    /**

+     * Creates the nw instance.

+     *

+     * @param serviceInstanceId the service instance id

+     * @param request           the request

+     * @return the response entity

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_create_nw_instance/{serviceInstanceId}", method = RequestMethod.POST)

+    public ResponseEntity<String> createNwInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+

+        String methodName = "createNwInstance";

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start, serviceInstanceId = " + serviceInstanceId);

+

+        //RequestDetails mso_request = retrieveRequestObject (request);

+

+        String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);

+

+        if (p == null || p.isEmpty()) {

+            throw new Exception("Network instance path is not defined");

+        }

+        // /serviceInstances/v2/<serviceInstanceId>/networks/

+

+        String nw_path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);

+        MsoResponseWrapper w = createInstance(mso_request, nw_path);

+

+        // always return OK, the MSO status code is embedded in the body

+

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+

+    }

+

+    /**

+     * Creates the volume group instance.

+     *

+     * @param serviceInstanceId the service instance id

+     * @param vnfInstanceId     the vnf instance id

+     * @param request           the request

+     * @return the response entity

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_create_volumegroup_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST)

+    public ResponseEntity<String> createVolumeGroupInstance(@PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId,

+                                                            HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+        String methodName = "createVolumeGroupInstance";

+        if (!userIsPermmited(request, mso_request)) {

+            return new ResponseEntity<String>(HttpStatus.FORBIDDEN);

+        }

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+

+        //RequestDetails mso_request = retrieveRequestObject (request);

+        String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);

+

+        if (p == null || p.isEmpty()) {

+            throw new Exception("Volume group instance path is not defined");

+        }

+        String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);

+        path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);

+

+        MsoResponseWrapper w = createInstance(mso_request, path);

+

+        // always return OK, the MSO status code is embedded in the body

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+    }

+

+    /**

+     * Creates the vf module instance.

+     *

+     * @param serviceInstanceId the service instance id

+     * @param vnfInstanceId     the vnf instance id

+     * @param request           the request

+     * @return the response entity

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_create_vfmodule_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST)

+    public ResponseEntity<String> createVfModuleInstance(@PathVariable("serviceInstanceId") String serviceInstanceId,

+                                                         @PathVariable("vnfInstanceId") String vnfInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+        String methodName = "createVfModuleInstance";

+

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+        if (!userIsPermmited(request, mso_request)) {

+            return new ResponseEntity<String>(HttpStatus.FORBIDDEN);

+        }

+        //RequestDetails mso_request = retrieveRequestObject (request);

+        String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);

+

+        if (p == null || p.isEmpty()) {

+            throw new Exception("VF module instance path is not defined");

+        }

+        // /serviceInstances/v2/<serviceInstanceId>/vnfs/<vnfInstanceId>/vfmodules

+        String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);

+        path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);

+

+        MsoResponseWrapper w = createInstance(mso_request, path);

+

+        // always return OK, the MSO status code is embedded in the body

+

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+    }

+

+    /**

+     * Creates the instance.

+     *

+     * @param request the request

+     * @param path    the path

+     * @return the mso response wrapper

+     * @throws Exception the exception

+     */

+    protected MsoResponseWrapper createInstance(RequestDetails request, String path) throws Exception {

+        String methodName = "createInstance";

+        logger.debug(dateFormat.format(new Date()) + "<== " + methodName + " start");

+

+        try {

+            MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance();

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " calling Post, request = (" + request + ")");

+

+            RestObject<String> restObjStr = new RestObject<String>();

+            String str = new String();

+            restObjStr.set(str);

+            restController.<String>Post(str, request, "", path, restObjStr);

+            MsoResponseWrapper w = MsoUtil.wrapResponse(restObjStr);

+

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

+            return w;

+        } catch (Exception e) {

+            logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+            throw e;

+        }

+    }

+

+    /**

+     * Delete svc instance.

+     *

+     * @param serviceInstanceId the service instance id

+     * @param request           the request

+     * @return the response entity

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_delete_svc_instance/{serviceInstanceId}", method = RequestMethod.POST)

+    public ResponseEntity<String> deleteSvcInstance(@PathVariable("serviceInstanceId") String serviceInstanceId,

+                                                    HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+

+        String methodName = "deleteSvcInstance";

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+

+        //RequestDetails mso_request = retrieveRequestObject (request);

+        String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);

+        String path = p + "/" + serviceInstanceId;

+        MsoResponseWrapper w = deleteInstance(mso_request, path);

+

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

+        // always return OK, the MSO status code is embedded in the body

+

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+

+    }

+

+    /**

+     * Delete vnf.

+     *

+     * @param serviceInstanceId the service instance id

+     * @param vnfInstanceId     the vnf instance id

+     * @param request           the request

+     * @return the response entity

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_delete_vnf_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}", method = RequestMethod.POST)

+

+    public ResponseEntity<String> deleteVnf(@PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId,

+                                            HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+        String methodName = "deleteVnf";

+

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+        if (!userIsPermmited(request, mso_request)) {

+            return new ResponseEntity<String>(HttpStatus.FORBIDDEN);

+        }

+        //RequestDetails mso_request = retrieveRequestObject (request);

+        String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE);

+        if (p == null || p.isEmpty()) {

+            throw new Exception("Vnf instance path is not defined");

+        }

+        // /serviceInstances/v2/<service_instance_id>/vnfs/

+        String vnf_path = p.replaceFirst(SVC_INSTANCE_ID, vnfInstanceId);

+        MsoResponseWrapper w = deleteInstance(mso_request, vnf_path + "/" + vnfInstanceId);

+

+        // always return OK, the MSO status code is embedded in the body

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+

+    }

+

+    /**

+     * Delete vf module.

+     *

+     * @param serviceInstanceId the service instance id

+     * @param vnfInstanceId     the vnf instance id

+     * @param vfModuleId        the vf module id

+     * @param request           the request

+     * @return the response entity

+     * @throws Exception the exception

+     */

+    //mso_delete_vf_module/bc305d54-75b4-431b-adb2-eb6b9e546014/vnfs/fe9000-0009-9999/vfmodules/abeeee-abeeee-abeeee

+    @RequestMapping(value = "/mso_delete_vfmodule_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfModuleId}", method = RequestMethod.POST)

+    public ResponseEntity<String> deleteVfModule(

+            @PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId,

+            @PathVariable("vfModuleId") String vfModuleId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+

+        String methodName = "deleteVfModule";

+

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+        if (!userIsPermmited(request, mso_request)) {

+            return new ResponseEntity<String>(HttpStatus.FORBIDDEN);

+        }

+        //RequestDetails mso_request = new RequestDetails();

+        //mso_request = retrieveRequestObject (request);

+        String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);

+        if (p == null || p.isEmpty()) {

+            throw new Exception("VF Module instance path is not defined");

+        }

+        // /serviceInstances/v2/<serviceInstanceId>/vnfs/<vnfInstanceId>/vfmodules

+        String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);

+        path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);

+        MsoResponseWrapper w = deleteInstance(mso_request, path + "/" + vfModuleId);

+

+        // always return OK, the MSO status code is embedded in the body

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+

+    }

+

+    /**

+     * Delete volume group instance.

+     *

+     * @param serviceInstanceId the service instance id

+     * @param vnfInstanceId     the vnf instance id

+     * @param volumeGroupId     the volume group id

+     * @param request           the request

+     * @return the response entity

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_delete_volumegroup_instance/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupId}", method = RequestMethod.POST)

+    public ResponseEntity<String> deleteVolumeGroupInstance(

+            @PathVariable("serviceInstanceId") String serviceInstanceId, @PathVariable("vnfInstanceId") String vnfInstanceId, @PathVariable("volumeGroupId") String volumeGroupId,

+            HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+

+        String methodName = "deleteVolumeGroupInstance";

+

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+        if (!userIsPermmited(request, mso_request)) {

+            return new ResponseEntity<String>(HttpStatus.FORBIDDEN);

+        }

+        String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);

+        if (p == null || p.isEmpty()) {

+            throw new Exception("Volume group instance path is not defined");

+        }

+        // /serviceInstances/v2/{serviceInstanceId}/volumeGroups

+        String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);

+        path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);

+        MsoResponseWrapper w = deleteInstance(mso_request, path + "/" + volumeGroupId);

+

+        // always return OK, the MSO status code is embedded in the body

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+    }

+

+    /**

+     * Delete nw instance.

+     *

+     * @param serviceInstanceId the service instance id

+     * @param networkInstanceId the network instance id

+     * @param request           the request

+     * @return the response entity

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_delete_nw_instance/{serviceInstanceId}/networks/{networkInstanceId}", method = RequestMethod.POST)

+    public ResponseEntity<String> deleteNwInstance(@PathVariable("serviceInstanceId") String serviceInstanceId,

+                                                   @PathVariable("networkInstanceId") String networkInstanceId, HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+

+        String methodName = "deleteNwInstance";

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+

+        //RequestDetails mso_request = retrieveRequestObject (request);

+        if (!userIsPermmited(request, mso_request)) {

+            return new ResponseEntity<String>(HttpStatus.FORBIDDEN);

+        }

+        String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);

+        if (p == null || p.isEmpty()) {

+            throw new Exception("Network instance path is not defined");

+        }

+        // /serviceInstances/v2/<service_instance_id>/networks

+        String path = p.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);

+        MsoResponseWrapper w = deleteInstance(mso_request, path + "/" + networkInstanceId);

+

+        // always return OK, the MSO status code is embedded in the body

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+

+    }

+

+    /**

+     * Delete instance.

+     *

+     * @param request the request

+     * @param path    the path

+     * @return the mso response wrapper

+     * @throws Exception the exception

+     */

+    protected MsoResponseWrapper deleteInstance(RequestDetails request, String path) throws Exception {

+        String methodName = "deleteInstance";

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+

+        try {

+            MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance();

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " calling Delete, path =[" + path + "]");

+

+            RestObject<String> restObjStr = new RestObject<String>();

+            String str = new String();

+            restObjStr.set(str);

+            restController.<String>Delete(str, request, "", path, restObjStr);

+            MsoResponseWrapper w = MsoUtil.wrapResponse(restObjStr);

+

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

+            return w;

+

+        } catch (Exception e) {

+            logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+            throw e;

+        }

+

+    }

+

+    /**

+     * Gets the orchestration request.

+     *

+     * @param requestId the request id

+     * @param request   the request

+     * @return the orchestration request

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_get_orch_req/{requestId}", method = RequestMethod.GET)

+    public ResponseEntity<String> getOrchestrationRequest(@PathVariable("requestId") String requestId,

+                                                          HttpServletRequest request) throws Exception {

+

+        String methodName = "getOrchestrationRequest";

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+        MsoResponseWrapper w = null;

+        try {

+            MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance();

+            String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQ);

+            String path = p + "/" + requestId;

+

+            RestObject<String> restObjStr = new RestObject<String>();

+            String str = new String();

+            restObjStr.set(str);

+

+            restController.<String>Get(str, "", path, restObjStr);

+

+            w = MsoUtil.wrapResponse(restObjStr);

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

+            // always return OK, the MSO status code is embedded in the body

+

+        } catch (Exception e) {

+            logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+            throw e;

+        }

+        // always return OK, the MSO status code is embedded in the body

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+    }

+

+

+    /**

+     * Gets the orchestration requests.

+     *

+     * @param filterString the filter string

+     * @param request      the request

+     * @return the orchestration requests

+     * @throws Exception the exception

+     */

+    @RequestMapping(value = "/mso_get_orch_reqs/{filterString}", method = RequestMethod.GET)

+    public ResponseEntity<String> getOrchestrationRequests(@PathVariable("filterString") String filterString,

+                                                           HttpServletRequest request) throws Exception {

+

+        String methodName = "getOrchestrationRequests";

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+        MsoResponseWrapper w = null;

+        try {

+            MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance();

+            String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);

+            String path = p + filterString;

+

+            RestObject<String> restObjStr = new RestObject<String>();

+            String str = new String();

+            restObjStr.set(str);

+

+            restController.<String>Get(str, "", path, restObjStr);

+

+            w = MsoUtil.wrapResponse(restObjStr);

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

+        } catch (Exception e) {

+            logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+            throw e;

+        }

+        // always return OK, the MSO status code is embedded in the body

+        return (new ResponseEntity<String>(w.getResponse(), HttpStatus.OK));

+    }

+

+    /**

+     * Gets the orchestration requests for svc instance.

+     *

+     * @param svc_instance_id the svc instance id

+     * @return the orchestration requests for svc instance

+     * @throws Exception the exception

+     */

+    public MsoResponseWrapper getOrchestrationRequestsForSvcInstance(String svc_instance_id) throws Exception {

+

+        String methodName = "getOrchestrationRequestsForSvcInstance";

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+        MsoResponseWrapper w = null;

+

+        try {

+            MsoRestInterfaceIfc restController = MsoRestInterfaceFactory.getInstance();

+            String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);

+            String path = p + svc_instance_id;

+

+            RestObject<String> restObjStr = new RestObject<String>();

+            String str = new String();

+            restObjStr.set(str);

+

+            restController.<String>Get(str, "", path, restObjStr);

+            w = MsoUtil.wrapResponse(restObjStr);

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());

+

+        } catch (Exception e) {

+            logger.info(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+            throw e;

+        }

+        return w;

+    }

+

+    /**

+     * Exception handler.

+     *

+     * @param e        the e

+     * @param response the response

+     * @throws IOException Signals that an I/O exception has occurred.

+     */

+    @ExceptionHandler(Exception.class)

+    private void exceptionHandler(Exception e, HttpServletResponse response) throws IOException {

 

 		/*

 		 * The following "logger.error" lines "should" be sufficient for logging the exception.

@@ -633,129 +641,126 @@
 		 * logger statements in this class. Thus the temporary "e.printStackTrace" statement

 		 * is also included.

 		 */

-		

-		String methodName = "exceptionHandler";	

-		logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + e.toString());

-		StringWriter sw = new StringWriter();

-				e.printStackTrace(new PrintWriter(sw));

-		logger.error(EELFLoggerDelegate.errorLogger, sw.toString());

+

+        String methodName = "exceptionHandler";

+        logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());

+        StringWriter sw = new StringWriter();

+        e.printStackTrace(new PrintWriter(sw));

+        logger.error(EELFLoggerDelegate.errorLogger, sw.toString());

 

 		/*

 		 *  Temporary - IF the above  mentioned "logger.error" glitch is resolved ...

 		 *  this statement could be removed since it would then likely result in duplicate

 		 *  trace output. 

 		 */

-		e.printStackTrace(System.err);

+        e.printStackTrace(System.err);

 

-		response.setContentType("application/json; charset=UTF-8");

-		response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

+        response.setContentType("application/json; charset=UTF-8");

+        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

 

-		ExceptionResponse exceptionResponse = new ExceptionResponse();

-		exceptionResponse.setException(e.getClass().toString().replaceFirst("^.*\\.", ""));

-		exceptionResponse.setMessage(e.getMessage());

+        ExceptionResponse exceptionResponse = new ExceptionResponse();

+        exceptionResponse.setException(e.getClass().toString().replaceFirst("^.*\\.", ""));

+        exceptionResponse.setMessage(e.getMessage());

 

-		response.getWriter().write(new ObjectMapper().writeValueAsString(exceptionResponse));

+        response.getWriter().write(new ObjectMapper().writeValueAsString(exceptionResponse));

 

-		response.flushBuffer();

+        response.flushBuffer();

 

-	}

+    }

 

-	/**

-	 * Parses the orchestration requests for svc instance.

-	 *

-	 * @param resp the resp

-	 * @return the list

-	 * @throws ParseException the parse exception

-	 * @throws Exception the exception

-	 */

-	@SuppressWarnings("unchecked")

-	public List<JSONObject> parseOrchestrationRequestsForSvcInstance ( ClientResponse resp ) throws org.json.simple.parser.ParseException, Exception {

-		

-		String methodName = "parseOrchestrationRequestsForSvcInstance";

-		

-		ArrayList<JSONObject> json_list = new ArrayList<JSONObject>();

-		

-		String rlist_str = resp.readEntity (String.class);

-		logger.debug (EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + " Response string: " + rlist_str);

-		

-		JSONParser parser = new JSONParser();

-		try {

-			Object obj = parser.parse(rlist_str);

-			

-			JSONObject jsonObject = (JSONObject) obj;

-		

-			JSONArray requestList = (JSONArray) jsonObject.get("requestList");

-			

-			if ( requestList != null && ! (requestList.isEmpty()) )

-				for ( Object container : requestList) {

-			

-					JSONObject containerJsonObj = (JSONObject) container;

-					//logger.debug(dateFormat.format(new Date()) +  "<== " + "." + methodName + " reqJsonObj: " + containerJsonObj.toJSONString());

-					JSONObject reqJsonObj = (JSONObject) containerJsonObj.get("request");

-					

-					//logger.debug(dateFormat.format(new Date()) +  "<== " + "." + methodName + " reqJsonObj.requestId: " + 

-						//	reqJsonObj.get("requestId") );

-					JSONObject result = new JSONObject();

-					

-					result.put("requestId", reqJsonObj.get ("requestId"));

-					if ( reqJsonObj.get("requestType") != null ) {

-						result.put("requestType", (reqJsonObj.get("requestType").toString()));

-					}

-					JSONObject req_status = (JSONObject)reqJsonObj.get("requestStatus");

-					if ( req_status != null ) {

-						result.put("timestamp", (req_status.get("timestamp")));

-						result.put("requestState", (req_status.get("requestState")));

-						result.put("statusMessage", (req_status.get("statusMessage")));

-						result.put("percentProgress", (req_status.get("percentProgress")));

-					} 

-					json_list.add (result);

-				}

-		} catch (org.json.simple.parser.ParseException pe) {

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + " Parse exception: " + pe.toString());

-			throw pe;

-		} catch (Exception e) {

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) +  "<== " + "." + methodName + " Exception: " + e.toString());

-			throw e;

-		}

-		return ( json_list );

-	} 

-	

-	/**

-	 * Retrieve request object.

-	 *

-	 * @param request the request

-	 * @return the request details

-	 * @throws Exception the exception

-	 */

-	public RequestDetails retrieveRequestObject ( HttpServletRequest request, @RequestBody RequestDetails mso_request ) throws Exception {

-			

-		String methodName = "retrieveRequestObject";

-		logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start" );

-		

-		ObjectMapper mapper = new ObjectMapper();

-		//JSON from String to Object

-		//RequestDetails mso_request;

-		

-		try {

-			//mso_request = new RequestDetails();

-			//mso_request = mapper.readValue(request.getInputStream(), RequestDetails.class);

-		}

-		catch ( Exception e ) {

-			logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " Unable to read json object RequestDetails e=" + e.getMessage());

-			throw e;

-		}

-		if ( mso_request == null) {

-			logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " mso_request is null");

-			throw new Exception ("RequestDetails is missing");

-		}

-		try {

-			String json_req = mapper.writeValueAsString(mso_request);

-			logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " request=[" + json_req + "]");

-		}

-		catch ( Exception e ) {

-			logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " Unable to convert RequestDetails to json string e=" + e.getMessage());

-			throw e;

-		}

-		return (mso_request);

-	}

+    /**

+     * Parses the orchestration requests for svc instance.

+     *

+     * @param resp the resp

+     * @return the list

+     * @throws Exception the exception

+     */

+    @SuppressWarnings("unchecked")

+    public List<JSONObject> parseOrchestrationRequestsForSvcInstance(ClientResponse resp) throws org.json.simple.parser.ParseException, Exception {

+

+        String methodName = "parseOrchestrationRequestsForSvcInstance";

+

+        ArrayList<JSONObject> json_list = new ArrayList<JSONObject>();

+

+        String rlist_str = resp.readEntity(String.class);

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + " Response string: " + rlist_str);

+

+        JSONParser parser = new JSONParser();

+        try {

+            Object obj = parser.parse(rlist_str);

+

+            JSONObject jsonObject = (JSONObject) obj;

+

+            JSONArray requestList = (JSONArray) jsonObject.get("requestList");

+

+            if (requestList != null && !(requestList.isEmpty()))

+                for (Object container : requestList) {

+

+                    JSONObject containerJsonObj = (JSONObject) container;

+                    //logger.debug(dateFormat.format(new Date()) +  "<== " + "." + methodName + " reqJsonObj: " + containerJsonObj.toJSONString());

+                    JSONObject reqJsonObj = (JSONObject) containerJsonObj.get("request");

+

+                    //logger.debug(dateFormat.format(new Date()) +  "<== " + "." + methodName + " reqJsonObj.requestId: " +

+                    //	reqJsonObj.get("requestId") );

+                    JSONObject result = new JSONObject();

+

+                    result.put("requestId", reqJsonObj.get("requestId"));

+                    if (reqJsonObj.get("requestType") != null) {

+                        result.put("requestType", (reqJsonObj.get("requestType").toString()));

+                    }

+                    JSONObject req_status = (JSONObject) reqJsonObj.get("requestStatus");

+                    if (req_status != null) {

+                        result.put("timestamp", (req_status.get("timestamp")));

+                        result.put("requestState", (req_status.get("requestState")));

+                        result.put("statusMessage", (req_status.get("statusMessage")));

+                        result.put("percentProgress", (req_status.get("percentProgress")));

+                    }

+                    json_list.add(result);

+                }

+        } catch (org.json.simple.parser.ParseException pe) {

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + " Parse exception: " + pe.toString());

+            throw pe;

+        } catch (Exception e) {

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + " Exception: " + e.toString());

+            throw e;

+        }

+        return (json_list);

+    }

+

+    /**

+     * Retrieve request object.

+     *

+     * @param request the request

+     * @return the request details

+     * @throws Exception the exception

+     */

+    public RequestDetails retrieveRequestObject(HttpServletRequest request, @RequestBody RequestDetails mso_request) throws Exception {

+

+        String methodName = "retrieveRequestObject";

+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");

+

+        ObjectMapper mapper = new ObjectMapper();

+        //JSON from String to Object

+        //RequestDetails mso_request;

+

+        try {

+            //mso_request = new RequestDetails();

+            //mso_request = mapper.readValue(request.getInputStream(), RequestDetails.class);

+        } catch (Exception e) {

+            logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " Unable to read json object RequestDetails e=" + e.getMessage());

+            throw e;

+        }

+        if (mso_request == null) {

+            logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " mso_request is null");

+            throw new Exception("RequestDetails is missing");

+        }

+        try {

+            String json_req = mapper.writeValueAsString(mso_request);

+            logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " request=[" + json_req + "]");

+        } catch (Exception e) {

+            logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + methodName + " Unable to convert RequestDetails to json string e=" + e.getMessage());

+            throw e;

+        }

+        return (mso_request);

+    }

 }

diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/VidController.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/VidController.java
index 9972ae5..838793a 100755
--- a/vid-app-common/src/main/java/org/openecomp/vid/controller/VidController.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/VidController.java
@@ -24,18 +24,22 @@
 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;

 import org.openecomp.sdc.tosca.parser.exceptions.SdcToscaParserException;

 import org.openecomp.vid.asdc.AsdcCatalogException;

+import org.openecomp.vid.asdc.beans.SecureServices;

 import org.openecomp.vid.exceptions.VidServiceUnavailableException;

 import org.openecomp.vid.model.ServiceModel;

+import org.openecomp.vid.roles.Role;

+import org.openecomp.vid.roles.RoleProvider;

+import org.openecomp.vid.roles.RoleValidator;

+import org.openecomp.vid.services.VidService;

 import org.springframework.beans.factory.annotation.Autowired;

 import org.springframework.web.bind.annotation.PathVariable;

 import org.springframework.web.bind.annotation.RequestMapping;

 import org.springframework.web.bind.annotation.RequestMethod;

 import org.springframework.web.bind.annotation.RestController;

 import org.springframework.web.servlet.ModelAndView;

-import org.openecomp.vid.services.*;

 

 import javax.servlet.http.HttpServletRequest;

-import java.util.Collection;

+import java.util.List;

 import java.util.Map;

 

 //import org.openecomp.vid.model.Service;

@@ -61,10 +65,15 @@
 	 * @throws VidServiceUnavailableException the vid service unavailable exception

 	 */

 	@RequestMapping(value={"/rest/models/services"}, method = RequestMethod.GET)

-	public Collection<org.openecomp.vid.asdc.beans.Service> getServices(HttpServletRequest request) throws VidServiceUnavailableException {

+	public SecureServices getServices(HttpServletRequest request) throws VidServiceUnavailableException {

 		try {

+			SecureServices secureServices = new SecureServices();

+			RoleProvider roleProvider = new RoleProvider();

 			Map<String, String[]> requestParams = request.getParameterMap();

-			return service.getServices(requestParams);

+			List<Role> roles = new RoleProvider().getUserRoles(request);

+			secureServices.setServices(service.getServices(requestParams));

+			secureServices.setReadOnly(roleProvider.userPermissionIsReadOnly(roles));

+			return secureServices;

 		} catch (AsdcCatalogException e) {

 			LOG.error("Failed to retrieve service definitions from SDC", e);

 			throw new VidServiceUnavailableException("Failed to retrieve service definitions from SDC", e);

@@ -83,8 +92,9 @@
 	 * @throws VidServiceUnavailableException the vid service unavailable exception

 	 */

 	@RequestMapping(value={"/rest/models/services/{uuid}"}, method = RequestMethod.GET)

-	public ServiceModel getServices(@PathVariable("uuid") String uuid) throws VidServiceUnavailableException {

+	public ServiceModel getServices(@PathVariable("uuid") String uuid, HttpServletRequest request) throws VidServiceUnavailableException {

 		try {

+//			RoleValidator roleValidator = new RoleValidator(new RoleProvider().getUserRoles(request));

 			return service.getService(uuid);

 		} catch (AsdcCatalogException e) {

 			LOG.error("Failed to retrieve service definitions from SDC", e);

diff --git a/vid-app-common/src/main/java/org/openecomp/vid/controller/WebConfig.java b/vid-app-common/src/main/java/org/openecomp/vid/controller/WebConfig.java
index 9a258a1..1e13d0e 100644
--- a/vid-app-common/src/main/java/org/openecomp/vid/controller/WebConfig.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/controller/WebConfig.java
@@ -4,13 +4,17 @@
 import org.apache.commons.io.IOUtils;
 import org.json.JSONObject;
 import org.json.JSONTokener;
+import org.openecomp.vid.aai.AaiClient;
+import org.openecomp.vid.aai.AaiClientInterface;
 import org.openecomp.vid.asdc.AsdcClient;
 import org.openecomp.vid.asdc.local.LocalAsdcClient;
 import org.openecomp.vid.asdc.memory.InMemoryAsdcClient;
-import org.openecomp.vid.asdc.rest.RestfulAsdcClient;
 import org.openecomp.vid.asdc.parser.ToscaParserImpl2;
+import org.openecomp.vid.asdc.rest.RestfulAsdcClient;
 import org.openecomp.vid.properties.AsdcClientConfiguration;
 import org.openecomp.vid.properties.AsdcClientConfiguration.AsdcClientType;
+import org.openecomp.vid.services.AaiService;
+import org.openecomp.vid.services.AaiServiceImpl;
 import org.openecomp.vid.services.VidService;
 import org.openecomp.vid.services.VidServiceImpl;
 import org.springframework.context.annotation.Bean;
@@ -40,12 +44,24 @@
         return new ObjectMapper();
     }
 
+
+
     @Bean
     public VidService vidService(AsdcClient asdcClient) {
         return new VidServiceImpl(asdcClient);
     }
 
     @Bean
+    public AaiService getAaiService(){
+        return new AaiServiceImpl();
+    }
+
+    @Bean
+    public AaiClientInterface getAaiClientInterface(){
+        return new AaiClient();
+    }
+
+    @Bean
     public AsdcClient asdcClient(AsdcClientConfiguration asdcClientConfig) throws IOException {
         switch (asdcClientConfig.getAsdcClientType()) {
             case IN_MEMORY:
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/ModelUtil.java b/vid-app-common/src/main/java/org/openecomp/vid/model/ModelUtil.java
new file mode 100644
index 0000000..f020818
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/model/ModelUtil.java
@@ -0,0 +1,45 @@
+/**
+ * 
+ */
+package org.openecomp.vid.model;
+
+/**
+ * The Class ModelUtil.
+ *
+ */
+public class ModelUtil {
+	/**
+	 * Gets the tags for the given element according to the configured namespace
+	 * @param namespaces the namespace list from the configuration
+	 * @param constantValue the constant portion of the tag name, i.e. resource.vf...
+	 * @return the tags
+	 */
+	public static String[] getTags ( String[] namespaces, String constantValue ) {
+		String[] tags;
+		if ( namespaces == null || namespaces.length == 0 ) {
+			return null;
+		}
+		int le = namespaces.length;
+		tags = new String[le];
+		for ( int i = 0; i < le; i++ ) {
+			tags[i] = namespaces[i] + constantValue;
+		}
+		return (tags);
+	}
+	/**
+	 * Determine if a note template type matches a set of configurable tags
+	 * @param type the node template type
+	 * @param tags the model configurable namespaces
+	 * @return true if type starts with a tag in the array, false otherwise
+	 */
+	public static boolean isType ( String type, String[] tags ) {
+		if ( (tags != null) && (tags.length > 0) ) {
+			for ( int i = 0; i < tags.length; i++ ) {
+				if ( type.startsWith (tags[i]) ) {
+					return (true);
+				}
+			}
+		}
+		return (false);
+	}
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/ProxyResponse.java b/vid-app-common/src/main/java/org/openecomp/vid/model/ProxyResponse.java
new file mode 100644
index 0000000..132c54a
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/model/ProxyResponse.java
@@ -0,0 +1,21 @@
+package org.openecomp.vid.model;
+
+/**
+ * Created by Oren on 7/10/17.
+ */
+public class ProxyResponse {
+
+    protected String errorMessage;
+
+    protected int httpCode;
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+
+    public int getHttpCode() {
+        return httpCode;
+    }
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/Service.java b/vid-app-common/src/main/java/org/openecomp/vid/model/Service.java
index f3c6e4d..c6269b9 100755
--- a/vid-app-common/src/main/java/org/openecomp/vid/model/Service.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/model/Service.java
@@ -48,6 +48,12 @@
 	

 	/** The category. */

 	private String category;

+

+	/** The Service Type. */

+	private String serviceType;

+

+	/** The Service Role */

+	private String serviceRole;

 	

 	/** The description. */

 	private String description;

@@ -238,6 +244,23 @@
 		

 		return (service.getUuid().equals(getUuid()));

 	}

+

+	public String getServiceType() {

+		return serviceType;

+	}

+

+	public void setServiceType(String serviceType) {

+		this.serviceType = serviceType;

+	}

+

+	public String getServiceRole() {

+		return serviceRole;

+	}

+

+	public void setServiceRole(String serviceRole) {

+		this.serviceRole = serviceRole;

+	}

+

 	/*public static void extractVfModuleCustomizationUUID (Service s, String vnfCustomizationName, VfModule vfMod ) {

 		

 		//Look for vnfCustomizationName..vfModuleCustomizationName

diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/Subscriber.java b/vid-app-common/src/main/java/org/openecomp/vid/model/Subscriber.java
new file mode 100644
index 0000000..c5db6fd
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/model/Subscriber.java
@@ -0,0 +1,26 @@
+package org.openecomp.vid.model;
+
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * Created by Oren on 7/4/17.
+ */
+public class Subscriber {
+
+    @JsonProperty("global-customer-id")
+    public String globalCustomerId;
+
+    @JsonProperty("subscriber-name")
+    public String subscriberName;
+
+    @JsonProperty("subscriber-type")
+    public String subscriberType;
+
+    @JsonProperty("resource-version")
+    public String resourceVersion;
+
+
+
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/model/SubscriberList.java b/vid-app-common/src/main/java/org/openecomp/vid/model/SubscriberList.java
new file mode 100644
index 0000000..7f593e4
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/model/SubscriberList.java
@@ -0,0 +1,15 @@
+package org.openecomp.vid.model;
+
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+
+import java.util.List;
+
+/**
+ * Created by Oren on 7/4/17.
+ */
+public class SubscriberList {
+
+    public List<Subscriber> customer;
+
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/roles/EcompRole.java b/vid-app-common/src/main/java/org/openecomp/vid/roles/EcompRole.java
new file mode 100644
index 0000000..5242f5a
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/roles/EcompRole.java
@@ -0,0 +1,5 @@
+package org.openecomp.vid.roles;
+
+public enum EcompRole {
+	READ;
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/roles/Role.java b/vid-app-common/src/main/java/org/openecomp/vid/roles/Role.java
new file mode 100644
index 0000000..d4ded53
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/roles/Role.java
@@ -0,0 +1,48 @@
+package org.openecomp.vid.roles;
+
+
+/**
+ * Created by Oren on 7/1/17.
+ */
+public class Role {
+
+    private EcompRole ecompRole;
+
+    private String subscribeName;
+
+    private String serviceType;
+
+    private String tenant;
+
+    public Role(EcompRole ecompRole, String serviceName, String serviceType, String tenant) {
+        this.ecompRole = ecompRole;
+        this.subscribeName = serviceName;
+        this.serviceType = serviceType;
+        this.tenant = tenant;
+    }
+
+    public EcompRole getEcompRole() {
+        return ecompRole;
+    }
+
+
+    public String getSubscribeName() {
+        return subscribeName;
+    }
+
+    public void setSubscribeName(String subscribeName) {
+        this.subscribeName = subscribeName;
+    }
+
+    public String getServiceType() {
+        return serviceType;
+    }
+
+
+    public String getTenant() {
+        return tenant;
+    }
+
+
+
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/roles/RoleProvider.java b/vid-app-common/src/main/java/org/openecomp/vid/roles/RoleProvider.java
new file mode 100644
index 0000000..99645a1
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/roles/RoleProvider.java
@@ -0,0 +1,62 @@
+package org.openecomp.vid.roles;
+
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by Oren on 7/1/17.
+ */
+public class RoleProvider {
+
+    private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(RoleProvider.class);
+    final String readPermissionString = "read";
+
+    public static List<String> extractRoleFromSession(HttpServletRequest request) {
+
+        return new ArrayList<String>();
+
+    }
+
+    public List<Role> getUserRoles(HttpServletRequest request) {
+        List<Role> roleList = new ArrayList<>();
+        HashMap roles = UserUtils.getRoles(request);
+        for (Object role : roles.keySet()) {
+            org.openecomp.portalsdk.core.domain.Role sdkRol = (org.openecomp.portalsdk.core.domain.Role) roles.get(role);
+            try {
+                if (sdkRol.getName().contains(readPermissionString))
+                    continue;
+                String[] roleParts = splitRole((sdkRol.getName()));
+                roleList.add(createRoleFromStringArr(roleParts));
+            } catch (Exception e) {
+                LOG.error("Failed to parse permission", e);
+
+            }
+        }
+
+        return roleList;
+    }
+
+    public String[] splitRole(String roleAsString) {
+        return roleAsString.split("_");
+    }
+
+    public boolean userPermissionIsReadOnly(List<Role> roles) {
+
+        return (!(roles.size() > 0));
+    }
+
+    public Role createRoleFromStringArr(String[] roleParts) {
+        if (roleParts.length > 2) {
+            return new Role(EcompRole.READ, roleParts[0], roleParts[1], roleParts[2]);
+        } else {
+            return new Role(EcompRole.READ, roleParts[0], roleParts[1], null);
+        }
+    }
+
+}
+
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/roles/RoleValidator.java b/vid-app-common/src/main/java/org/openecomp/vid/roles/RoleValidator.java
new file mode 100644
index 0000000..e26c523
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/roles/RoleValidator.java
@@ -0,0 +1,57 @@
+package org.openecomp.vid.roles;
+
+import org.openecomp.vid.mso.rest.RequestDetails;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by Oren on 7/12/17.
+ */
+public class RoleValidator {
+
+    private List<Role> userRoles;
+
+    public RoleValidator(List<Role> roles) {
+        this.userRoles = roles;
+    }
+
+    public boolean isSubscriberPermitted(String subscriberName) {
+        for (Role role : userRoles) {
+            if (role.getSubscribeName().equals(subscriberName))
+                return true;
+        }
+        return false;
+    }
+
+    public boolean isServicePermitted(String subscriberName, String serviceType) {
+        for (Role role : userRoles) {
+            if (role.getSubscribeName().equals(subscriberName) && role.getServiceType().equals(serviceType))
+                return true;
+        }
+        return false;
+    }
+
+    public boolean isMsoRequestValid(RequestDetails mso_request) {
+        try {
+            String globalSubscriberIdRequested = (String) ((Map) ((Map) mso_request.getAdditionalProperties().get("requestDetails")).get("subscriberInfo")).get("globalSubscriberId");
+            String serviceType = (String) ((Map) ((Map) mso_request.getAdditionalProperties().get("requestDetails")).get("requestParameters")).get("subscriptionServiceType");
+            return isServicePermitted(globalSubscriberIdRequested, serviceType);
+        } catch (Exception e) {
+            //Until we'll get the exact information regarding the tenants and the global customer id, we'll return true on unknown requests to mso
+            return true;
+        }
+//        return false;
+    }
+
+    public boolean isTenantPermitted(String globalCustomerId, String serviceType, String tenant) {
+        for (Role role : userRoles) {
+            if (role.getSubscribeName().equals(globalCustomerId)
+                    && role.getServiceType().equals(serviceType)
+                    && (role.getTenant() == null || role.getTenant().equals(tenant))) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/services/AaiService.java b/vid-app-common/src/main/java/org/openecomp/vid/services/AaiService.java
new file mode 100644
index 0000000..274419f
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/services/AaiService.java
@@ -0,0 +1,25 @@
+package org.openecomp.vid.services;
+
+import org.openecomp.vid.aai.AaiResponse;
+import org.openecomp.vid.aai.SubscriberFilteredResults;
+import org.openecomp.vid.aai.model.AaiGetTenatns.GetTenantsResponse;
+import org.openecomp.vid.roles.RoleValidator;
+
+import java.util.List;
+
+/**
+ * Created by Oren on 7/4/17.
+ */
+public interface AaiService {
+
+
+    SubscriberFilteredResults getFullSubscriberList(RoleValidator roleValidator);
+
+    AaiResponse getSubscriberData(String subscriberId, RoleValidator roleValidator);
+
+    AaiResponse getServices(RoleValidator roleValidator);
+    
+    AaiResponse getAaiZones();
+
+    AaiResponse<GetTenantsResponse[]> getTenants(String globalCustomerId, String serviceType, RoleValidator roleValidator);
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/services/AaiServiceImpl.java b/vid-app-common/src/main/java/org/openecomp/vid/services/AaiServiceImpl.java
new file mode 100644
index 0000000..38b670f
--- /dev/null
+++ b/vid-app-common/src/main/java/org/openecomp/vid/services/AaiServiceImpl.java
@@ -0,0 +1,70 @@
+package org.openecomp.vid.services;
+
+import org.ecomp.aai.model.AaiAICZones.AicZones;
+import org.openecomp.vid.aai.*;
+import org.openecomp.vid.aai.model.AaiGetServicesRequestModel.*;
+import org.openecomp.vid.aai.model.AaiGetTenatns.GetTenantsResponse;
+import org.openecomp.vid.model.*;
+import org.openecomp.vid.roles.RoleValidator;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+/**
+ * Created by Oren on 7/4/17.
+ */
+public class AaiServiceImpl implements AaiService {
+
+
+    @Autowired
+    private AaiClientInterface aaiClient;
+
+
+    @Override
+    public SubscriberFilteredResults getFullSubscriberList(RoleValidator roleValidator) {
+        AaiResponse<SubscriberList> subscriberResponse = aaiClient.getAllSubscribers();
+        SubscriberFilteredResults subscriberFilteredResults =
+                new SubscriberFilteredResults(roleValidator,subscriberResponse.getT(),
+                        subscriberResponse.getErrorMessage(),
+                        subscriberResponse.getHttpCode());
+
+        return subscriberFilteredResults;
+    }
+
+    @Override
+    public AaiResponse getSubscriberData(String subscriberId, RoleValidator roleProvider) {
+        AaiResponse<Services> subscriberResponse = aaiClient.getSubscriberData(subscriberId);
+        String subscriberGlobalId = subscriberResponse.getT().globalCustomerId;
+        for (ServiceSubscription serviceSubscription : subscriberResponse.getT().serviceSubscriptions.serviceSubscription) {
+            String serviceType = serviceSubscription.serviceType;
+            serviceSubscription.isPermitted = roleProvider.isServicePermitted(subscriberGlobalId,serviceType);;
+        }
+        return subscriberResponse;
+
+    }
+
+    @Override
+    public AaiResponse getServices(RoleValidator roleValidator) {
+        AaiResponse<GetServicesAAIRespone> subscriberResponse = aaiClient.getServices();
+        for (org.openecomp.vid.aai.model.AaiGetServicesRequestModel.Service service :subscriberResponse.getT().service){
+            service.isPermitted = true;
+        }
+        return subscriberResponse;
+    }
+
+    @Override
+    public AaiResponse<GetTenantsResponse[]> getTenants(String globalCustomerId, String serviceType, RoleValidator roleValidator) {
+        AaiResponse<GetTenantsResponse[]> aaiGetTenantsResponse = aaiClient.getTenants(globalCustomerId,serviceType);
+        GetTenantsResponse[] tenants = aaiGetTenantsResponse.getT();
+        for (int i=0;i<tenants.length;i++){
+            tenants[i].isPermitted = roleValidator.isTenantPermitted(globalCustomerId,serviceType, tenants[i].tenantID);
+        }
+        return aaiGetTenantsResponse;
+    }
+
+	@Override
+	public AaiResponse getAaiZones() {
+		AaiResponse<AicZones> response = aaiClient.getAllAicZones();
+		return response;
+	}
+}
diff --git a/vid-app-common/src/main/java/org/openecomp/vid/services/VidServiceImpl.java b/vid-app-common/src/main/java/org/openecomp/vid/services/VidServiceImpl.java
index 9844842..f647af4 100644
--- a/vid-app-common/src/main/java/org/openecomp/vid/services/VidServiceImpl.java
+++ b/vid-app-common/src/main/java/org/openecomp/vid/services/VidServiceImpl.java
@@ -14,9 +14,7 @@
 import java.nio.file.Path;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.Collection;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 
 /**
  * The Class VidController.
diff --git a/vid-app-common/src/main/resources/csar3933948645405128424.zip b/vid-app-common/src/main/resources/csar3933948645405128424.zip
new file mode 100644
index 0000000..b92d533
--- /dev/null
+++ b/vid-app-common/src/main/resources/csar3933948645405128424.zip
Binary files differ
diff --git a/vid-app-common/src/main/resources/pnf.csar b/vid-app-common/src/main/resources/pnf.csar
new file mode 100644
index 0000000..eb42484
--- /dev/null
+++ b/vid-app-common/src/main/resources/pnf.csar
Binary files differ
diff --git a/vid-app-common/src/main/resources/roles.json b/vid-app-common/src/main/resources/roles.json
new file mode 100644
index 0000000..159be82
--- /dev/null
+++ b/vid-app-common/src/main/resources/roles.json
@@ -0,0 +1,8 @@
+{
+  "roles": [
+    "VID_Subscriber_serviceType1_Tenant1",
+    "VID_Subscriber_serviceType1_Tenant2",
+    "read_motorola_epost_tow",
+    "read_motorola_epost"
+  ]
+}
\ No newline at end of file
diff --git a/vid-app-common/src/main/resources/sdcservices.json b/vid-app-common/src/main/resources/sdcservices.json
index 9ef37c3..e80caa6 100644
--- a/vid-app-common/src/main/resources/sdcservices.json
+++ b/vid-app-common/src/main/resources/sdcservices.json
@@ -1,18 +1,7 @@
 {
   "services": [
     {
-      "uuid": "f430728a-4530-42be-a577-1206b9484cef",
-      "invariantUUID": "f430728a-4530-42be-a577-1206b9484cef",
-      "name": "1707vidnf",
-      "version": "1.0",
-      "toscaModelURL": "./service-vf-csar.zip",
-      "category": "Mobility",
-      "lifecycleState": "CERTIFIED",
-      "lastUpdaterUserId": "sa997j",
-      "distributionStatus": "DISTRIBUTED"
-    },
-    {
-      "uuid": "f430728a-4530-42be-a577-1206b9484cef",
+      "uuid": "48a52540-8772-4368-9cdb-1f124ea5c931",
       "invariantUUID": "f430728a-4530-42be-a577-1206b9484cef",
       "name": "4-27_vMME_Service",
       "version": "1.0",
@@ -24,6 +13,34 @@
       "distributionStatus": "DISTRIBUTED",
       "artifacts": null,
       "resources": null
+    },
+    {
+      "uuid": "cb49608f-5a24-4789-b0f7-2595473cb997",
+      "invariantUUID": "0311f998-9268-4fd6-bbba-afff15087b72",
+      "name": "4-27_vMME_Service",
+      "version": "1.0",
+      "toscaModelURL": "./service-vl-csar.zip",
+      "category": "Mobility",
+      "lifecycleState": "CERTIFIED",
+      "lastUpdaterUserId": "rg276b",
+      "lastUpdaterFullName": null,
+      "distributionStatus": "DISTRIBUTED",
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "73e1322a-8a9a-49dc-9558-b0c5c5770e4a",
+      "invariantUUID": "f430728a-4530-42be-a577-1206b9484cef",
+      "name": "4-27_vMME_Service",
+      "version": "1.0",
+      "toscaModelURL": "./pnf.csar",
+      "category": "Mobility",
+      "lifecycleState": "CERTIFIED",
+      "lastUpdaterUserId": "rg276b",
+      "lastUpdaterFullName": null,
+      "distributionStatus": "DISTRIBUTED",
+      "artifacts": null,
+      "resources": null
     }
   ]
 }
\ No newline at end of file
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 e7cbc48..f88ee9c 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
@@ -50,7 +50,8 @@
 	SDN_L3_BONDING : "SDN-L3-BONDING",
 	SDN_ETHERNET_INTERNET : "SDN-ETHERNET-INTERNET",
 	SERVICE : "service",
-	SERVICE_TYPE : "serviceType",
+    OLDVERSION : 'oldversion',
+    SERVICE_TYPE : "serviceType",
 	SHOW_COMPONENT_DETAILS : "showComponentDetails",
 	STATUS : "status",
 	SUBSCRIBER_NAME : "subscriberName",
@@ -65,9 +66,10 @@
 	VNF_ROLE : "vnfRole",
 	VNF_TYPE : "vnfType",
 	VOLUME_GROUP : "volumeGroup",
-	
-	
-	// IDs
+    IS_PERMITTED: "is-permitted",
+
+
+        // IDs
 	CIDR_MASK_1 : "255.255.255.000",
 	//COMPONENT_LIST_NAMED_QUERY_ID : "ed0a0f5b-cf79-4784-88b2-911cd726cd3d",
 	CUSTOMER_ID_1 : "icore9883749",
@@ -96,7 +98,8 @@
 	ASSIGN : "?r=",
 	AAI_GET_SERVICE_INSTANCE_PATH : "aai_get_service_instance/",
 	AAI_GET_SERVICES : "aai_get_services",
-	AAI_GET_SERVICES_BY_TYPE : "aai_get_models_by_service_type",
+    AAI_GET_AIC_ZONES :"aai_get_aic_zones",
+    AAI_GET_SERVICES_BY_TYPE : "aai_get_models_by_service_type",
 	AAI_GET_TENANTS : "aai_get_tenants/",
 	AAI_SUB_DETAILS_PATH : "aai_sub_details/",
 	AAI_SUB_VIEWEDIT_PATH : "aai_sub_viewedit",
@@ -128,8 +131,9 @@
 	SUBDETAILS_SELECTEDSUBSCRIBER : "#subdetails?selectedSubscriber=",
 	SUBSCRIBERNAME_SUB_PATH : "&subscriberName=",
 	WELCOME_PATH : "welcome.htm",
-	
-	//Template Urls
+    IS_PERMITTED_SUB_PATH: "&isPermitted=",
+
+    //Template Urls
 	AAI_GET_SUBS_URL : "app/vid/scripts/view-models/aaiGetSubs.htm",
 	AAI_GET_SUBSCRIBER_URL : "app/vid/scripts/view-models/aaiGetSubscriberList.htm",
 	AAI_SERVICE_TYPES_URL : "app/vid/scripts/view-models/aaiServiceTypes.htm",
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 03ec788..9d337fa 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
@@ -20,116 +20,122 @@
 

 "use strict";

 

-appDS2.factory("FIELD", [ "PARAMETER", function(PARAMETER) {

+appDS2.factory("FIELD", ["PARAMETER", function (PARAMETER) {

 

     /*

      * ID values are typically used internally.

      */

     var ID = {

-		AVAILABLE_VOLUME_GROUP : "availableVolumeGroup",

-		INSTANCE_NAME : "instanceName",

-		LCP_REGION : "lcpRegion",

-		LCP_REGION_TEXT : "lcpRegionText",

-		PRODUCT_FAMILY : "productFamily",

-		SERVICE_TYPE : "serviceType",

-		SUBSCRIBER_NAME : "subscriberName",

-		SUPPRESS_ROLLBACK : "suppressRollback",

-		TENANT : "tenant",

-		VNF_TARGETPROVSTATUS : "target",

-		

-		AAI_GET_FULL_SUBSCRIBERS : "aai_get_full_subscribers",

-		AAI_REFRESH_FULL_SUBSCRIBERS : "aai_refresh_full_subscribers",

-		AAI_GET_SERVICES : "aai_get_services",

-		AAI_GET_SUBSCRIBERS : "aai_get_subscribers",

-		AAI_GET_TENTANTS : "aai_get_tenants",

-		AAI_REFRESH_SUBSCRIBERS : "aai_refresh_subscribers",

-		AAI_SUB_DETAILS : "aai_sub_details",

-		AAI_SUB_VIEWEDIT : "aai_sub_viewedit",

-		ANGULAR_UI_TREE_COLLAPSEALL : "angular-ui-tree:collapse-all",

-		ANGULAR_UI_TREE_EXPANDALL : "angular-ui-tree:expand-all",

-		CATEGORY : "category",

-		COLOR_8F8 : "#8F8",

-		COLOR_F88 : "#F88",

-		COLOR_NONE : "none",

-		CUSTOMER : "customer",

-		CUSTOMIZATION_UUID : "customizationUuid",

-		DESCRIPTION : "description",

-		GENERIC_VNF : "generic-vnf",

-		GLOBAL_CUSTOMER_ID : "global-customer-id",

-		GLOBAL_CUST_ID : "globalCustomerId",

-		IN_MAINT : "in-maint",

-		INVENTORY_RESPONSE_ITEMS : "inventory-response-items",

-		INVENTORY_RESPONSE_ITEM : "inventory-response-item",

-		L3_NETWORK : "l3-network",

-		SUB_NET : "subnet",

-		SUBNET_NAME : "subnet-name",

-		SUBNET_ID : "subnet-id",

-		GATEWAY_ADDRESS : "gateway-address",

-		NETWORK_START_ADDRESS : "network-start-address",

-		CIDR_MASK : "cidr-mask",

-		MODEL_CUSTOMIZATION_ID : "model-customization-id",

-		MODEL_CUSTOMIZATION_NAME : "modelCustomizationName",

-		MODEL_INVARIANT_ID : "modelInvariantId",

-		MODEL_INVAR_ID : "model-invariant-id",

-		MODEL_NAME : "modelName",

-		MODEL_NAME_VERSION_ID : "modelNameVersionId",

-		MODEL_VERSION : "modelVersion",

-		MODEL_VERSION_ID : "model-version-id",

-		NETWORK_NAME : "network-name",

-		NETWORK_ID : "network-id",

-		NETWORK_TYPE : "network-type",

-		NETWORKS : "networks",

-		OPERATIONAL_STATUS : "operational-status",

-		ORCHESTRATION_STATUS : "orchestration-status",

-		PERCENT_PROGRESS : "precentProgress",

-		PERSONA_MODEL_ID : "persona-model-id",

-		PERSONA_MODEL_VERSION : "persona-model-version",

-		PERSONA_MODEL_CUSTOMIZATION_ID : "persona-model-customization-id",

-		PROV_STATUS : "prov-status",

-		REQUEST : "request",

-		REQUEST_ID : "requestId",

-		REQUEST_LIST : "requestList",

-		REQUEST_TYPE : "requestType",

-		REQUEST_REFERENCES : "requestReferences",

-		REQUEST_STATE : "requestState",

-		REQUEST_STATUS : "requestStatus",

-		RESOURCE_LINK : "resource-link",

-		RESULT_DATA : "result-data",

-		SERVICE_DESCRIPTION : "service-description",

-		SERVICE_ID : "service-id",

-		SERVICE_INSTANCE : "service-instance",

-		SERVICE_INSTANCES : "service-instances",

-		SERVICE_INSTANCE_ID : "service-instance-id",

-		SERVICE_INSTANCE_NAME : "service-instance-name",

-		SERVICE_SUBSCRIPTION : "service-subscription",

-		SERVICE_SUBSCRIPTIONS : "service-subscriptions",

-		SERVICETYPE : "service-type",

-		STATUS_MESSAGE : "statusMessage",

-		SUBNAME : "subscriber-name",

-		TIMESTAMP : "timestamp",

-		VF_MODULE : "vf-module",

-		VF_MODULES : "vfModules",

-		VF_MODULE_ID : "vf-module-id",

-		VF_MODULE_NAME : "vf-module-name",

-		VID : "VID",

-		VNF_ID : "vnf-id",

-		VNF_NAME : "vnf-name",

-		VNF_TYPE : "vnf-type",

-		VNFS : "vnfs",

-		AVAILABLEVOLUMEGROUPS : "availableVolumeGroups",

-		VOLUMEGROUPS : "volumeGroups",

-		VOLUME_GROUP : "volume-group",

-		VOLUME_GROUP_ID : "volume-group-id",

-		VOLUME_GROUP_NAME : "volume-group-name",

-		SDN_C_PRELOAD : "sdncPreload",

-		UPLOAD_SUPPLEMENTORY_DATA_FILE : "uploadSupplementoryDataFile",

-		SUPPLEMENTORY_DATA_FILE : "supplementoryDataFile"

+        AVAILABLE_VOLUME_GROUP: "availableVolumeGroup",

+        INSTANCE_NAME: "instanceName",

+        LCP_REGION: "lcpRegion",

+        LCP_REGION_TEXT: "lcpRegionText",

+        PRODUCT_FAMILY: "productFamily",

+        AIC_ZONES : "aic_zone",

+        SERVICE_TYPE: "serviceType",

+        SERVICE_ROLE: "serviceRole",

+        SUBSCRIBER_NAME: "subscriberName",

+        SUPPRESS_ROLLBACK: "suppressRollback",

+        TENANT: "tenant",

+        VNF_TARGETPROVSTATUS: "target",

+

+        AAI_GET_FULL_SUBSCRIBERS: "aai_get_full_subscribers",

+        AAI_REFRESH_FULL_SUBSCRIBERS: "aai_refresh_full_subscribers",

+        AAI_GET_SERVICES: "aai_get_services",

+        AAI_GET_SUBSCRIBERS: "aai_get_subscribers",

+        AAI_GET_TENTANTS: "aai_get_tenants",

+        AAI_REFRESH_SUBSCRIBERS: "aai_refresh_subscribers",

+        AAI_SUB_DETAILS: "aai_sub_details",

+        AAI_SUB_VIEWEDIT: "aai_sub_viewedit",

+        ANGULAR_UI_TREE_COLLAPSEALL: "angular-ui-tree:collapse-all",

+        ANGULAR_UI_TREE_EXPANDALL: "angular-ui-tree:expand-all",

+        CATEGORY: "category",

+        COLOR_8F8: "#8F8",

+        COLOR_F88: "#F88",

+        COLOR_NONE: "none",

+        CUSTOMER: "customer",

+        CUSTOMIZATION_UUID: "customizationUuid",

+        DESCRIPTION: "description",

+        GENERIC_VNF: "generic-vnf",

+        GLOBAL_CUSTOMER_ID: "global-customer-id",

+        GLOBAL_CUST_ID: "globalCustomerId",

+        IN_MAINT: "in-maint",

+        INVENTORY_RESPONSE_ITEMS: "inventory-response-items",

+        INVENTORY_RESPONSE_ITEM: "inventory-response-item",

+        L3_NETWORK: "l3-network",

+        SUB_NET: "subnet",

+        SUBNET_NAME: "subnet-name",

+        SUBNET_ID: "subnet-id",

+        GATEWAY_ADDRESS: "gateway-address",

+        NETWORK_START_ADDRESS: "network-start-address",

+        CIDR_MASK: "cidr-mask",

+        MODEL_CUSTOMIZATION_ID: "model-customization-id",

+        MODEL_CUSTOMIZATION_NAME: "modelCustomizationName",

+        MODEL_INVARIANT_ID: "modelInvariantId",

+        MODEL_INVAR_ID: "model-invariant-id",

+        MODEL_NAME: "modelName",

+        MODEL_NAME_VERSION_ID: "modelNameVersionId",

+        MODEL_VERSION: "modelVersion",

+        MODEL_VERSION_ID: "model-version-id",

+        NETWORK_NAME: "network-name",

+        NETWORK_ID: "network-id",

+        NETWORK_TYPE: "network-type",

+        NETWORKS: "networks",

+        OPERATIONAL_STATUS: "operational-status",

+        ORCHESTRATION_STATUS: "orchestration-status",

+        PERCENT_PROGRESS: "precentProgress",

+        PERSONA_MODEL_ID: "persona-model-id",

+        PERSONA_MODEL_VERSION: "persona-model-version",

+        PERSONA_MODEL_CUSTOMIZATION_ID: "persona-model-customization-id",

+        PROV_STATUS: "prov-status",

+        REQUEST: "request",

+        REQUEST_ID: "requestId",

+        REQUEST_LIST: "requestList",

+        REQUEST_TYPE: "requestType",

+        REQUEST_REFERENCES: "requestReferences",

+        REQUEST_STATE: "requestState",

+        REQUEST_STATUS: "requestStatus",

+        RESOURCE_LINK: "resource-link",

+        RESULT_DATA: "result-data",

+        SERVICE_DESCRIPTION: "service-description",

+        SERVICE_ID: "service-id",

+        SERVICE_INSTANCE: "service-instance",

+        SERVICE_INSTANCES: "service-instances",

+        SERVICE_INSTANCE_ID: "service-instance-id",

+        SERVICE_INSTANCE_NAME: "service-instance-name",

+        SERVICE_SUBSCRIPTION: "service-subscription",

+        SERVICE_SUBSCRIPTIONS: "service-subscriptions",

+        SERVICETYPE: "service-type",

+        STATUS_MESSAGE: "statusMessage",

+        SUBNAME: "subscriber-name",

+        IS_PERMITTED: "is-permitted",

+        TIMESTAMP: "timestamp",

+        VF_MODULE: "vf-module",

+        VF_MODULES: "vfModules",

+        VF_MODULE_ID: "vf-module-id",

+        VF_MODULE_NAME: "vf-module-name",

+        VID: "VID",

+        VNF_ID: "vnf-id",

+        VNF_NAME: "vnf-name",

+        VNF_TYPE: "vnf-type",

+        VNFS: "vnfs",

+        AVAILABLEVOLUMEGROUPS: "availableVolumeGroups",

+        VOLUMEGROUPS: "volumeGroups",

+        VOLUME_GROUP: "volume-group",

+        VOLUME_GROUP_ID: "volume-group-id",

+        VOLUME_GROUP_NAME: "volume-group-name",

+        SDN_C_PRELOAD: "sdncPreload",

+        UPLOAD_SUPPLEMENTORY_DATA_FILE: "uploadSupplementoryDataFile",

+        SUPPLEMENTORY_DATA_FILE: "supplementoryDataFile",

+        ZONE_ID:"zone-id",

+        ZONE_NAME:"zone-name",

+

     };

 

     var KEY = {

-	LCP_REGION_TEXT : "AAIAIC25"

+        LCP_REGION_TEXT: "AAIAIC25"

     };

-   

+

     /*

      * NAME values are displayed on GUI pages.

      */

@@ -150,6 +156,7 @@
 	MODEL_VNF_CODE: "NF Naming Code",

 	MODEL_CUSTOMIZATION_NAME: "Resource Name",

 	PRODUCT_FAMILY : "Product Family",

+        AIC_ZONES: "AIC Zone",

 	RESOURCE_DESCRIPTION : "Resource Description",

 	RESOURCE_NAME : "Resource Name",

 	SERVICE_CATEGORY : "Service Category",

@@ -163,9 +170,10 @@
 	SERVICE_UUID : "Service UUID",

 	SERVICE_VERSION : "Service Version",

 	SUBSCRIBER_NAME : "Subscriber Name",

+	MOBILITY :  "Mobility",

 	SUPPRESS_ROLLBACK : "Suppress Rollback on Failure",

 	SDN_C_PRELOAD : "SDN-C Pre-Load",

-	UPLOAD_SUPPLEMENTORY_DATA_FILE : "Upload Supplementory Data file",

+	UPLOAD_SUPPLEMENTORY_DATA_FILE : "Upload Supplementary Data file",

 	SUPPLEMENTORY_DATA_FILE : "Supplementory Data file (JSON format)",

 	TENANT : "Tenant",

 	USER_SERVICE_INSTANCE_NAME : "User Service Instance Name",

@@ -189,74 +197,75 @@
      * PROMPT values are initial values displayed in select lists.

      */

     var PROMPT = {

-	AVAILABLE_VOLUME_GROUP : "Select Volume Group",

-	DEFAULT_A : "A default",

-	DEFAULT_B : "B default",

-	LCP_REGION : "Select LCP Region",

-	NO_SERVICE_INSTANCE : "No Service Instance Found",

-	NO_SERVICE_SUB : "No Service Subscription Found",

-	PRODUCT_FAMILY : "Select Product Family",

-	REGION : "Please choose a region",

-	SERVICE_TYPE : "Select Service Type",

-	SUBSCRIBER_NAME : "Select Subscriber Name",

-	TARGETPROVSTATUS : "Select Target Prov Status",

-	TENANT : "Select Tenant Name",

-	TEXT_INPUT : "Enter data",

-	SELECT_SERVICE : "Select a service type",

-	SELECT_SUB : "Select a subscriber name",

-	FETCHING_SUBS : " Fetching subscriber list from A&AI",

-	REFRESH_SUB_LIST : "Refreshing subscriber list from A&AI...",

-	VAR_DESCRIPTION_A : "This variable is 'a'",

-	VAR_DESCRIPTION_B : "This variable is 'b'",

-	

+        AVAILABLE_VOLUME_GROUP: "Select Volume Group",

+        DEFAULT_A: "A default",

+        DEFAULT_B: "B default",

+        LCP_REGION: "Select LCP Region",

+        NO_SERVICE_INSTANCE: "No Service Instance Found",

+        NO_SERVICE_SUB: "No Service Subscription Found",

+        PRODUCT_FAMILY: "Select Product Family",

+        AIC_ZONES: "Select AIC Zone",

+        REGION: "Please choose a region",

+        SERVICE_TYPE: "Select Service Type",

+        SUBSCRIBER_NAME: "Select Subscriber Name",

+        TARGETPROVSTATUS: "Select Target Prov Status",

+        TENANT: "Select Tenant Name",

+        TEXT_INPUT: "Enter data",

+        SELECT_SERVICE: "Select a service type",

+        SELECT_SUB: "Select a subscriber name",

+        FETCHING_SUBS: " Fetching subscriber list from A&AI",

+        REFRESH_SUB_LIST: "Refreshing subscriber list from A&AI...",

+        VAR_DESCRIPTION_A: "This variable is 'a'",

+        VAR_DESCRIPTION_B: "This variable is 'b'",

+

     };

-    

+

     var STATUS = {

-    		// Status

-    		ALL : "ALL",

-    		COMPLETE : "Complete",

-    		DONE : "Done",

-    		ERROR : "Error",

-    		FAILED : "Failed",

-    		FAILED_SERVICE_MODELS_ASDC : "Failed to get service models from SDC.",

-    		FETCHING_SERVICE_TYPES : "Fetching service types list from A&AI", 

-    		FETCHING_SERVICE_CATALOG : "Fetching service catalog from AAI.  Please wait.",

-    		FETCHING_SERVICE_CATALOG_ASDC : "Fetching service catalog from SDC.  Please wait.",

-    		FETCHING_SUB_DETAILS : "Fetching subscriber details from A&AI for ",

-    		FETCHING_SERVICE_INST_DATA : "Fetching service instance data from A&AI for service-instance-id=",

-    		FETCHING_SUBSCRIBER_LIST_AAI : "Fetching subscriber list from A&AI...",

-    		IN_PROGRESS : "In Progress",

-    		IS_SUCCESSFUL : " isSuccessful: ",

-    		MSO_FAILURE : "msoFailure",

-    		NONE : "None",

-    		NOT_FOUND : "Not Found",

-    		NO_SERVICE_SUBSCRIPTION_FOUND : "No Service Subscription Found",

-    		SUBMITTING_REQUEST : "Submitting Request",

-    		SUCCESS_VNF_PROV_STATUS : "Successfully set the VNF's Prov_Status to ",

-    		UNLOCKED : "Unlocked",

-    		

+        // Status

+        ALL: "ALL",

+        COMPLETE: "Complete",

+        DONE: "Done",

+        ERROR: "Error",

+        FAILED: "Failed",

+        FAILED_SERVICE_MODELS_ASDC: "Failed to get service models from SDC.",

+        FETCHING_SERVICE_TYPES: "Fetching service types list from A&AI",

+        FETCHING_SERVICE_CATALOG: "Fetching service catalog from AAI.  Please wait.",

+        FETCHING_SERVICE_CATALOG_ASDC: "Fetching service catalog from SDC.  Please wait.",

+        FETCHING_SUB_DETAILS: "Fetching subscriber details from A&AI for ",

+        FETCHING_SERVICE_INST_DATA: "Fetching service instance data from A&AI for service-instance-id=",

+        FETCHING_SUBSCRIBER_LIST_AAI: "Fetching subscriber list from A&AI...",

+        IN_PROGRESS: "In Progress",

+        IS_SUCCESSFUL: " isSuccessful: ",

+        MSO_FAILURE: "msoFailure",

+        NONE: "None",

+        NOT_FOUND: "Not Found",

+        NO_SERVICE_SUBSCRIPTION_FOUND: "No Service Subscription Found",

+        SUBMITTING_REQUEST: "Submitting Request",

+        SUCCESS_VNF_PROV_STATUS: "Successfully set the VNF's Prov_Status to ",

+        UNLOCKED: "Unlocked",

+

     };

-    

+

     var STYLE = {

-    		TABLE : "width: auto; margin: 0 auto; border-collapse: collapse; border: none;",

-    		NAME : "width: 220px; text-align: left; vertical-align: middle; font-weight: bold; padding: 3px 5px; border: none;",

-		    VALUE : "width: 400px; text-align: left; vertical-align: middle; padding: 3px 5px; border: none;",

-		    CHECKBOX_VALUE : "width: 400px; text-align: center; vertical-align: middle; padding: 3px 5px; border: none;",

-		    TEXT_INPUT : "height: 25px; padding: 2px 5px;",

-		    CHECKBOX_INPUT : "height: 18px; width: 18px; padding: 2px 5px;",

-		    SELECT : "height: 25px; padding: 2px; text-align: center;",

-		    REQUIRED_LABEL : "width: 25px; padding: 5px 10px 10px 5px;",

-		    

-		    DISABLED : "disabled",

-		    BTN_INACTIVE : "button--inactive",

-		    BTN_PRIMARY : "button--primary",

-		    BTN_TYPE : "btn-type",

-		    MSO_CTRL_BTN : "div[ng-controller=msoCommitController] button",

-		    PRIMARY : "primary",

-		    PROGRESS_BAR_INFO : "progress-bar progress-bar-info",

-		    PROGRESS_BAR_SUCCESS : "progress-bar progress-bar-success",

+        TABLE: "width: auto; margin: 0 auto; border-collapse: collapse; border: none;",

+        NAME: "width: 220px; text-align: left; vertical-align: middle; font-weight: bold; padding: 3px 5px; border: none;",

+        VALUE: "width: 400px; text-align: left; vertical-align: middle; padding: 3px 5px; border: none;",

+        CHECKBOX_VALUE: "width: 400px; text-align: center; vertical-align: middle; padding: 3px 5px; border: none;",

+        TEXT_INPUT: "height: 25px; padding: 2px 5px;",

+        CHECKBOX_INPUT: "height: 18px; width: 18px; padding: 2px 5px;",

+        SELECT: "height: 25px; padding: 2px; text-align: center;",

+        REQUIRED_LABEL: "width: 25px; padding: 5px 10px 10px 5px;",

+

+        DISABLED: "disabled",

+        BTN_INACTIVE: "button--inactive",

+        BTN_PRIMARY: "button--primary",

+        BTN_TYPE: "btn-type",

+        MSO_CTRL_BTN: "div[ng-controller=msoCommitController] button",

+        PRIMARY: "primary",

+        PROGRESS_BAR_INFO: "progress-bar progress-bar-info",

+        PROGRESS_BAR_SUCCESS: "progress-bar progress-bar-success",

     }

-    

+

     var ERROR = {

     		AAI : "A&AI failure - see log below for details",

     		AAI_ERROR : "A&AI Error",

@@ -280,7 +289,8 @@
     		SERVICE_INST_DNE : "That service instance does not exist.  Please try again.",

     		SYSTEM_FAILURE : "System failure",

     		INVALID_DATA_FORMAT : 'Invalid data format.Please check your file content whether it is not in json or not.',

-    		

+    		MISSING_FILE : 'Please Select JSON File.',

+

     }

 

     /*

@@ -289,143 +299,150 @@
      */

 

     var PARAMETER = {

-	AVAILABLE_VOLUME_GROUP : {

-	    name : NAME.AVAILABLE_VOLUME_GROUP,

-	    id : ID.AVAILABLE_VOLUME_GROUP,

-	    type : PARAMETER.SELECT,

-	    prompt : PROMPT.AVAILABLE_VOLUME_GROUP,

-	    isRequired : true

-	},

-	INSTANCE_NAME : {

-	    name : NAME.INSTANCE_NAME,

-	    id : ID.INSTANCE_NAME,

-	    isRequired : true

-	},

-	LCP_REGION : {

-	    name : NAME.LCP_REGION,

-	    id : ID.LCP_REGION,

-	    type : PARAMETER.SELECT,

-	    prompt : PROMPT.LCP_REGION,

-	    isRequired : true

-	},

-	VNF_TARGET_PROVSTATUS : {

-	    name : NAME.VNF_Target_Prov_Status,

-	    id : ID.VNF_TARGETPROVSTATUS,

-	    type : PARAMETER.SELECT,

-	    prompt : PROMPT.TARGETPROVSTATUS,

-	    isRequired : true

-	},

-	LCP_REGION_TEXT_HIDDEN : {

-	    id : ID.LCP_REGION_TEXT,

-	    isVisible : false

-	},

-	LCP_REGION_TEXT_VISIBLE : {

-	    name : NAME.LCP_REGION_TEXT,

-	    id : ID.LCP_REGION_TEXT,

-	    isRequired : true,

-	    isVisible : true

-	},

-	PRODUCT_FAMILY : {

-	    name : NAME.PRODUCT_FAMILY,

-	    id : ID.PRODUCT_FAMILY,

-	    type : PARAMETER.SELECT,

-	    prompt : PROMPT.PRODUCT_FAMILY,

-	    isRequired : true

-	},

-	SERVICE_TYPE : {

-	    name : NAME.SERVICE_TYPE,

-	    id : ID.SERVICE_TYPE,

-	    type : PARAMETER.SELECT,

-	    prompt : PROMPT.SERVICE_TYPE,

-	    isRequired : true

-	},

-	SERVICE_TYPE_DISABLED : {

-	    name : NAME.SERVICE_TYPE,

-	    id : ID.SERVICE_TYPE,

-	    type : PARAMETER.SELECT,

-	    isEnabled : false,

-	    isRequired : true

-	},

-	SUPPRESS_ROLLBACK : {

-	    name : NAME.SUPPRESS_ROLLBACK,

-	    id : ID.SUPPRESS_ROLLBACK,

-	    type : PARAMETER.BOOLEAN,

-	    value : false

-	},

-	SDN_C_PRELOAD_CHECKED : {

-		name : NAME.SDN_C_PRELOAD,

-	    id : ID.SDN_C_PRELOAD,

-	    type : PARAMETER.CHECKBOX,

-	    value : true,

-	    isVisible:true,

-	    isRequired:false

-	},

-	SDN_C_PRELOAD_UNCHECKED : {

-		name : NAME.SDN_C_PRELOAD,

-	    id : ID.SDN_C_PRELOAD,

-	    type : PARAMETER.CHECKBOX,

-	    value : false,

-	    isVisible:true,

-	    isRequired:false

-	},

-	UPLOAD_SUPPLEMENTORY_DATA_FILE_CHECKED : {

-		name : NAME.UPLOAD_SUPPLEMENTORY_DATA_FILE,

-	    id : ID.UPLOAD_SUPPLEMENTORY_DATA_FILE,

-	    type : PARAMETER.CHECKBOX,

-	    value : true,

-	    isVisible:true,

-	    isRequired:false

-	},

-	UPLOAD_SUPPLEMENTORY_DATA_FILE_UNCHECKED : {

-		name : NAME.UPLOAD_SUPPLEMENTORY_DATA_FILE,

-	    id : ID.UPLOAD_SUPPLEMENTORY_DATA_FILE,

-	    type : PARAMETER.CHECKBOX,

-	    value : false,

-	    isVisible:true,

-	    isRequired:false

-	},

-	SUPPLEMENTORY_DATA_FILE : {

-		name : NAME.SUPPLEMENTORY_DATA_FILE,

-	    id : ID.SUPPLEMENTORY_DATA_FILE,

-	    type : PARAMETER.FILE,

-	    isRequired : false,

-	    isVisible : true,

-	    fileData:''

-	},

+        AVAILABLE_VOLUME_GROUP: {

+            name: NAME.AVAILABLE_VOLUME_GROUP,

+            id: ID.AVAILABLE_VOLUME_GROUP,

+            type: PARAMETER.SELECT,

+            prompt: PROMPT.AVAILABLE_VOLUME_GROUP,

+            isRequired: true

+        },

+        INSTANCE_NAME: {

+            name: NAME.INSTANCE_NAME,

+            id: ID.INSTANCE_NAME,

+            isRequired: true

+        },

+        LCP_REGION: {

+            name: NAME.LCP_REGION,

+            id: ID.LCP_REGION,

+            type: PARAMETER.SELECT,

+            prompt: PROMPT.LCP_REGION,

+            isRequired: true

+        },

+        VNF_TARGET_PROVSTATUS: {

+            name: NAME.VNF_Target_Prov_Status,

+            id: ID.VNF_TARGETPROVSTATUS,

+            type: PARAMETER.SELECT,

+            prompt: PROMPT.TARGETPROVSTATUS,

+            isRequired: true

+        },

+        LCP_REGION_TEXT_HIDDEN: {

+            id: ID.LCP_REGION_TEXT,

+            isVisible: false

+        },

+        LCP_REGION_TEXT_VISIBLE: {

+            name: NAME.LCP_REGION_TEXT,

+            id: ID.LCP_REGION_TEXT,

+            isRequired: true,

+            isVisible: true

+        },

+        PRODUCT_FAMILY: {

+            name: NAME.PRODUCT_FAMILY,

+            id: ID.PRODUCT_FAMILY,

+            type: PARAMETER.SELECT,

+            prompt: PROMPT.PRODUCT_FAMILY,

+            isRequired: true

+        },

+        AIC_ZONES: {

+            name: NAME.AIC_ZONES,

+            id: ID.AIC_ZONES,

+            type: PARAMETER.SELECT,

+            prompt: PROMPT.AIC_ZONES,

+            isRequired: false

+        },

+        SERVICE_TYPE: {

+            name: NAME.SERVICE_TYPE,

+            id: ID.SERVICE_TYPE,

+            type: PARAMETER.SELECT,

+            prompt: PROMPT.SERVICE_TYPE,

+            isRequired: true

+        },

+        SERVICE_TYPE_DISABLED: {

+            name: NAME.SERVICE_TYPE,

+            id: ID.SERVICE_TYPE,

+            type: PARAMETER.SELECT,

+            isEnabled: false,

+            isRequired: true

+        },

+        SUPPRESS_ROLLBACK: {

+            name: NAME.SUPPRESS_ROLLBACK,

+            id: ID.SUPPRESS_ROLLBACK,

+            type: PARAMETER.BOOLEAN,

+            value: false

+        },

+        SDN_C_PRELOAD_CHECKED: {

+            name: NAME.SDN_C_PRELOAD,

+            id: ID.SDN_C_PRELOAD,

+            type: PARAMETER.CHECKBOX,

+            value: true,

+            isVisible: true,

+            isRequired: false

+        },

+        SDN_C_PRELOAD_UNCHECKED: {

+            name: NAME.SDN_C_PRELOAD,

+            id: ID.SDN_C_PRELOAD,

+            type: PARAMETER.CHECKBOX,

+            value: false,

+            isVisible: true,

+            isRequired: false

+        },

+        UPLOAD_SUPPLEMENTORY_DATA_FILE_CHECKED: {

+            name: NAME.UPLOAD_SUPPLEMENTORY_DATA_FILE,

+            id: ID.UPLOAD_SUPPLEMENTORY_DATA_FILE,

+            type: PARAMETER.CHECKBOX,

+            value: true,

+            isVisible: true,

+            isRequired: false

+        },

+        UPLOAD_SUPPLEMENTORY_DATA_FILE_UNCHECKED: {

+            name: NAME.UPLOAD_SUPPLEMENTORY_DATA_FILE,

+            id: ID.UPLOAD_SUPPLEMENTORY_DATA_FILE,

+            type: PARAMETER.CHECKBOX,

+            value: false,

+            isVisible: true,

+            isRequired: false

+        },

+        SUPPLEMENTORY_DATA_FILE: {

+            name: NAME.SUPPLEMENTORY_DATA_FILE,

+            id: ID.SUPPLEMENTORY_DATA_FILE,

+            type: PARAMETER.FILE,

+            isRequired: false,

+            isVisible: true,

+            fileData: ''

+        },

 

-	SUBSCRIBER_NAME : {

-		name : NAME.SUBSCRIBER_NAME,

-		id : ID.SUBSCRIBER_NAME,

-	    type : PARAMETER.SELECT,

-	    prompt : PROMPT.SUBSCRIBER_NAME,

+        SUBSCRIBER_NAME: {

+            name: NAME.SUBSCRIBER_NAME,

+            id: ID.SUBSCRIBER_NAME,

+            type: PARAMETER.SELECT,

+            prompt: PROMPT.SUBSCRIBER_NAME,

 		isRequired : true,

 		isSingleOptionAutoSelected : false

-	},

-	TENANT_DISABLED : {

-	    name : NAME.TENANT,

-	    id : ID.TENANT,

-	    type : PARAMETER.SELECT,

-	    isEnabled : false,

-	    isRequired : true

-	},

-	TENANT_ENABLED : {

-	    name : NAME.TENANT,

-	    id : ID.TENANT,

-	    type : PARAMETER.SELECT,

-	    isEnabled : true,

-	    prompt : PROMPT.TENANT,

-	    isRequired : true

-	}

+        },

+        TENANT_DISABLED: {

+            name: NAME.TENANT,

+            id: ID.TENANT,

+            type: PARAMETER.SELECT,

+            isEnabled: false,

+            isRequired: true

+        },

+        TENANT_ENABLED: {

+            name: NAME.TENANT,

+            id: ID.TENANT,

+            type: PARAMETER.SELECT,

+            isEnabled: true,

+            prompt: PROMPT.TENANT,

+            isRequired: true

+        }

     };

 

     return {

-	ID : ID,

-	KEY : KEY,

-	NAME : NAME,

-	PARAMETER : PARAMETER,

-	PROMPT : PROMPT,

-	STATUS : STATUS,

-	STYLE : STYLE,

-	ERROR : ERROR,

+        ID: ID,

+        KEY: KEY,

+        NAME: NAME,

+        PARAMETER: PARAMETER,

+        PROMPT: PROMPT,

+        STATUS: STATUS,

+        STYLE: STYLE,

+        ERROR: ERROR,

     }

-} ]);

+}]);

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 f560661..4341a4c 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
@@ -91,7 +91,10 @@
 	 * 

 	 */

 	var COMPONENT_LIST_NAMED_QUERY_ID = "0367193e-c785-4d5f-9cb8-7bc89dc9ddb7";

-	var MACRO_SERVICES = [];

+	var MACRO_SERVICES = ["93150ffa-00c6-4ea0-85f2-3536ca46ebd2",

+		"2b54297f-72e7-4a94-b451-72df88d0be0b",

+		"d27e42cf-087e-4d31-88ac-6c4b7585f800",

+		"ec0c4bab-c272-4dab-b087-875031bb0c9f","0311f998-9268-4fd6-bbba-afff15087b72"];

     return {

     	ASDC_MODEL_STATUS : ASDC_MODEL_STATUS,

     	MSO_MAX_POLLS : MSO_MAX_POLLS,

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 dcbf3e6..b0fcb11 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
@@ -33,8 +33,9 @@
 		$scope.defaultBaseUrl = "";

 		$scope.responseTimeoutMsec = 60000;

 		$scope.properties = UtilityService.getProperties();

-        $scope.init = function() {

+		$scope.isPermitted = $location.search().isPermitted;

 

+        $scope.init = function() {

             /*

              * These 2 statements should be included in non-test code.

              */

@@ -46,7 +47,7 @@
     		var polls = PropertyService.retrieveMsoMaxPolls();

     		PropertyService.setMsoMaxPolls(polls);

     		

-    		PropertyService.setServerResponseTimeoutMsec(10000);

+    		PropertyService.setServerResponseTimeoutMsec(30000);

 

             /*

              * Common parameters that shows an example of how the view edit screen

@@ -224,11 +225,17 @@
 			

 			console.log("Removing Service " + $scope.service.instance.name);

 

-			DataService.setALaCarte (true);

+			if ( $scope.isMacro() ) {

+				DataService.setALaCarte (false);

+				}

+				else {

+				DataService.setALaCarte (true);

+				}

+			DataService.setMacro($scope.isMacro());

 			DataService.setInventoryItem(serviceInstance);

 			

 			DataService.setModelInfo(COMPONENT.SERVICE, {

-				"modelInvariantId": serviceInstance[FIELD.ID.MODEL_INVAR_ID],

+				"modelInvariantId": $scope.service.model.service.invariantUuid,

 				"modelVersion": $scope.service.model.service.version,

 				"modelNameVersionId": $scope.service.model.service.uuid,

 				"modelName": $scope.service.model.service.name,

@@ -345,6 +352,9 @@
 

 		$scope.deleteVnf = function(serviceObject, vnf) {

 

+

+			debugger;

+

 			console.log("Removing VNF " + vnf.name);

 			

 			var serviceInstance = serviceObject.object;

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 dd2cf73..731c2f2 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
@@ -39,8 +39,9 @@
 			$http.get(pathQuery)

 			.then(function successCallback(response) {

 				$scope.services = [];

-				if (angular.isArray(response.data)) {

-					$scope.services = response.data;

+				if (angular.isArray(response.data.services)) {

+					wholeData = response.data.services;

+					$scope.services = $scope.filterDataWithHigerVersion(wholeData);

 					$scope.viewPerPage=10;

 					$scope.totalPage=$scope.services.length/$scope.viewPerPage;

 					$scope.sortBy=COMPONENT.NAME;

@@ -56,11 +57,72 @@
 					$scope.error = true;

 					$scope.isSpinnerVisible = false;

 				}

+				$scope.deployButtonType = response.data.readOnly ? 'disabled' : 'primary';

 			}, function errorCallback(response) {

 				console.log("Error: " + response);

 			});

 		}

-		

+		$scope.isFiltered=function(arr,obj){

+			var filtered = false;

+			if(arr.length>0){

+				for(var i=0;i<arr.length;i++){

+					if((arr[i].name == obj.name) && (obj.invariantUUID == arr[i].invariantUUID)){

+						filtered = true;

+					}

+				}

+			}

+			return filtered;

+		}

+		var wholeData=[];

+		$scope.filterDataWithHigerVersion = function(serviceData){

+			var fiterDataServices = [];

+			for(var i=0;i<serviceData.length;i++){

+				var higherVersion = serviceData[i];

+				if(!$scope.isFiltered(fiterDataServices,serviceData[i])){

+					for(var j=i;j<serviceData.length;j++){

+						if((serviceData[i].invariantUUID.trim() == serviceData[j].invariantUUID.trim()) && (serviceData[i].name.trim() == serviceData[j].name.trim()) && (parseFloat(serviceData[j].version.trim())>=parseFloat(serviceData[i].version.trim()))){

+							var data = $scope.isThisHigher(fiterDataServices,serviceData[j]);

+							if(data.isHigher){

+								fiterDataServices[data.index] = serviceData[j];

+							}

+						}

+					}

+				}

+			}

+			return fiterDataServices;

+		}

+

+		$scope.isThisHigher = function(arr,obj){

+			var returnObj = {

+					isHigher:false,

+					index:0

+			};

+			if(arr.length>0){

+				var isNotMatched = true;

+				for(var i=0;i<arr.length;i++){

+					if((arr[i].name == obj.name) && (arr[i].invariantUUID == obj.invariantUUID ) && (arr[i].version<obj.version) ){

+						isNotMatched = false;

+						returnObj = {

+								isHigher:true,

+								index:i

+						};

+					}

+				}

+				if(isNotMatched && !$scope.isFiltered(arr,obj)){

+					returnObj = {

+							isHigher:true,

+							index:arr.length

+					};

+				}

+			}else{

+				returnObj = {

+						isHigher:true,

+						index:0

+				}

+			}

+			return returnObj;

+		}

+

 		$scope.init = function() {

     		var msecs = PropertyService.retrieveMsoMaxPollingIntervalMsec();

     		PropertyService.setMsoMaxPollingIntervalMsec(msecs);

@@ -69,7 +131,7 @@
     		PropertyService.setMsoMaxPolls(polls);

     		

     		//PropertyService.setMsoBaseUrl("testmso");

-    		PropertyService.setServerResponseTimeoutMsec(10000);

+    		PropertyService.setServerResponseTimeoutMsec(30000);

         }

 		

 		$scope.prevPage = function() {

@@ -95,6 +157,8 @@
 					DataService.setModelInfo(COMPONENT.SERVICE, {

 						"modelInvariantId": serviceModel.service.invariantUuid,

 						"modelVersion": serviceModel.service.version,

+						"serviceType" : serviceModel.service.serviceType,

+						"serviceRole": serviceModel.service.serviceRole,

 						"modelNameVersionId": serviceModel.service.uuid,

 						"modelName": serviceModel.service.name,

 						"description": serviceModel.service.description,

@@ -121,6 +185,8 @@
 							"category":serviceModel.service.category,

 							"serviceEcompNaming": serviceModel.service.serviceEcompNaming,

 							"inputs": serviceModel.service.inputs,

+							"serviceType": serviceModel.service.serviceType,

+							"serviceRole": serviceModel.service.serviceRole,

 							"displayInputs": convertedAsdcModel.completeDisplayInputs

 						});

 					};

@@ -156,6 +222,27 @@
 				});

 		};

 		

+		$scope.tableData=[];

+		var oldData=[];

+		$scope.loadPreviousVersionData=function(invariantUUID , name, version){

+			$scope.tableData =[];

+			oldData=[];

+			for(var i=0;i<wholeData.length;i++){

+				if(wholeData[i].invariantUUID == invariantUUID && wholeData[i].name == name && version!=wholeData[i].version){

+					oldData.push(wholeData[i]);

+				}

+			}

+			$scope.tableData = oldData;

+			$scope.createType = "Previous Version";

+			var broadcastType = "createTableComponent";

+			$scope.componentName = name;

+			$scope.$broadcast(broadcastType, {

+			    componentId : COMPONENT.OLDVERSION,

+			    callbackFunction : function(response) {

+			    }

+			});

+		}

+

 		$scope.refreshSubs = function(subscriberId, serviceType, serviceInstanceId) {

 			$scope.status = FIELD.STATUS.FETCHING_SUBSCRIBER_LIST_AAI;

 			$scope.init();

@@ -206,14 +293,15 @@
 				}).then(function(response) {

 					angular.forEach(response.data, function(value, key) {

 						angular.forEach(value, function(subVal, key) {

-							var newVal = { "id" : subVal[FIELD.ID.SERVICE_ID], "description" : subVal[FIELD.ID.SERVICE_DESCRIPTION] };

+							var newVal = { "id" : subVal[FIELD.ID.SERVICE_ID], "description" : subVal[FIELD.ID.SERVICE_DESCRIPTION] ,"isPermitted" : subVal[FIELD.ID.IS_PERMITTED] };

 							serviceIdList.push(newVal);

 							DataService.setServiceIdList(serviceIdList);

 							

 							$location.search({

 								"subscriberId": subscriberId,

 								"serviceType": serviceType,

-								"serviceInstanceId": serviceInstanceId

+								"serviceInstanceId": serviceInstanceId,

+								"isPermitted": newVal.isPermitted.toString()

 							});

 							

 							$location.path(COMPONENT.INSTANTIATE_PATH);

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 eac79ed..84d27a2 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,106 +20,106 @@
 

 "use strict";

 

-appDS2.controller("aaiSubscriberController", [ "COMPONENT", "FIELD", "PARAMETER", "DataService", "PropertyService", "$scope", "$http", "$timeout", "$location", "$log", "$route", "VIDCONFIGURATION", "UtilityService", "vidService","AaiService",

-                                            function(COMPONENT, FIELD, PARAMETER, DataService, PropertyService, $scope, $http, $timeout, $location, $log, $route, VIDCONFIGURATION, UtilityService, vidService, AaiService) {

+appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER", "DataService", "PropertyService", "$scope", "$http", "$timeout", "$location", "$log", "$route", "VIDCONFIGURATION", "UtilityService", "vidService", "AaiService",

+    function (COMPONENT, FIELD, PARAMETER, DataService, PropertyService, $scope, $http, $timeout, $location, $log, $route, VIDCONFIGURATION, UtilityService, vidService, AaiService) {

 

-	$scope.showVnfDetails = function(vnf) {

-		console.log("showVnfDetails");

-		DataService.setVnfInstanceId(COMPONENT.VNF_INSTANCE_ID);

-		DataService

-		.setInventoryItem(aaiResult[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM][0]);

+        $scope.showVnfDetails = function (vnf) {

+            console.log("showVnfDetails");

+            DataService.setVnfInstanceId(COMPONENT.VNF_INSTANCE_ID);

+            DataService

+                .setInventoryItem(aaiResult[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM][0]);

 

-		$scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {

-			componentId : COMPONENT.VNF,

-			callbackFunction : callbackFunction

-		});

-	}

-	$scope.popup = new Object();

+            $scope.$broadcast(COMPONENT.SHOW_COMPONENT_DETAILS, {

+                componentId: COMPONENT.VNF,

+                callbackFunction: callbackFunction

+            });

+        }

+        $scope.popup = new Object();

 

 

-	$scope.isPopupVisible = false;

-	$scope.defaultBaseUrl = "";

-	$scope.responseTimeoutMsec = 60000;

+        $scope.isPopupVisible = false;

+        $scope.defaultBaseUrl = "";

+        $scope.responseTimeoutMsec = 60000;

 

-	$scope.serviceTypes=[ FIELD.PROMPT.SELECT_SERVICE, COMPONENT.UCPE_VMS, COMPONENT.SDN_L3_BONDING, COMPONENT.SDN_ETHERNET_INTERNET];

-	$scope.defaultSubscriberName=[ FIELD.PROMPT.SELECT_SUB ];

+        $scope.serviceTypes = [FIELD.PROMPT.SELECT_SERVICE, COMPONENT.UCPE_VMS, COMPONENT.SDN_L3_BONDING, COMPONENT.SDN_ETHERNET_INTERNET];

+        $scope.defaultSubscriberName = [FIELD.PROMPT.SELECT_SUB];

 

-	var callbackFunction = function(response) {

-		alert(response);

-	};

+        var callbackFunction = function (response) {

+            alert(response);

+        };

 

-	$scope.getSubs = function() {

-		$scope.init();

-		$scope.fetchSubs(FIELD.PROMPT.FETCHING_SUBS);

-		$scope.fetchServices();

+        $scope.getSubs = function () {

+            $scope.init();

+            $scope.fetchSubs(FIELD.PROMPT.FETCHING_SUBS);

+            $scope.fetchServices();

 

-	};

-	

-	 $scope.cancelCreateSI = function(){

-	 		

-			window.location.href = COMPONENT.WELCOME_PATH;

-			

-		};

-	 

-		$scope.getServiceTypes = function(globalCustomerId){

-			DataService.setGlobalCustomerId(globalCustomerId);

-			DataService.setServiceIdList($scope.customerList)

+        };

 

-			if (globalCustomerId !== "" && globalCustomerId !== undefined ) {

-				window.location.href = COMPONENT.SERVICE_TYPE_LIST_PATH + $scope.serviceTypeList;

-			}

-		}

-		

-		$scope.refreshServiceTypes = function(globalCustomerId){

-			DataService.setGlobalCustomerId(globalCustomerId);

-			

-			$scope.getServiceTypesList();

-		}

-		

-		$scope.subId="";

-		$scope.createSubscriberName="";

-		$scope.serviceTypeList={};

-		$scope.custSubList=[];

-		$scope.getServiceTypesList = function(){

-			var notFound = true;

-			var globalCustomerId = DataService.getGlobalCustomerId();

-			$scope.custSubList = DataService.getServiceIdList();

-			if(globalCustomerId !== "" && globalCustomerId !== undefined ){

-				$scope.subId=globalCustomerId;

-				$scope.init();

-				$scope.status = FIELD.PROMPT.FETCHING_SERVICE_TYPES;

-				DataService.setGlobalCustomerId(globalCustomerId);

-				

-				AaiService.getSubscriptionServiceTypeList(DataService

-						.getGlobalCustomerId(), function(response) {

-					notFound = false;

-					$scope.setProgress(100); // done

-					$scope.status = FIELD.STATUS.DONE;

-					$scope.isSpinnerVisible = false;

-					$scope.serviceTypeList = response;

-					for(var i=0; i<$scope.custSubList.length;i++){

-						if(globalCustomerId === $scope.custSubList[i].globalCustomerId){

-							$scope.createSubscriberName = $scope.custSubList[i].subscriberName;

-						}

-					}

-				}, function(response) { // failure

-					$scope.showError(FIELD.ERROR.AAI);

-					$scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_TYPES + response.status;

-					$scope.errorDetails = response.data;

-				});

-			} else {

-				alert(FIELD.ERROR.SELECT);

-			}

-			

-		};

-		

-		$scope.subList = [];

-		$scope.getAaiServiceModels = function(selectedServicetype,subName){

-			DataService.setGlobalCustomerId(selectedServicetype);

-			DataService.setServiceIdList($scope.serviceTypeList)

-			DataService.setSubscriberName(subName);

-			

-			DataService.setSubscribers($scope.custSubList);

+        $scope.cancelCreateSI = function () {

+

+            window.location.href = COMPONENT.WELCOME_PATH;

+

+        };

+

+        $scope.getServiceTypes = function (globalCustomerId) {

+            DataService.setGlobalCustomerId(globalCustomerId);

+            DataService.setServiceIdList($scope.customerList)

+

+            if (globalCustomerId !== "" && globalCustomerId !== undefined) {

+                window.location.href = COMPONENT.SERVICE_TYPE_LIST_PATH + $scope.serviceTypeList;

+            }

+        }

+

+        $scope.refreshServiceTypes = function (globalCustomerId) {

+            DataService.setGlobalCustomerId(globalCustomerId);

+

+            $scope.getServiceTypesList();

+        }

+

+        $scope.subId = "";

+        $scope.createSubscriberName = "";

+        $scope.serviceTypeList = {};

+        $scope.custSubList = [];

+        $scope.getServiceTypesList = function () {

+            var notFound = true;

+            var globalCustomerId = DataService.getGlobalCustomerId();

+            $scope.custSubList = DataService.getServiceIdList();

+            if (globalCustomerId !== "" && globalCustomerId !== undefined) {

+                $scope.subId = globalCustomerId;

+                $scope.init();

+                $scope.status = FIELD.PROMPT.FETCHING_SERVICE_TYPES;

+                DataService.setGlobalCustomerId(globalCustomerId);

+

+                AaiService.getSubscriptionServiceTypeList(DataService

+                    .getGlobalCustomerId(), function (response) {

+                    notFound = false;

+                    $scope.setProgress(100); // done

+                    $scope.status = FIELD.STATUS.DONE;

+                    $scope.isSpinnerVisible = false;

+                    $scope.serviceTypeList = response;

+                    for (var i = 0; i < $scope.custSubList.length; i++) {

+                        if (globalCustomerId === $scope.custSubList[i].globalCustomerId) {

+                            $scope.createSubscriberName = $scope.custSubList[i].subscriberName;

+                        }

+                    }

+                }, function (response) { // failure

+                    $scope.showError(FIELD.ERROR.AAI);

+                    $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_TYPES + response.status;

+                    $scope.errorDetails = response.data;

+                });

+            } else {

+                alert(FIELD.ERROR.SELECT);

+            }

+

+        };

+

+        $scope.subList = [];

+        $scope.getAaiServiceModels = function (selectedServicetype, subName) {

+            DataService.setGlobalCustomerId(selectedServicetype);

+            DataService.setServiceIdList($scope.serviceTypeList)

+            DataService.setSubscriberName(subName);

+

+            DataService.setSubscribers($scope.custSubList);

 

 			if (selectedServicetype !== "" && selectedServicetype !== 'undefined') {

 				$location.path(COMPONENT.CREATE_INSTANCE_PATH);

@@ -136,28 +136,30 @@
 			$scope.custSubList = DataService.getSubscribers();

 			for(var i=0; i<$scope.serviceTypeList.length;i++){

 						if(parseInt(serviceTypeId) === i ){

-							$scope.serviceTypeName = $scope.serviceTypeList[i];

+							$scope.serviceTypeName = $scope.serviceTypeList[i].name;

+                }

 						}

-					};

+					;

 		    for(var i=0; i<$scope.custSubList.length;i++){

 						if($scope.createSubscriberName === $scope.custSubList[i].subscriberName){

 							globalCustomerId = $scope.custSubList[i].globalCustomerId;

 							globalCustId = globalCustomerId;

 						}

-					};

-			

+					}

+			;

 			var pathQuery ="";

-			

+

 			if(null !== globalCustomerId && "" !== globalCustomerId && undefined !== globalCustomerId

 					&& null !== serviceTypeId && "" !== serviceTypeId && undefined !== serviceTypeId){

 				pathQuery = COMPONENT.SERVICES_PATH +globalCustomerId+"/"+$scope.serviceTypeName;

 			}

-			

+

 			var namedQueryId='6e806bc2-8f9b-4534-bb68-be91267ff6c8';

 			AaiService.getServiceModelsByServiceType(namedQueryId,globalCustomerId,$scope.serviceTypeName,function(response) { // success

 				$scope.services = [];

 				if (angular.isArray(response.data['inventory-response-item'])) {

-					$scope.services = response.data['inventory-response-item'][0]['inventory-response-items']['inventory-response-item'];

+					wholeData = response.data['inventory-response-item'][0]['inventory-response-items']['inventory-response-item'];

+					$scope.services = $scope.filterDataWithHigerVersion(response.data['inventory-response-item'][0]['inventory-response-items']['inventory-response-item']);

 					$scope.serviceType = response.data['inventory-response-item'][0]['service-subscription']['service-type'];

 					$scope.viewPerPage=10;

 					$scope.totalPage=$scope.services.length/$scope.viewPerPage;

@@ -180,31 +182,32 @@
 				$scope.errorMsg = FIELD.ERROR.FETCHING_SERVICES+ response.status;

 				$scope.errorDetails = response.data;

 			});

-			

+

 			};

-			

+

 			var globalCustId;// This value will be assigned only on create new service instance screen-macro

 			$scope.createType = "a la carte";

 		$scope.deployService = function(service,hideServiceFields) {

 			hideServiceFields = hideServiceFields|| false;

 			var temp = service;

 			service.uuid = service['service-instance']['model-version-id'];

-			

+

 			console.log("Instantiating ASDC service " + service.uuid);

-			

+

 			$http.get('rest/models/services/' + service.uuid)

 				.then(function successCallback(getServiceResponse) {

 					getServiceResponse.data['service'].serviceTypeName =$scope.serviceTypeName ;

 					getServiceResponse.data['service'].createSubscriberName =$scope.createSubscriberName ;

 					var serviceModel = getServiceResponse.data;

 					DataService.setServiceName(serviceModel.service.name);

-					

+

 					DataService.setModelInfo(COMPONENT.SERVICE, {

 						"modelInvariantId": serviceModel.service.invariantUuid,

 						"modelVersion": serviceModel.service.version,

 						"modelNameVersionId": serviceModel.service.uuid,

 						"modelName": serviceModel.service.name,

-						"description": serviceModel.service.description,

+						"description": serviceModel.service.description,"serviceType": serviceModel.service.serviceType,

+                        "serviceRole": serviceModel.service.serviceRole,

 						"category":serviceModel.service.category,

 						"serviceTypeName":serviceModel.service.serviceTypeName,

 						"createSubscriberName":serviceModel.service.createSubscriberName

@@ -238,21 +241,23 @@
 							"inputs": serviceModel.service.inputs,

 							"displayInputs": convertedAsdcModel.completeDisplayInputs,

 							"serviceTypeName":serviceModel.service.serviceTypeName,

-							"createSubscriberName":serviceModel.service.createSubscriberName

-						});

-					};

-					

+							"createSubscriberName":serviceModel.service.createSubscriberName,

+						"serviceType": serviceModel.service.serviceType,

+                            "serviceRole": serviceModel.service.serviceRole

+                        });}

+					;

+

 					$scope.$broadcast(broadcastType, {

 					    componentId : COMPONENT.SERVICE,

 					    callbackFunction : function(response) {

 					    	if (response.isSuccessful) {

 								vidService.setModel(serviceModel);

-								

+

 								var subscriberId = "Not Found";

 								var serviceType = "Not Found";

-								

+

 								var serviceInstanceId = response.instanceId;

-								

+

 								for (var i = 0; i < response.control.length; i++) {

 									if (response.control[i].id == "subscriberName") {

 										subscriberId = response.control[i].value;

@@ -260,645 +265,751 @@
 										serviceType = response.control[i].value;

 									}

 								}

-								

-								

+

+

 								$scope.refreshSubs(subscriberId,serviceType,serviceInstanceId);

-							

+

 					    	}

 					    }

 					});

-					

+

 				}, function errorCallback(response) {

 					console.log("Error: " + response);

 				});

 		};

-		

+		$scope.isFiltered=function(arr,obj){

+			var filtered = false;

+			if(arr.length>0){

+				for(var i=0;i<arr.length;i++){

+					if(obj['extra-properties']['extra-property'] && (obj['extra-properties']['extra-property'][2]['property-value'] == arr[i]['extra-properties']['extra-property'][2]['property-value'])

+							&& (obj['extra-properties']['extra-property'][4]['property-value'] == arr[i]['extra-properties']['extra-property'][4]['property-value'])){

+						filtered = true;

+					}

+				}

+			}

+			return filtered;

+		}

+		var wholeData=[];

+		$scope.filterDataWithHigerVersion = function(serviceData){

+			var fiterDataServices = [];

+			for(var i=0;i<serviceData.length;i++){

+				var higherVersion = serviceData[i];

+				if(!$scope.isFiltered(fiterDataServices,serviceData[i])){

+					for(var j=i;j<serviceData.length;j++){

+						if(serviceData[i]['extra-properties']['extra-property'] && serviceData[j]['extra-properties']['extra-property'] && (serviceData[i]['extra-properties']['extra-property'][4]['property-value'] == serviceData[j]['extra-properties']['extra-property'][4]['property-value'])

+								&& (serviceData[i]['extra-properties']['extra-property'][2]['property-value'] == serviceData[j]['extra-properties']['extra-property'][2]['property-value'])

+								&& (parseFloat(serviceData[j]['extra-properties']['extra-property'][6]['property-value'])>=parseFloat(serviceData[i]['extra-properties']['extra-property'][6]['property-value']))){

+							var data = $scope.isThisHigher(fiterDataServices,serviceData[j]);

+							if(data.isHigher){

+								fiterDataServices[data.index] = serviceData[j];

+							}

+						}

+					}

+				}

+			}

+			return fiterDataServices;

+		}

+

+		$scope.isThisHigher = function(arr,obj){

+			var returnObj = {

+					isHigher:false,

+					index:0

+			};

+			if(arr.length>0){

+				var isNotMatched = true;

+				for(var i=0;i<arr.length;i++){

+					if(arr[i]['extra-properties']['extra-property'] && (arr[i]['extra-properties']['extra-property'][2]['property-value'] == obj['extra-properties']['extra-property'][2]['property-value'])

+							&& (arr[i]['extra-properties']['extra-property'][4]['property-value'] == obj['extra-properties']['extra-property'][4]['property-value'] )

+							&& (arr[i]['extra-properties']['extra-property'][6]['property-value'] < obj['extra-properties']['extra-property'][6]['property-value']) ){

+						isNotMatched = false;

+						returnObj = {

+								isHigher:true,

+								index:i

+						};

+					}

+				}

+				if(isNotMatched && !$scope.isFiltered(arr,obj)){

+					returnObj = {

+							isHigher:true,

+							index:arr.length

+					};

+				}

+			}else{

+				returnObj = {

+						isHigher:true,

+						index:0

+				}

+			}

+			return returnObj;

+		}

+

+		$scope.tableData=[];

+		var oldData=[];

+		$scope.loadPreviousVersionData=function(version,invariantUUID){

+			$scope.tableData =[];

+			oldData=[];

+			for(var i=0;i<wholeData.length;i++){

+				if(wholeData[i]['extra-properties']['extra-property'] && wholeData[i]['extra-properties']['extra-property'][4]['property-value'] == invariantUUID  && version!=wholeData[i]['extra-properties']['extra-property'][6]['property-value']){

+					oldData.push(wholeData[i]);

+				}

+			}

+			$scope.tableData = oldData;

+			$scope.createType = "Previous Version";

+			var broadcastType = "createTableComponent";

+			$scope.componentName = invariantUUID;

+			$scope.$broadcast(broadcastType, {

+			    componentId : COMPONENT.OLDVERSION,

+			    callbackFunction : function(response) {

+			    }

+			});

+		}

 		 $scope.cancelCreateSIType = function(){

 		 		

 				window.location.href = COMPONENT.SERVICE_MODLES_INSTANCES_SUBSCRIBERS_PATH;

 				

 			}

 

-	$scope.fetchServices = function() { 

-		var serviceIdList = [];

+        $scope.fetchServices = function () {

+            var serviceIdList = [];

 

-		AaiService.getServices2(function(response) { // success

-			DataService.setServiceIdList(response);

-		},  function(response) { // failure

-			$scope.showError(FIELD.ERROR.AAI);

-			$scope.errorMsg = FIELD.ERROR.FETCHING_SERVICES + response.status;

-			$scope.errorDetails = response.data;

-		});

-	}

+            AaiService.getServices2(function (response) { // success

+                DataService.setServiceIdList(response);

+            }, function (response) { // failure

+                $scope.showError(FIELD.ERROR.AAI);

+                $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICES + response.status;

+                $scope.errorDetails = response.data;

+            });

+        }

 

-	$scope.refreshSubs = function() {

-		$scope.init();

-		$scope.fetchSubs(FIELD.PROMPT.REFRESH_SUB_LIST);

-		$scope.fetchServices();

-	};

+        $scope.refreshSubs = function () {

+            $scope.init();

+            $scope.fetchSubs(FIELD.PROMPT.REFRESH_SUB_LIST);

+            $scope.fetchServices();

+        };

 

-	$scope.fetchSubs = function(status) {

-		$scope.status = status;

+        $scope.fetchSubs = function (status) {

+            $scope.status = status;

 

-		AaiService.getSubList(function(response) { // sucesss

-			$scope.setProgress(100); // done

-			$scope.status = FIELD.STATUS.DONE;

-			$scope.isSpinnerVisible = false;

-			$scope.customerList = response;

-		},  function(response) { // failure

-			$scope.showError(FIELD.ERROR.AAI);

-			$scope.errorMsg = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.status;

-			$scope.errorDetails = response.data;

-		});

-	}

+            AaiService.getSubList(function (response) { // sucesss

+                $scope.setProgress(100); // done

+                $scope.status = FIELD.STATUS.DONE;

+                $scope.isSpinnerVisible = false;

+                $scope.customerList = response;

+            }, function (response) { // failure

+                $scope.showError(FIELD.ERROR.AAI);

+                $scope.errorMsg = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.status;

+                $scope.errorDetails = response.data;

+            });

+        }

+

+        $scope.getPermitted = function (item) {

+            return item.isPermitted || item[FIELD.ID.IS_PERMITTED];

+

+        }

 

 

-	$scope.getSubDetails = function(request) {

+        $scope.getSubDetails = function (request) {

 

-		$scope.init();

-		$scope.selectedSubscriber = $location.search().selectedSubscriber;

-		$scope.selectedServiceInstance = $location.search().selectedServiceInstance;

-		$scope.status = FIELD.STATUS.FETCHING_SUB_DETAILS + $scope.selectedSubscriber;

+            $scope.init();

+            $scope.selectedSubscriber = $location.search().selectedSubscriber;

+            $scope.selectedServiceInstance = $location.search().selectedServiceInstance;

+            $scope.status = FIELD.STATUS.FETCHING_SUB_DETAILS + $scope.selectedSubscriber;

 

-		$scope.displayData = [];

-		AaiService.getSubDetails($scope.selectedSubscriber, $scope.selectedServiceInstance, function(displayData, subscriberName) {

-			$scope.displayData = displayData;

-			$scope.viewPerPage=10;

-			$scope.totalPage=$scope.displayData.length/$scope.viewPerPage;

-			$scope.scrollViewPerPage=2;

-			$scope.currentPage=1;

-			$scope.searchCategory;

-			$scope.searchString="";

-			$scope.currentPageNum=1;

-			$scope.defaultSort=COMPONENT.SUBSCRIBER_NAME;

-				$scope.setProgress(100); // done

-			$scope.status = FIELD.STATUS.DONE;

-			$scope.isSpinnerVisible = false;

-			$scope.subscriberName = subscriberName;

-		}, function(response) { 

-			$scope.showError(FIELD.ERROR.AAI);

-			$scope.errorMsg = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.status;

-			$scope.errorDetails = response.data;

-		});

-	}

+            $scope.displayData = [];

+            AaiService.getSubDetails($scope.selectedSubscriber, $scope.selectedServiceInstance, function (displayData, subscriberName) {

+                $scope.displayData = displayData;

+                $scope.viewPerPage = 10;

+                $scope.totalPage = $scope.displayData.length / $scope.viewPerPage;

+                $scope.scrollViewPerPage = 2;

+                $scope.currentPage = 1;

+                $scope.searchCategory;

+                $scope.searchString = "";

+                $scope.currentPageNum = 1;

+                $scope.defaultSort = COMPONENT.SUBSCRIBER_NAME;

+                $scope.setProgress(100); // done

+                $scope.status = FIELD.STATUS.DONE;

+                $scope.isSpinnerVisible = false;

+                $scope.subscriberName = subscriberName;

+            }, function (response) {

+                $scope.showError(FIELD.ERROR.AAI);

+                $scope.errorMsg = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.status;

+                $scope.errorDetails = response.data;

+            });

+        }

 

 

-	$scope.$on(COMPONENT.MSO_DELETE_REQ, function(event, request) {

-		// $log.debug("deleteInstance: request:");

-		// $log.debug(request);

-		$scope.init();

+        $scope.$on(COMPONENT.MSO_DELETE_REQ, function (event, request) {

+            // $log.debug("deleteInstance: request:");

+            // $log.debug(request);

+            $scope.init();

 

-		$http.post($scope.baseUrl + request.url, {

-			requestDetails: request.requestDetails

-		},{

-			timeout: $scope.responseTimeoutMsec

-		}).then($scope.handleInitialResponse)

-		["catch"]($scope.handleServerError);

-	});

+            $http.post($scope.baseUrl + request.url, {

+                requestDetails: request.requestDetails

+            }, {

+                timeout: $scope.responseTimeoutMsec

+            }).then($scope.handleInitialResponse)

+                ["catch"]($scope.handleServerError);

+        });

 

-	$scope.init = function() {

+        $scope.init = function () {

 

-		//PropertyService.setAaiBaseUrl("testaai");

-		//PropertyService.setAsdcBaseUrl("testasdc");

+            //PropertyService.setAaiBaseUrl("testaai");

+            //PropertyService.setAsdcBaseUrl("testasdc");

 

-		// 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 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);

+            // takes a default value, retrieves the prop value from the file system and sets it

+            var polls = PropertyService.retrieveMsoMaxPolls();

+            PropertyService.setMsoMaxPolls(polls);

 

-		//PropertyService.setMsoBaseUrl("testmso");

-		PropertyService.setServerResponseTimeoutMsec();

+            //PropertyService.setMsoBaseUrl("testmso");

+            PropertyService.setServerResponseTimeoutMsec();

 

-		/*

-		 * Common parameters that would typically be set when the page is

-		 * displayed for a specific service instance id.

-		 */

+            /*

+             * Common parameters that would typically be set when the page is

+             * displayed for a specific service instance id.

+             */

 

-		$scope.baseUrl = $scope.defaultBaseUrl;

+            $scope.baseUrl = $scope.defaultBaseUrl;

 

-		$scope.isSpinnerVisible = true;

-		$scope.isProgressVisible = true;

-		$scope.isPopupVisible = true;

-		$scope.requestId = "";

-		$scope.error = "";

-		$scope.pollAttempts = 0;

-		$scope.log = "";				

-		$scope.enableCloseButton(false);

-		$scope.resetProgress();

-		$scope.setProgress(2); // Show "a little" progress

-	}

+            $scope.isSpinnerVisible = true;

+            $scope.isProgressVisible = true;

+            $scope.isPopupVisible = true;

+            $scope.requestId = "";

+            $scope.error = "";

+            $scope.pollAttempts = 0;

+            $scope.log = "";

+            $scope.enableCloseButton(false);

+            $scope.resetProgress();

+            $scope.setProgress(2); // Show "a little" progress

+        }

 

-	$scope.getComponentList = function(event, request) {

+        $scope.getComponentList = function (event, request) {

 

-		$scope.isSpinnerVisible = true;

-		$scope.isProgressVisible = true;

-		$scope.isPopupVisible = true;

-		$scope.requestId = "";

-		$scope.error = "";

-		$scope.pollAttempts = 0;

-		$scope.log = "";				

+            $scope.isSpinnerVisible = true;

+            $scope.isProgressVisible = true;

+            $scope.isPopupVisible = true;

+            $scope.requestId = "";

+            $scope.error = "";

+            $scope.pollAttempts = 0;

+            $scope.log = "";

 

-		$scope.resetProgress();

-		$scope.setProgress(2); // Show "a little" progress

+            $scope.resetProgress();

+            $scope.setProgress(2); // Show "a little" progress

 

-		$scope.globalCustomerId = $location.search().subscriberId;

-		$scope.serviceType = $location.search().serviceType;

-		$scope.serviceInstanceId = $location.search().serviceInstanceId;

-		$scope.subscriberName = $location.search().subscriberName;

+            $scope.globalCustomerId = $location.search().subscriberId;

+            $scope.serviceType = $location.search().serviceType;

+            $scope.serviceInstanceId = $location.search().serviceInstanceId;

+            $scope.subscriberName = $location.search().subscriberName;

 

-		//$scope.getAsdcModel($location.search().modelUuid);

+            //$scope.getAsdcModel($location.search().modelUuid);

 

-		$scope.namedQueryId = VIDCONFIGURATION.COMPONENT_LIST_NAMED_QUERY_ID;

-		$scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;

+            $scope.namedQueryId = VIDCONFIGURATION.COMPONENT_LIST_NAMED_QUERY_ID;

+            $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;

 

-		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;

-		}

-		);

+            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.handleServerError = function(response, status) {				

-		alert(response.statusText);

-	}

-	

-	$scope.getAsdcModel = function(disData) {

+        $scope.handleServerError = function (response, status) {

+            alert(response.statusText);

+        }

 

-		console.log ("disData"); console.log (JSON.stringify (disData, null, 4));

-		

-		if ( !(UtilityService.hasContents (disData.aaiModelVersionId)) ) {

-			$scope.errorMsg = FIELD.ERROR.MODEL_VERSION_ID_MISSING;

-			alert($scope.errorMsg);

-			return;

-		}

-		

-		// aaiModelVersionId is the model uuid

-		var pathQuery = COMPONENT.SERVICES_PATH + disData.aaiModelVersionId;

-		$http({

-			  method: 'GET',

-			  url: pathQuery

-			}).then(function successCallback(response) {

-				vidService.setModel(response.data);

-				window.location.href = COMPONENT.INSTANTIATE_ROOT_PATH + disData.globalCustomerId + COMPONENT.SUBSCRIBERNAME_SUB_PATH + disData.subscriberName + COMPONENT.SERVICETYPE_SUB_PATH + disData.serviceType + COMPONENT.SERVICEINSTANCEID_SUB_PATH + disData.serviceInstanceId;

-				console.log("aaiSubscriber getAsdcModel DONE!!!!");

-			  }, function errorCallback(response) {

-				  console.log("aaiSubscriber getAsdcModel - No matching model found matching the A&AI model version ID = " + disData.aaiModelVersionId);

-					$scope.errorMsg = FIELD.ERROR.NO_MATCHING_MODEL_AAI + disData.aaiModelVersionId;

-					alert($scope.errorMsg);

-			  });

+        $scope.getAsdcModel = function (disData) {

 

-	}

+            console.log("disData");

+            console.log(JSON.stringify(disData, null, 4));

 

-	$scope.getTenants = function(globalCustomerId) {

-		$http.get(FIELD.ID.AAI_GET_TENTANTS + globalCustomerId)

-		.then(function successCallback(response) {

-			return response.data;

-			//$location.path("/instantiate");

-		}, function errorCallback(response) {

-			//TODO

-		});

-	}

+            // if ( !(UtilityService.hasContents (disData.aaiModelVersionId)) ) {

+            // 	$scope.errorMsg = FIELD.ERROR.MODEL_VERSION_ID_MISSING;

+            // 	alert($scope.errorMsg);

+            // 	return;

+            // }

 

-	$scope.handleInitialResponseInventoryItems = function(response) {

+            // aaiModelVersionId is the model uuid

+            var pathQuery = COMPONENT.SERVICES_PATH + disData.aaiModelVersionId;

+            $http({

+                method: 'GET',

+                url: pathQuery

+            }).then(function successCallback(response) {

+                vidService.setModel(response.data);

+                window.location.href =

+                    COMPONENT.INSTANTIATE_ROOT_PATH + disData.globalCustomerId +

+                    COMPONENT.SUBSCRIBERNAME_SUB_PATH + disData.subscriberName +

+                    COMPONENT.SERVICETYPE_SUB_PATH + disData.serviceType +

+                    COMPONENT.SERVICEINSTANCEID_SUB_PATH + disData.serviceInstanceId +

+                    COMPONENT.IS_PERMITTED_SUB_PATH + disData.isPermitted;

+                console.log("aaiSubscriber getAsdcModel DONE!!!!");

+            }, function errorCallback(response) {

+                console.log("aaiSubscriber getAsdcModel - No matching model found matching the A&AI model version ID = " + disData.aaiModelVersionId);

+                $scope.errorMsg = FIELD.ERROR.NO_MATCHING_MODEL_AAI + disData.aaiModelVersionId;

+                alert($scope.errorMsg);

+            });

 

-		$scope.inventoryResponseItemList = response.data[FIELD.ID.INVENTORY_RESPONSE_ITEM]; // get data from json

-		console.log($scope.inventoryResponseItemList.toString());

+        }

 

-		$scope.displayData = [];

-		$scope.vnfs = [];

+        $scope.getTenants = function (globalCustomerId) {

+            $http.get(FIELD.ID.AAI_GET_TENTANTS + globalCustomerId)

+                .then(function successCallback(response) {

+                    return response.data;

+                    //$location.path("/instantiate");

+                }, function errorCallback(response) {

+                    //TODO

+                });

+        }

 

-		$scope.counter = 100;

+        $scope.handleInitialResponseInventoryItems = function (response) {

 

-		$scope.subscriberName = "";

-		// just look up the subscriber name in A&AI here...

-		AaiService.getSubscriberName($scope.globalCustomerId, function(response) {

-			$scope.subscriberName = response;

-			DataService.setSubscriberName($scope.subscriberName);

+            $scope.inventoryResponseItemList = response.data[FIELD.ID.INVENTORY_RESPONSE_ITEM]; // get data from json

+            console.log($scope.inventoryResponseItemList.toString());

 

-			angular.forEach($scope.inventoryResponseItemList, function(inventoryResponseItem, key) {

+            $scope.displayData = [];

+            $scope.vnfs = [];

 

-				$scope.inventoryResponseItem = inventoryResponseItem;

+            $scope.counter = 100;

 

-				$scope.service.instance = {

-						"name": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE][FIELD.ID.SERVICE_INSTANCE_NAME],

-						"serviceInstanceId": $scope.serviceInstanceId,

-						"serviceType": $scope.serviceType,

-						"globalCustomerId": $scope.globalCustomerId,

-						"subscriberName": $scope.subscriberName,

-						"id": $scope.serviceInstanceId,

-						"inputs": {

-							"a": {

-								"type": PARAMETER.STRING,

-								"description": FIELD.PROMPT.VAR_DESCRIPTION_A,

-								"default": FIELD.PROMPT.DEFAULT_A

-							},

-							"b": {

-								"type": PARAMETER.STRING,

-								"description": FIELD.PROMPT.VAR_DESCRIPTION_B,

-								"default": FIELD.PROMPT.DEFAULT_B

-							},

-						},

-						"object": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE],

-						"vnfs": [],

-						"networks": []

-				}

+            $scope.subscriberName = "";

+            // just look up the subscriber name in A&AI here...

+            AaiService.getSubscriberName($scope.globalCustomerId, function (response) {

+                $scope.subscriberName = response;

+                DataService.setSubscriberName($scope.subscriberName);

 

-				if (inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {

+                angular.forEach($scope.inventoryResponseItemList, function (inventoryResponseItem, key) {

 

-					angular.forEach(inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function(subInventoryResponseItem, key) {

-						// i expect to find vnfs now

+                    $scope.inventoryResponseItem = inventoryResponseItem;

 

-						if (subInventoryResponseItem[FIELD.ID.L3_NETWORK] != null) { 

-							var l3NetworkObject = subInventoryResponseItem[FIELD.ID.L3_NETWORK];

-							var l3Network = { "id": $scope.counter++, 

-									"name": l3NetworkObject[FIELD.ID.NETWORK_NAME],

-									"itemType": FIELD.ID.L3_NETWORK,

-									"nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID],

-									"nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE],

-									"nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],

-									"object": l3NetworkObject,

-									"nodes": [],

-									"subnets": []

-							};

-							if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {

-								//console.log ("subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS]=");

-								//console.log (JSON.stringify (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS], null, 4 ));

-								angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function(subSubInventoryResponseItem, key) {

-									//console.log (JSON.stringify (subSubInventoryResponseItem, null, 4 ));

-									var subnet = {};

-									var subnetObject;

-									if (subSubInventoryResponseItem[FIELD.ID.SUB_NET] != null) {

-										subnetObject = subSubInventoryResponseItem[FIELD.ID.SUB_NET];

-										subnet = {

-												"subnet-id": subnetObject[FIELD.ID.SUBNET_ID],

-												"subnet-name": subnetObject[FIELD.ID.SUBNET_NAME],

-												"gateway-address": subnetObject[FIELD.ID.GATEWAY_ADDRESS],

-												"network-start-address": subnetObject[FIELD.ID.NETWORK_START_ADDRESS],

-												"cidr-mask": subnetObject[FIELD.ID.CIDR_MASK]

-										};

-										l3Network.subnets.push(subnet);

-									}

-								});

-							}

-							$scope.service.instance[FIELD.ID.NETWORKS].push(l3Network);

-						}

+                    $scope.service.instance = {

+                        "name": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE][FIELD.ID.SERVICE_INSTANCE_NAME],

+                        "serviceInstanceId": $scope.serviceInstanceId,

+                        "serviceType": $scope.serviceType,

+                        "globalCustomerId": $scope.globalCustomerId,

+                        "subscriberName": $scope.subscriberName,

+                        "id": $scope.serviceInstanceId,

+                        "inputs": {

+                            "a": {

+                                "type": PARAMETER.STRING,

+                                "description": FIELD.PROMPT.VAR_DESCRIPTION_A,

+                                "default": FIELD.PROMPT.DEFAULT_A

+                            },

+                            "b": {

+                                "type": PARAMETER.STRING,

+                                "description": FIELD.PROMPT.VAR_DESCRIPTION_B,

+                                "default": FIELD.PROMPT.DEFAULT_B

+                            },

+                        },

+                        "object": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE],

+                        "vnfs": [],

+                        "networks": []

+                    }

 

-						if (subInventoryResponseItem[FIELD.ID.GENERIC_VNF] != null) {

-							var genericVnfObject = subInventoryResponseItem[FIELD.ID.GENERIC_VNF];

+                    if (inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {

 

-							var genericVnf = {

-									"name": genericVnfObject[FIELD.ID.VNF_NAME],

-									"id": $scope.counter++, 

-									"itemType": COMPONENT.VNF, 

-									"nodeType": genericVnfObject[FIELD.ID.VNF_TYPE],

-									"nodeId": genericVnfObject[FIELD.ID.VNF_ID],

-									"nodeStatus": genericVnfObject[FIELD.ID.ORCHESTRATION_STATUS],

-									"object": genericVnfObject,

-									"vfModules": [],

-									"volumeGroups": [],

-									"availableVolumeGroups": []

-							};

-							$scope.service.instance[FIELD.ID.VNFS].push(genericVnf);

+                        angular.forEach(inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subInventoryResponseItem, key) {

+                            // i expect to find vnfs now

 

-							// look for volume-groups

-							if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {

-								angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function(vfmodules, key) {

+                            if (subInventoryResponseItem[FIELD.ID.L3_NETWORK] != null) {

+                                var l3NetworkObject = subInventoryResponseItem[FIELD.ID.L3_NETWORK];

+                                var l3Network = {

+                                    "id": $scope.counter++,

+                                    "name": l3NetworkObject[FIELD.ID.NETWORK_NAME],

+                                    "itemType": FIELD.ID.L3_NETWORK,

+                                    "nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID],

+                                    "nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE],

+                                    "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],

+                                    "object": l3NetworkObject,

+                                    "nodes": [],

+                                    "subnets": []

+                                };

+                                if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {

+                                    //console.log ("subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS]=");

+                                    //console.log (JSON.stringify (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS], null, 4 ));

+                                    angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subSubInventoryResponseItem, key) {

+                                        //console.log (JSON.stringify (subSubInventoryResponseItem, null, 4 ));

+                                        var subnet = {};

+                                        var subnetObject;

+                                        if (subSubInventoryResponseItem[FIELD.ID.SUB_NET] != null) {

+                                            subnetObject = subSubInventoryResponseItem[FIELD.ID.SUB_NET];

+                                            subnet = {

+                                                "subnet-id": subnetObject[FIELD.ID.SUBNET_ID],

+                                                "subnet-name": subnetObject[FIELD.ID.SUBNET_NAME],

+                                                "gateway-address": subnetObject[FIELD.ID.GATEWAY_ADDRESS],

+                                                "network-start-address": subnetObject[FIELD.ID.NETWORK_START_ADDRESS],

+                                                "cidr-mask": subnetObject[FIELD.ID.CIDR_MASK]

+                                            };

+                                            l3Network.subnets.push(subnet);

+                                        }

+                                    });

+                                }

+                                $scope.service.instance[FIELD.ID.NETWORKS].push(l3Network);

+                            }

 

-									if (vfmodules[FIELD.ID.VOLUME_GROUP] != null) { 

-										var volumeGroupObject = vfmodules[FIELD.ID.VOLUME_GROUP];

-										var volumeGroup = { "id": $scope.counter++, 

-												"name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME],

-												"itemType": FIELD.ID.VOLUME_GROUP,

-												"nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID],

-												"nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE],

-												"nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS],

-												"object": volumeGroupObject,

-												"nodes": []

-										};

-										genericVnf[FIELD.ID.VOLUMEGROUPS].push(volumeGroup);

-										genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS].push(volumeGroup);

-									}

-								});

-							}

-							// now we've loaded up the availableVolumeGroups, we can use it

-							if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {

-								angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function(vfmodules, key) {

+                            if (subInventoryResponseItem[FIELD.ID.GENERIC_VNF] != null) {

+                                var genericVnfObject = subInventoryResponseItem[FIELD.ID.GENERIC_VNF];

 

-									if (vfmodules[FIELD.ID.VF_MODULE] != null) { 

-										var vfModuleObject = vfmodules[FIELD.ID.VF_MODULE];

-										var vfModule = { "id": $scope.counter++,

-												"name": vfModuleObject[FIELD.ID.VF_MODULE_NAME],

-												"itemType": FIELD.ID.VF_MODULE,

-												"nodeType": FIELD.ID.VF_MODULE, 

-												"nodeStatus": vfModuleObject[FIELD.ID.ORCHESTRATION_STATUS],

-												"volumeGroups": [],

-												"object": vfModuleObject,

-												"networks": []

-										};

-										genericVnf[FIELD.ID.VF_MODULES].push(vfModule);

-										if (vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {

-											angular.forEach(vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function(networks, key) {

-												if (networks[FIELD.ID.L3_NETWORK] != null) { 

-													var l3NetworkObject = networks[FIELD.ID.L3_NETWORK];

-													var l3Network = { "id": $scope.counter++, 

-															"name": l3NetworkObject[FIELD.ID.NETWORK_NAME],

-															"itemType": FIELD.ID.L3_NETWORK,

-															"nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID],

-															"nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE],

-															"nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],

-															"object": l3NetworkObject,

-															"nodes": []

-													};

-													vfModule[FIELD.ID.NETWORKS].push(l3Network);

-												}

-												if (networks[FIELD.ID.VOLUME_GROUP] != null) { 

-													var volumeGroupObject = networks[FIELD.ID.VOLUME_GROUP];

+                                var genericVnf = {

+                                    "name": genericVnfObject[FIELD.ID.VNF_NAME],

+                                    "id": $scope.counter++,

+                                    "itemType": COMPONENT.VNF,

+                                    "nodeType": genericVnfObject[FIELD.ID.VNF_TYPE],

+                                    "nodeId": genericVnfObject[FIELD.ID.VNF_ID],

+                                    "nodeStatus": genericVnfObject[FIELD.ID.ORCHESTRATION_STATUS],

+                                    "object": genericVnfObject,

+                                    "vfModules": [],

+                                    "volumeGroups": [],

+                                    "availableVolumeGroups": []

+                                };

+                                $scope.service.instance[FIELD.ID.VNFS].push(genericVnf);

 

-													var volumeGroup = { "id": $scope.counter++, 

-															"name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME],

-															"itemType": FIELD.ID.VOLUME_GROUP,

-															"nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID],

-															"nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE],

-															"nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS],

-															"object": volumeGroupObject,

-															"nodes": []

-													};

-													var tmpVolGroup = [];

+                                // look for volume-groups

+                                if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {

+                                    angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (vfmodules, key) {

 

-													angular.forEach(genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS], function(avgroup, key) {

-														if (avgroup.name != volumeGroup.name) { 

-															tmpVolGroup.push(avgroup);

-														}

-													});

+                                        if (vfmodules[FIELD.ID.VOLUME_GROUP] != null) {

+                                            var volumeGroupObject = vfmodules[FIELD.ID.VOLUME_GROUP];

+                                            var volumeGroup = {

+                                                "id": $scope.counter++,

+                                                "name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME],

+                                                "itemType": FIELD.ID.VOLUME_GROUP,

+                                                "nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID],

+                                                "nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE],

+                                                "nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS],

+                                                "object": volumeGroupObject,

+                                                "nodes": []

+                                            };

+                                            genericVnf[FIELD.ID.VOLUMEGROUPS].push(volumeGroup);

+                                            genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS].push(volumeGroup);

+                                        }

+                                    });

+                                }

+                                // now we've loaded up the availableVolumeGroups, we can use it

+                                if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {

+                                    angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (vfmodules, key) {

 

-													genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS] = tmpVolGroup;

+                                        if (vfmodules[FIELD.ID.VF_MODULE] != null) {

+                                            var vfModuleObject = vfmodules[FIELD.ID.VF_MODULE];

+                                            var vfModule = {

+                                                "id": $scope.counter++,

+                                                "name": vfModuleObject[FIELD.ID.VF_MODULE_NAME],

+                                                "itemType": FIELD.ID.VF_MODULE,

+                                                "nodeType": FIELD.ID.VF_MODULE,

+                                                "nodeStatus": vfModuleObject[FIELD.ID.ORCHESTRATION_STATUS],

+                                                "volumeGroups": [],

+                                                "object": vfModuleObject,

+                                                "networks": []

+                                            };

+                                            genericVnf[FIELD.ID.VF_MODULES].push(vfModule);

+                                            if (vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {

+                                                angular.forEach(vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (networks, key) {

+                                                    if (networks[FIELD.ID.L3_NETWORK] != null) {

+                                                        var l3NetworkObject = networks[FIELD.ID.L3_NETWORK];

+                                                        var l3Network = {

+                                                            "id": $scope.counter++,

+                                                            "name": l3NetworkObject[FIELD.ID.NETWORK_NAME],

+                                                            "itemType": FIELD.ID.L3_NETWORK,

+                                                            "nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID],

+                                                            "nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE],

+                                                            "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],

+                                                            "object": l3NetworkObject,

+                                                            "nodes": []

+                                                        };

+                                                        vfModule[FIELD.ID.NETWORKS].push(l3Network);

+                                                    }

+                                                    if (networks[FIELD.ID.VOLUME_GROUP] != null) {

+                                                        var volumeGroupObject = networks[FIELD.ID.VOLUME_GROUP];

 

-													vfModule[FIELD.ID.VOLUMEGROUPS].push(volumeGroup);

-												}

+                                                        var volumeGroup = {

+                                                            "id": $scope.counter++,

+                                                            "name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME],

+                                                            "itemType": FIELD.ID.VOLUME_GROUP,

+                                                            "nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID],

+                                                            "nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE],

+                                                            "nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS],

+                                                            "object": volumeGroupObject,

+                                                            "nodes": []

+                                                        };

+                                                        var tmpVolGroup = [];

 

-											});

-										}

-									}

-								});

-							}

-						}

-					});

-				}

-			});

-		});

-	}

+                                                        angular.forEach(genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS], function (avgroup, key) {

+                                                            if (avgroup.name != volumeGroup.name) {

+                                                                tmpVolGroup.push(avgroup);

+                                                            }

+                                                        });

 

-	$scope.handleInitialResponse = function(response) {

-		try {

-			$scope.enableCloseButton(true);

-			$scope.updateLog(response);

-			if (response.data.status < 200 || response.data.status > 202) {

-				$scope.showError(FIELD.ERROR.MSO);

-				$scope.status = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.data.status;

+                                                        genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS] = tmpVolGroup;

 

-				return;

-			}

+                                                        vfModule[FIELD.ID.VOLUMEGROUPS].push(volumeGroup);

+                                                    }

 

-			$scope.setProgress(100); // done

-			$scope.status = FIELD.STATUS.DONE;

-			$scope.isSpinnerVisible = false;

+                                                });

+                                            }

+                                        }

+                                    });

+                                }

+                            }

+                        });

+                    }

+                });

+            });

+        }

 

-			$scope.customer = response.data.customer; // get data from json

+        $scope.handleInitialResponse = function (response) {

+            try {

+                $scope.enableCloseButton(true);

+                $scope.updateLog(response);

+                if (response.data.status < 200 || response.data.status > 202) {

+                    $scope.showError(FIELD.ERROR.MSO);

+                    $scope.status = FIELD.ERROR.AAI_FETCHING_CUST_DATA + response.data.status;

 

-			$scope.customerList = [];

+                    return;

+                }

 

-			angular.forEach($scope.customer, function(subVal, subKey) {

-				var cust = { "globalCustomerId": subVal[FIELD.ID.GLOBAL_CUSTOMER_ID], "subscriberName": subVal[FIELD.ID.SUBNAME] };

-				$scope.customerList.push(cust);

-			});	

+                $scope.setProgress(100); // done

+                $scope.status = FIELD.STATUS.DONE;

+                $scope.isSpinnerVisible = false;

 

-		} catch (error) {

-			$scope.showContentError(error);

-		}

-	}

+                $scope.customer = response.data.customer; // get data from json

 

-	$scope.autoGetSubs = function() {

-		/*

-		 * Optionally comment in / out one of these method calls (or add a similar

-		 * entry) to auto-invoke an entry when the test screen is redrawn.

-		 */

-		$scope.getSubs();

+                $scope.customerList = [];

 

-	}

+                angular.forEach($scope.customer, function (subVal, subKey) {

+                    var cust = {

+                        "globalCustomerId": subVal[FIELD.ID.GLOBAL_CUSTOMER_ID],

+                        "subscriberName": subVal[FIELD.ID.SUBNAME],

+                        "isPermitted": subVal[FIELD.ID.IS_PERMITTED]

+                    };

 

-	$scope.updateLog = function(response) {

+                    $scope.customerList.push(cust);

+                });

+

+            } catch (error) {

+                $scope.showContentError(error);

+            }

+        }

+

+        $scope.autoGetSubs = function () {

+            /*

+             * Optionally comment in / out one of these method calls (or add a similar

+             * entry) to auto-invoke an entry when the test screen is redrawn.

+             */

+            $scope.getSubs();

+

+        }

+

+        $scope.updateLog = function (response) {

 //		$scope.log = UtilityService.getCurrentTime() + " HTTP Status: " + 

 //		UtilityService.getHttpStatusText(response.data.status) + "\n" +

 //		angular.toJson(response.data.entity, true) + "\n\n" + $scope.log;

 //		UtilityService.checkUndefined("entity", response.data.entity);

 //		UtilityService.checkUndefined("status", response.data.status);				

-	}

+        }

 

-	$scope.handleServerError = function(response, status) {				

-		$scope.enableCloseButton(true);

-		var message = UtilityService.getHttpErrorMessage(response);

-		if (message != ""){

-			message = " (" + message + ")";

-		}

-		$scope.showError(FIELD.ERROR.SYSTEM_ERROR + message);

-	}

+        $scope.handleServerError = function (response, status) {

+            $scope.enableCloseButton(true);

+            var message = UtilityService.getHttpErrorMessage(response);

+            if (message != "") {

+                message = " (" + message + ")";

+            }

+            $scope.showError(FIELD.ERROR.SYSTEM_ERROR + message);

+        }

 

-	$scope.showContentError = function(message) {

-		// $log.debug(message);

-		console.log(message);

-		if (UtilityService.hasContents(message)) {

-			$scope.showError("System failure (" + message + ")");

-		} else {

-			$scope.showError(FIELD.ERROR.SYSTEM_ERROR);

-		}

-	}

+        $scope.showContentError = function (message) {

+            // $log.debug(message);

+            console.log(message);

+            if (UtilityService.hasContents(message)) {

+                $scope.showError("System failure (" + message + ")");

+            } else {

+                $scope.showError(FIELD.ERROR.SYSTEM_ERROR);

+            }

+        }

 

-	$scope.showError = function(message) {

-		$scope.isSpinnerVisible = false;

-		$scope.isProgressVisible = false;

-		$scope.error = message;

-		$scope.status = FIELD.STATUS.ERROR;

-	}

+        $scope.showError = function (message) {

+            $scope.isSpinnerVisible = false;

+            $scope.isProgressVisible = false;

+            $scope.error = message;

+            $scope.status = FIELD.STATUS.ERROR;

+        }

 

-	$scope.close = function() {

-		if ($scope.timer != undefined) {

-			$timeout.cancel($scope.timer);					

-		}

-		$scope.isPopupVisible = false;

-	}

+        $scope.close = function () {

+            if ($scope.timer != undefined) {

+                $timeout.cancel($scope.timer);

+            }

+            $scope.isPopupVisible = false;

+        }

 

 

+        /*

+         * Consider converting the progress bar mechanism, the disabled button handling

+         * and the following methods to generic Angular directive(s) and/or approach.

+         */

 

-	/*

-	 * Consider converting the progress bar mechanism, the disabled button handling

-	 * and the following methods to generic Angular directive(s) and/or approach.

-	 */

+        $scope.enableCloseButton = function (isEnabled) {

+            var selector = FIELD.STYLE.MSO_CTRL_BTN;

 

-	$scope.enableCloseButton = function(isEnabled) {

-		var selector = FIELD.STYLE.MSO_CTRL_BTN;

+            $scope.isCloseEnabled = isEnabled;

 

-		$scope.isCloseEnabled = isEnabled;

+            if (isEnabled) {

+                $(selector).addClass(FIELD.STYLE.BTN_PRIMARY).removeClass(FIELD.STYLE.BTN_INACTIVE).attr(FIELD.STYLE.BTN_TYPE, FIELD.STYLE.PRIMARY);

+            } else {

+                $(selector).removeClass(FIELD.STYLE.BTN_PRIMARY).addClass(FIELD.STYLE.BTN_INACTIVE).attr(FIELD.STYLE.BTN_TYPE, FIELD.STYLE.DISABLED);

+            }

+        }

 

-		if (isEnabled) {

-			$(selector).addClass(FIELD.STYLE.BTN_PRIMARY).removeClass(FIELD.STYLE.BTN_INACTIVE).attr(FIELD.STYLE.BTN_TYPE, FIELD.STYLE.PRIMARY);

-		} else {

-			$(selector).removeClass(FIELD.STYLE.BTN_PRIMARY).addClass(FIELD.STYLE.BTN_INACTIVE).attr(FIELD.STYLE.BTN_TYPE, FIELD.STYLE.DISABLED);					

-		}

-	}

+        $scope.resetProgress = function () {

+            $scope.percentProgress = 0;

+            $scope.progressClass = FIELD.STYLE.PROGRESS_BAR_INFO;

+        }

 

-	$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;

+            }

 

-	$scope.setProgress = function(percentProgress) {

-		percentProgress = parseInt(percentProgress);

-		if (percentProgress >= 100) {

-			$scope.progressClass = FIELD.STYLE.PROGRESS_BAR_SUCCESS;					

-		}

+            if (percentProgress < $scope.percentProgress) {

+                return;

+            }

 

-		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.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.reloadRoute = function () {

+            $route.reload();

+        }

 

-	$scope.reloadRoute = function() {

-		$route.reload();

-	}

+        $scope.prevPage = function () {

+            $scope.currentPage--;

+        }

 

-	$scope.prevPage = function() {

-		$scope.currentPage--;

-	}

+        $scope.nextPage = function () {

+            $scope.currentPage++;

+        }

+        $scope.serviceInstanceses = [{"sinstance": FIELD.NAME.SERVICE_INSTANCE_Id}, {"sinstance": FIELD.NAME.SERVICE_INSTANCE_NAME}]

+        $scope.getSubscriberDet = function (selectedCustomer, selectedserviceinstancetype, selectedServiceInstance) {

 

-	$scope.nextPage = function() {

-		$scope.currentPage++;

-	}

-	$scope.serviceInstanceses = [{"sinstance":FIELD.NAME.SERVICE_INSTANCE_Id},{"sinstance":FIELD.NAME.SERVICE_INSTANCE_NAME}]

-	$scope.getSubscriberDet = function(selectedCustomer,selectedserviceinstancetype,selectedServiceInstance){

-		

-		var sintype =selectedserviceinstancetype;

-		if (selectedServiceInstance != "" && selectedServiceInstance != undefined) {

-			selectedServiceInstance.trim();

+            var sintype = selectedserviceinstancetype;

+            if (selectedServiceInstance != "" && selectedServiceInstance != undefined) {

+                selectedServiceInstance.trim();

 

-			// check with A&AI

-			$http.get(COMPONENT.AAI_GET_SERVICE_INSTANCE_PATH  + selectedServiceInstance+"/"+sintype + "?r=" + Math.random(), {

+                // check with A&AI

+                $http.get(COMPONENT.AAI_GET_SERVICE_INSTANCE_PATH + selectedServiceInstance + "/" + sintype + "?r=" + Math.random(), {}, {

+                    timeout: $scope.responseTimeoutMsec

+                }).then(function (response) {

+                    var notFound = true;

+                    if (angular.isArray(response.data[FIELD.ID.RESULT_DATA])) {

+                        var item = [];

+                        var urlParts = [];

+                        item = response.data[FIELD.ID.RESULT_DATA][0];

+                        var url = item[FIELD.ID.RESOURCE_LINK];

+                        var globalCustomerId = "";

+                        var serviceSubscription = "";

+                        // split it and find the customer Id and service-subscription

+                        urlParts = url.split("/");

+                        if (urlParts[7] === FIELD.ID.CUSTOMER) {

+                            globalCustomerId = urlParts[8];

+                        }

+                        if (urlParts[10] === FIELD.ID.SERVICE_SUBSCRIPTION) {

+                            serviceSubscription = urlParts[11];

+                        }

 

-			},{

-				timeout: $scope.responseTimeoutMsec

-			}).then(function(response) {

-				var notFound = true;

-				if (angular.isArray(response.data[FIELD.ID.RESULT_DATA])) {

-					var item = [];

-					var urlParts = [];

-					item = response.data[FIELD.ID.RESULT_DATA][0];

-					var url = item[FIELD.ID.RESOURCE_LINK];

-					var globalCustomerId = "";

-					var serviceSubscription = "";

-					// split it and find the customer Id and service-subscription

-					urlParts = url.split("/");

-					if (urlParts[7] === FIELD.ID.CUSTOMER) { 

-						globalCustomerId = urlParts[8];

-					}

-					if (urlParts[10] === FIELD.ID.SERVICE_SUBSCRIPTION) { 

-						serviceSubscription = urlParts[11];

-					}

+                        if (globalCustomerId !== "") {

+                            notFound = false;

+                            window.location.href = COMPONENT.SELECTED_SERVICE_SUB_PATH + serviceSubscription + COMPONENT.SELECTEDSUBSCRIBER_SUB_PATH + globalCustomerId + COMPONENT.SELECTEDSERVICEINSTANCE_SUB_PATH + selectedServiceInstance;

+                        }

+                    }

+                    if (notFound) {

+                        alert(FIELD.ERROR.SERVICE_INST_DNE);

+                    }

+                }); // add a failure callback...

+            } else if (selectedCustomer != null) {

+                window.location.href = COMPONENT.SELECTED_SUB_PATH + selectedCustomer;

+            } else {

+                alert(FIELD.ERROR.SELECT);

+            }

+        };

+    }]).directive('restrictInput', function () {

 

-					if (globalCustomerId !== "") {

-						notFound = false;

-						window.location.href = COMPONENT.SELECTED_SERVICE_SUB_PATH + serviceSubscription + COMPONENT.SELECTEDSUBSCRIBER_SUB_PATH + globalCustomerId + COMPONENT.SELECTEDSERVICEINSTANCE_SUB_PATH + selectedServiceInstance;

-					}

-				}

-				if (notFound) {

-					alert(FIELD.ERROR.SERVICE_INST_DNE);

-				}

-			}); // add a failure callback...

-		} else if (selectedCustomer != null) { 

-			window.location.href = COMPONENT.SELECTED_SUB_PATH + selectedCustomer;

-		} else {

-			alert(FIELD.ERROR.SELECT);

-		}

-	};

-  }]).directive('restrictInput', function(){

-		

-		return {

-			

-			restrict: 'A',

-			require: 'ngModel',

-			link: function($scope, element, attr, ctrl){

-				ctrl.$parsers.unshift(function(viewValue){

-					

-					var types = $scope.$eval(attr.restrictInput);

-					if(!types.regex && types.type){

-						

-						switch(types.type){

-							case 'Service Instance Name' : types.regex = '^[a-zA-Z0-9-_]*$'; break;

-							default: types.regex= '';

-						}

-					}

-					var reg = new RegExp(types.regex);

-					if(reg.test(viewValue)){

-						return viewValue;

-					} else {

-						var overrideValue = (reg.test(viewValue) ? viewValue : '');

-						element.val(overrideValue);

-						return overrideValue;

-					}

-				});

-			}

-		};

+    return {

 

+        restrict: 'A',

+        require: 'ngModel',

+        link: function ($scope, element, attr, ctrl) {

+            ctrl.$parsers.unshift(function (viewValue) {

+

+                var types = $scope.$eval(attr.restrictInput);

+                if (!types.regex && types.type) {

+

+                    switch (types.type) {

+                        case 'Service Instance Name' :

+                            types.regex = '^[a-zA-Z0-9-_]*$';

+                            break;

+                        default:

+                            types.regex = '';

+                    }

+                }

+                var reg = new RegExp(types.regex);

+                if (reg.test(viewValue)) {

+                    return viewValue;

+                } else {

+                    var overrideValue = (reg.test(viewValue) ? viewValue : '');

+                    element.val(overrideValue);

+                    return overrideValue;

+                }

             });

+        }

+    };

+

+});

 appDS2.controller('TreeCtrl', ['$scope', function ($scope) {

-	$scope.remove = function (scope) {

-		scope.remove();

-	};

+    $scope.remove = function (scope) {

+        scope.remove();

+    };

 

-	$scope.toggle = function (scope) {

-		scope.toggle();

-	};

+    $scope.toggle = function (scope) {

+        scope.toggle();

+    };

 

-	$scope.moveLastToTheBeginning = function () {

-		var a = $scope.data.pop();

-		$scope.data.splice(0, 0, a);

-	};

+    $scope.moveLastToTheBeginning = function () {

+        var a = $scope.data.pop();

+        $scope.data.splice(0, 0, a);

+    };

 

-	$scope.newSubItem = function (scope) {

-		var nodeData = scope.$modelValue;

-		nodeData.nodes.push({

-			id: nodeData.id * 10 + nodeData.nodes.length,

-			title: nodeData.title + '.' + (nodeData.nodes.length + 1),

-			nodes: []

-		});

-	};

+    $scope.newSubItem = function (scope) {

+        var nodeData = scope.$modelValue;

+        nodeData.nodes.push({

+            id: nodeData.id * 10 + nodeData.nodes.length,

+            title: nodeData.title + '.' + (nodeData.nodes.length + 1),

+            nodes: []

+        });

+    };

 

-	$scope.collapseAll = function () {

-		$scope.$broadcast(FIELD.ID.ANGULAR_UI_TREE_COLLAPSEALL);

-	};

+    $scope.collapseAll = function () {

+        $scope.$broadcast(FIELD.ID.ANGULAR_UI_TREE_COLLAPSEALL);

+    };

 

-	$scope.expandAll = function () {

-		$scope.$broadcast(FIELD.ID.ANGULAR_UI_TREE_EXPANDALL);

-	};

+    $scope.expandAll = function () {

+        $scope.$broadcast(FIELD.ID.ANGULAR_UI_TREE_EXPANDALL);

+    };

 

 

 }]);

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 b400cc6..3d8cba5 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
@@ -111,16 +111,21 @@
 		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;

-				break;

+			}

+			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){

+		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];

@@ -128,8 +133,7 @@
 			reader.onload = function(e) {

 				try{

 					paramList[uploadIndex].value = JSON.parse(reader.result);

-					FIELD.PARAMETER.SUPPLEMENTORY_DATA_FILE['value'] = JSON.stringify(paramList[uploadIndex].value);

-					$scope.userProvidedControl.updateList([ FIELD.PARAMETER.SUPPLEMENTORY_DATA_FILE ]);

+					FIELD.PARAMETER.SUPPLEMENTORY_DATA_FILE['value'] = paramList[uploadIndex].value;

 					

 					var instanceName = "";

 

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/deletionDialogController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/deletionDialogController.js
index 137673d..499a1ec 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/deletionDialogController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/deletionDialogController.js
@@ -80,6 +80,10 @@
 

 		

 	var requestDetails = DeletionService.getMsoRequestDetails($scope.userProvidedControl.getList());

+	

+	if(DeletionService.isMacro === true){

+		requestDetails.requestParameters.aLaCarte = false;

+	}

 

 	$scope.isDialogVisible = false;

 

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/previousVersionContoller.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/previousVersionContoller.js
new file mode 100644
index 0000000..eb0dac6
--- /dev/null
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/previousVersionContoller.js
@@ -0,0 +1,40 @@
+"use strict";
+
+var previousVersionContoller = function( COMPONENT, FIELD, $scope, $http, $timeout, $log,
+		CreationService, UtilityService, DataService,VIDCONFIGURATION) {
+	$scope.isTableDialogVisible = false;
+	$scope.summaryControl = {};
+	$scope.userProvidedControl = {};
+
+	var callbackFunction = undefined;
+	var componentId = undefined;
+
+	$scope.$on("createTableComponent", function(event, request) {
+
+		$scope.isTableSpinnerVisible = true; 
+		$scope.isTableErrorVisible = false;
+		$scope.isTableDialogVisible = true;
+		$scope.popup.isTablePopUpVisible = true;
+		componentId = request.componentId;
+		CreationService.initializeComponent(request.componentId);
+		callbackFunction = request.callbackFunction;
+		CreationService.setHttpErrorHandler(function(response) {
+			showError("System failure", UtilityService
+					.getHttpErrorMessage(response));
+		});
+		$scope.isTableSpinnerVisible = false;
+	});
+	
+	
+	$scope.cancelTable = function(){
+		$scope.isTableDialogVisible = false;
+		$scope.popup.isTablePopUpVisible = false;
+	}
+	
+	
+}
+
+app
+		.controller("previousVersionContoller", [ "COMPONENT", "FIELD", "$scope", "$http",
+				"$timeout", "$log", "CreationService", "UtilityService", "DataService","VIDCONFIGURATION",
+				previousVersionContoller ]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/previousVersionDialogController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/previousVersionDialogController.js
new file mode 100644
index 0000000..d11f432
--- /dev/null
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/previousVersionDialogController.js
@@ -0,0 +1,40 @@
+"use strict";
+
+var previousVersionDialogController = function( COMPONENT, FIELD, $scope, $http, $timeout, $log,
+		CreationService, UtilityService, DataService,VIDCONFIGURATION) {
+	$scope.isTableDialogVisible = false;
+	$scope.summaryControl = {};
+	$scope.userProvidedControl = {};
+
+	var callbackFunction = undefined;
+	var componentId = undefined;
+
+	$scope.$on("createTableComponent", function(event, request) {
+
+		$scope.isTableSpinnerVisible = true; 
+		$scope.isTableErrorVisible = false;
+		$scope.isTableDialogVisible = true;
+		$scope.popup.isTablePopUpVisible = true;
+		componentId = request.componentId;
+		CreationService.initializeComponent(request.componentId);
+		callbackFunction = request.callbackFunction;
+		CreationService.setHttpErrorHandler(function(response) {
+			showError("System failure", UtilityService
+					.getHttpErrorMessage(response));
+		});
+		$scope.isTableSpinnerVisible = false;
+	});
+	
+	
+	$scope.cancelTable = function(){
+		$scope.isTableDialogVisible = false;
+		$scope.popup.isTablePopUpVisible = false;
+	}
+	
+	
+}
+
+app
+		.controller("previousVersionDialogController", [ "COMPONENT", "FIELD", "$scope", "$http",
+				"$timeout", "$log", "CreationService", "UtilityService", "DataService","VIDCONFIGURATION",
+				previousVersionDialogController ]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/statusDialogController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/statusDialogController.js
index de15666..0d067ff 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/statusDialogController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/statusDialogController.js
@@ -130,7 +130,7 @@
 		var polls = PropertyService.retrieveMsoMaxPolls();

 		PropertyService.setMsoMaxPolls(polls);

 		

-		PropertyService.setServerResponseTimeoutMsec(10000)

+		PropertyService.setServerResponseTimeoutMsec(30000);

 

 		$scope.isSpinnerVisible = true;

 	

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/subscriberSearch.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/subscriberSearch.js
index 06cbf05..029860f 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/subscriberSearch.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/subscriberSearch.js
@@ -64,7 +64,7 @@
     		var polls = PropertyService.retrieveMsoMaxPolls();

     		PropertyService.setMsoMaxPolls(polls);

     		

-    		PropertyService.setServerResponseTimeoutMsec(10000);

+    		PropertyService.setServerResponseTimeoutMsec(30000);

 

 			// These two properties only added for testing	

 			properties.msoDefaultBaseUrl = $scope.baseUrl;

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/directives/parameterBlockDirective.js b/vid-app-common/src/main/webapp/app/vid/scripts/directives/parameterBlockDirective.js
index 69a0ae5..e57b43e 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/directives/parameterBlockDirective.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/directives/parameterBlockDirective.js
@@ -49,355 +49,377 @@
     var checkboxInputStyle = "height: 18px; width: 18px; padding: 2px 5px;";

     var selectStyle = "height: 25px; padding: 2px; text-align: center;";

     var requiredLabelStyle = "width: 25px; padding: 5px 10px 10px 5px;";

-    

+

 

     var getParameterHtml = function(parameter, editable) {

-	var style = valueStyle;

-	var attributeString = "";

-	if (parameter.type === PARAMETER.BOOLEAN) {

-	    style = checkboxValueStyle;

-	}

-	if (UtilityService.hasContents(parameter.description)) {

-	    attributeString += " title=' " + parameter.description + " '";

-	}

-	var rowstyle='';

-	if(parameter.type == 'file' && !parameter.isVisiblity){

-		rowstyle = ' style="display:none;"';

-	}

-	var html = "<tr"+rowstyle+"><td style='" + nameStyle + "'" + attributeString + ">"

-		+ getNameHtml(parameter) + "</td><td style='" + style + "'>";

-	if (editable === undefined) {

-	    if (UtilityService.hasContents(parameter.value)) {

-		html += parameter.value;

-	    }

-	} else {

-	    html += getValueHtml(parameter);

-	}

-	html += "</td></tr>";

-	return html;

+        var style = valueStyle;

+        var attributeString = "";

+        if (parameter.type === PARAMETER.BOOLEAN) {

+            style = checkboxValueStyle;

+        }

+        if (UtilityService.hasContents(parameter.description)) {

+            attributeString += " title=' " + parameter.description + " '";

+        }

+        var rowstyle='';

+        if(parameter.type == 'file' && !parameter.isVisiblity){

+            rowstyle = ' style="display:none;"';

+        }

+        var html = "<tr"+rowstyle+"><td style='" + nameStyle + "'" + attributeString + ">"

+            + getNameHtml(parameter) + "</td>";

+        if (editable === undefined) {

+            if (UtilityService.hasContents(parameter.value)) {

+                html += "<td data-tests-id='" +  getParameterName(parameter) + "' style='" + style + "'>" + parameter.value;

+            } else {

+                html += "<td data-tests-id='" +  getParameterName(parameter) + "' style='" + style + "'>";

+            }

+        } else {

+            html += "<td style='" + style + "'>" + getValueHtml(parameter);

+        }

+        html += "</td></tr>";

+        return html;

     };

 

     var updateParameter = function(parameter, element, editable) {

-	$(element).parent().parent().children("td").first().html(

-		getNameHtml(parameter));

-	if (editable === undefined) {

-	    $(element).html(parameter.value);

-	} else {

-	    $(element).parent().html(getValueHtml(parameter));

-	}

+        $(element).parent().parent().children("td").first().html(

+            getNameHtml(parameter));

+        if (editable === undefined) {

+            $(element).html(parameter.value);

+        } else {

+            $(element).parent().html(getValueHtml(parameter));

+        }

     };

 

     var getNameHtml = function(parameter) {

-	if (parameter.isVisible === false) {

-	    return "";

-	}

-	var name = "";

-	if (UtilityService.hasContents(parameter.name)) {

-	    name = parameter.name;

-	} else {

-	    name = parameter.id;

-	}

-	var requiredLabel = "";

-	if (parameter.isRequired) {

-	    requiredLabel = "<img src='app/vid/images/asterisk.png' style='"

-		    + requiredLabelStyle + "'></img>";

-	}

-	return name + ":" + requiredLabel;

+        if (parameter.isVisible === false) {

+            return "";

+        }

+        var name = getParameterName(parameter);

+

+        var requiredLabel = "";

+        if (parameter.isRequired) {

+            requiredLabel = "<img src='app/vid/images/asterisk.png' style='"

+                + requiredLabelStyle + "'></img>";

+        }

+        return name + ":" + requiredLabel;

     };

 

+    var getParameterName = function(parameter) {

+        var name = "";

+        if (UtilityService.hasContents(parameter.name)) {

+            name = parameter.name;

+        } else {

+            name = parameter.id;

+        }

+        return name;

+    }

+

     var getValueHtml = function(parameter) {

-    	

-    var textInputPrompt = "Enter data";

-	var attributeString = " parameter-id='" + parameter.id + "'";

-	var additionalStyle = "";

-	if (parameter.isEnabled === false) {

-	    attributeString += " disabled='disabled'";

-	}

-	if (parameter.isRequired) {

-		attributeString += " is-required='true'";

-	}

-	if (UtilityService.hasContents(parameter.description)) {

-	    attributeString += " title=' " + parameter.description + " '";

-	}

-	if (UtilityService.hasContents(parameter.isReadOnly) && (parameter.isReadOnly === true)) {

-		attributeString += " readonly";

-	}

-	if ( (UtilityService.hasContents(parameter.maxLength)) && (UtilityService.hasContents(parameter.minLength)) ) {

-		attributeString += " pattern='.{" + parameter.minLength + "," + parameter.maxLength + "}' required";

-	}

-	else if (UtilityService.hasContents(parameter.maxLength)) {

-		attributeString += " maxlength='" + parameter.maxLength + "'";

-	}

-	else if (UtilityService.hasContents(parameter.minLength)) {

-		attributeString += " pattern='.{" + parameter.minLength + ",}'"

-	}

-	if (parameter.isVisible === false) {

-	    additionalStyle = " visibility: hidden;";

-	}

-	

-	var name = "";

-	if (UtilityService.hasContents(parameter.name)) {

-	    name = parameter.name;

-	} else {

-	    name = parameter.id;

-	}

-	attributeString += " parameter-name='" + name + "'";

-	

-	if ( parameter.type === PARAMETER.MAP ) {

-		textInputPrompt = "{<key1>: <value1>,\.\.\.,<keyN>: <valueN>}";

-	}

-	

-	if ( parameter.type === PARAMETER.LIST ) {

-		textInputPrompt = "[<value1>,\.\.\.,<valueN>]";

-	}

 

-	switch (parameter.type) {

-	case PARAMETER.BOOLEAN:

-		if (parameter.value) {

-			return "<select" + attributeString + " style='" + selectStyle

-			+ additionalStyle + "'>" + "<option value=true>true</option>"

-			+ "<option value=false>false</option>";

-			+ "</select>";

-		}else{

-			return "<select" + attributeString + " style='" + selectStyle

-			+ additionalStyle + "'>" + "<option value=false>false</option>"

-			+ "<option value=true>true</option>"

-			+ "</select>";

-		}

-	    break;

-	case PARAMETER.CHECKBOX:

-		if (parameter.value) {

-			return "<input type='checkbox' "+attributeString+ " checked='checked' style='"+checkboxInputStyle+"'" 

-			+ " value='true'/>";

-		}else{

-			return "<input type='checkbox' "+attributeString+ "' style='"+checkboxInputStyle+"'" 

-			+ " value='false'/>";

-		}

-	    break;

-	case PARAMETER.FILE:

-			return "<input type='file' "+attributeString+ " id='"+parameter.id+"' value='"+parameter.value+"'/>";

-	    break;

-	case PARAMETER.NUMBER:

-		var value=parameter.value;

-		var parameterSpec = "<input type='number'" + attributeString + " style='" + textInputStyle + additionalStyle + "'";

-		

-		if ( UtilityService.hasContents(parameter.min) ) {

-			parameterSpec += " min='" + parameter.min + "'";

-		}

-		if ( UtilityService.hasContents(parameter.max) ) {

-			parameterSpec += " max='" + parameter.max + "'";

-		}

-		if (UtilityService.hasContents(value)) {

-		parameterSpec += " value='" + value + "'";

-		}

-		parameterSpec += ">";

-		

-		/*if(!isNaN(value) && value.toString().index('.') != -1){

-			//float

-			 return "<input type='text'" + attributeString + " style='"

-			    + textInputStyle + additionalStyle + "' only-integers" + value

-			    + "></input>";

-		} else {

-			//integer

-			 return "<input type='text'" + attributeString + " style='"

-			    + textInputStyle + additionalStyle + "'  only-float" + value

-			    + "></input>";

-		}*/

-		return (parameterSpec);

-	    break;

-	case PARAMETER.SELECT:

-	    if (UtilityService.hasContents(parameter.prompt)) {

-		attributeString += " prompt='" + parameter.prompt + "'";

-	    }

-	    return "<select" + attributeString + " style='" + selectStyle

-		    + additionalStyle + "'>" + getOptionListHtml(parameter)

-		    + "</select>";

-	    break;

-	case PARAMETER.STRING:

-	default:

-	    var value = "";

-	    if (UtilityService.hasContents(parameter.value)) {

-		value = " value='" + parameter.value + "'";

-	    }

-	    if (UtilityService.hasContents(parameter.prompt)) {

-		attributeString += " placeholder='" + parameter.prompt + "'";

-	    } else if (textInputPrompt !== "") {

-		attributeString += " placeholder='" + textInputPrompt + "'";

-	    }

-	    var finalString = "<input type='text'" + attributeString + " style='"

-	    + textInputStyle + additionalStyle + "'" + value

-	    + ">";

-	    return finalString;

-	}

+        var textInputPrompt = "Enter data";

+        var attributeString = " data-tests-id='" + parameter.id +"' parameter-id='" + parameter.id + "'";

+        var additionalStyle = "";

+        if (parameter.isEnabled === false) {

+            attributeString += " disabled='disabled'";

+        }

+        if (parameter.isRequired) {

+            attributeString += " is-required='true'";

+        }

+        if (UtilityService.hasContents(parameter.description)) {

+            attributeString += " title=' " + parameter.description + " '";

+        }

+        if (UtilityService.hasContents(parameter.isReadOnly) && (parameter.isReadOnly === true)) {

+            attributeString += " readonly";

+        }

+        if ( (UtilityService.hasContents(parameter.maxLength)) && (UtilityService.hasContents(parameter.minLength)) ) {

+            attributeString += " pattern='.{" + parameter.minLength + "," + parameter.maxLength + "}' required";

+        }

+        else if (UtilityService.hasContents(parameter.maxLength)) {

+            attributeString += " maxlength='" + parameter.maxLength + "'";

+        }

+        else if (UtilityService.hasContents(parameter.minLength)) {

+            attributeString += " pattern='.{" + parameter.minLength + ",}'"

+        }

+        if (parameter.isVisible === false) {

+            additionalStyle = " visibility: hidden;";

+        }

+

+        var name = "";

+        if (UtilityService.hasContents(parameter.name)) {

+            name = parameter.name;

+        } else {

+            name = parameter.id;

+        }

+        attributeString += " parameter-name='" + name + "'";

+

+        if ( parameter.type === PARAMETER.MAP ) {

+            textInputPrompt = "{<key1>: <value1>,\.\.\.,<keyN>: <valueN>}";

+        }

+

+        if ( parameter.type === PARAMETER.LIST ) {

+            textInputPrompt = "[<value1>,\.\.\.,<valueN>]";

+        }

+

+        switch (parameter.type) {

+            case PARAMETER.BOOLEAN:

+                if (parameter.value) {

+                    return "<select" + attributeString + " style='" + selectStyle

+                        + additionalStyle + "'>" + "<option value=true>true</option>"

+                        + "<option value=false>false</option>";

+                    + "</select>";

+                }else{

+                    return "<select" + attributeString + " style='" + selectStyle

+                        + additionalStyle + "'>" + "<option value=false>false</option>"

+                        + "<option value=true>true</option>"

+                        + "</select>";

+                }

+                break;

+            case PARAMETER.CHECKBOX:

+                if (parameter.value) {

+                    return "<input type='checkbox' "+attributeString+ " checked='checked' style='"+checkboxInputStyle+"'"

+                        + " value='true'/>";

+                }else{

+                    return "<input type='checkbox' "+attributeString+ "' style='"+checkboxInputStyle+"'"

+                        + " value='false'/>";

+                }

+                break;

+            case PARAMETER.FILE:

+                return "<input type='file' "+attributeString+ " id='"+parameter.id+"' value='"+parameter.value+"'/>";

+                break;

+            case PARAMETER.NUMBER:

+                var value=parameter.value;

+                var parameterSpec = "<input type='number'" + attributeString + " style='" + textInputStyle + additionalStyle + "'";

+

+                if ( UtilityService.hasContents(parameter.min) ) {

+                    parameterSpec += " min='" + parameter.min + "'";

+                }

+                if ( UtilityService.hasContents(parameter.max) ) {

+                    parameterSpec += " max='" + parameter.max + "'";

+                }

+                if (UtilityService.hasContents(value)) {

+                    parameterSpec += " value='" + value + "'";

+                }

+                parameterSpec += ">";

+

+                /*if(!isNaN(value) && value.toString().index('.') != -1){

+                 //float

+                 return "<input type='text'" + attributeString + " style='"

+                 + textInputStyle + additionalStyle + "' only-integers" + value

+                 + "></input>";

+                 } else {

+                 //integer

+                 return "<input type='text'" + attributeString + " style='"

+                 + textInputStyle + additionalStyle + "'  only-float" + value

+                 + "></input>";

+                 }*/

+                return (parameterSpec);

+                break;

+            case PARAMETER.SELECT:

+                if (UtilityService.hasContents(parameter.prompt)) {

+                    attributeString += " prompt='" + parameter.prompt + "'";

+                }

+                return "<select" + attributeString + " style='" + selectStyle

+                    + additionalStyle + "'>" + getOptionListHtml(parameter)

+                    + "</select>";

+                break;

+            case PARAMETER.STRING:

+            default:

+                var value = "";

+                if (UtilityService.hasContents(parameter.value)) {

+                    value = " value='" + parameter.value + "'";

+                }

+                if (UtilityService.hasContents(parameter.prompt)) {

+                    attributeString += " placeholder='" + parameter.prompt + "'";

+                } else if (textInputPrompt !== "") {

+                    attributeString += " placeholder='" + textInputPrompt + "'";

+                }

+                var finalString = "<input type='text'" + attributeString + " style='"

+                    + textInputStyle + additionalStyle + "'" + value

+                    + ">";

+                return finalString;

+        }

     };

-    

-    

+

+

     var getBooleanListHtml = function(parameter){

-    	var html = "";

-    	

+        var html = "";

+

     };

 

     var getOptionListHtml = function(parameter) {

 

-	var html = "";

+        var html = "";

 

-	if (!angular.isArray(parameter.optionList)

-		|| parameter.optionList.length === 0) {

-	    return "";

-	}

+        if (!angular.isArray(parameter.optionList)

+            || parameter.optionList.length === 0) {

+            return "";

+        }

 

-	if (UtilityService.hasContents(parameter.prompt)) {

+        if (UtilityService.hasContents(parameter.prompt)) {

 	    if (!(IS_SINGLE_OPTION_AUTO_SELECTED && parameter.optionList.length === 1) || !(parameter.isSingleOptionAutoSelected && parameter.optionList.length === 1)) {

-		html += "<option value=''>" + parameter.prompt + "</option>";

-	    }

-	}

+                html += "<option value=''>" + parameter.prompt + "</option>";

+            }

+        }

 

-	for (var i = 0; i < parameter.optionList.length; i++) {

-	    var option = parameter.optionList[i];

-	    var name = option.name;

-	    var value = "";

-	    if (option.id === undefined) {

-		value = option.name;

-	    } else {

-		if (name === undefined) {

-		    name = option.id;

-		}

-		value = option.id;

-	    }

-	    if (option.isDefault === undefined || option.isDefault === false )  {

-	    	html += "<option value='" + value + "'>" + name + "</option>";

-	    }

-	    else {

-	    	html += "<option value='" + value + "' selected>" + name + "</option>";

-	    }

-	}

-	return html;

+        for (var i = 0; i < parameter.optionList.length; i++) {

+            var option = parameter.optionList[i];

+            var name = option.name;

+            var value = "";

+            if (option.id === undefined) {

+                value = option.name;

+            } else {

+                if (name === undefined) {

+                    name = option.id;

+                }

+                value = option.id;

+            }

+            html += getOptionHtml(option.isPermitted, option.isDataLoading, value, name, parameter);

+        }

+        return html;

     };

 

-    var getParameter = function(element, expectedId) {

-	var id = $(element).attr("parameter-id");

-	if (expectedId !== undefined && expectedId !== id) {

-	    return undefined;

-	}

-	var parameter = {

-	    id : id

-	};

-	if ($(element).prop("type") === "checkbox") {

-	    parameter.value = $(element).prop("checked");

-	}else if ($(element).prop("type") === "file") {

-	    parameter.value = $('#'+id).attr("value");

+    function getOptionHtml(isPermitted, isDefault, value, name, parameter) {

+        var html = "";

+        if (isDefault === undefined || isDefault === false )  {

+            if(isPermitted)

+                html = "<option class='" + parameter.id + "Option' value='" + value + "'>" + name + "</option>";

+            else {

+                html = "<option class='" + parameter.id + "Option' value='" + value + "' disabled>" + name + "</option>";

+            }

+        }

+        else {

+            if(isPermitted)

+                html = "<option class='" + parameter.id + "Option' value='" + value + "'>" + "' selected>"  + name + "</option>";

+            else {

+                html = "<option class='" + parameter.id + "Option' value='" + value + "' disabled>" + "' selected>"  + name + "</option>";

+            }

+        }

+        return html;

+    }

 

-	} else {

-	    if ($(element).prop("type") === "text") {

-		$(element).val($(element).val().trim());

-	    }

-	    parameter.value = $(element).val();

-	}

-	if ($(element).prop("selectedIndex") === undefined) {

-	    parameter.selectedIndex = -1;

-	} else {

-	    parameter.selectedIndex = $(element).prop("selectedIndex");

-	    if (UtilityService.hasContents($(element).attr("prompt"))) {

-		parameter.selectedIndex--;

-	    }

-	}

-	return parameter;

+    var getParameter = function(element, expectedId) {

+        var id = $(element).attr("parameter-id");

+        if (expectedId !== undefined && expectedId !== id) {

+            return undefined;

+        }

+        var parameter = {

+            id : id

+        };

+        if ($(element).prop("type") === "checkbox") {

+            parameter.value = $(element).prop("checked");

+        }else if ($(element).prop("type") === "file") {

+            parameter.value = $('#'+id).attr("value");

+

+        } else {

+            if ($(element).prop("type") === "text") {

+                $(element).val($(element).val().trim());

+            }

+            parameter.value = $(element).val();

+        }

+        if ($(element).prop("selectedIndex") === undefined) {

+            parameter.selectedIndex = -1;

+        } else {

+            parameter.selectedIndex = $(element).prop("selectedIndex");

+            if (UtilityService.hasContents($(element).attr("prompt"))) {

+                parameter.selectedIndex--;

+            }

+        }

+        return parameter;

     };

 

     var getRequiredField = function(element) {

-	if ($(element).prop("type") === "text") {

-	    $(element).val($(element).val().trim());

-	}

-	if ($(element).val() === "" || $(element).val() === null) {

-	    return '"' + $(element).attr("parameter-name") + '"';

-	} else {

-	    return "";

-	}

+        if ($(element).prop("type") === "text") {

+            $(element).val($(element).val().trim());

+        }

+        if ($(element).val() === "" || $(element).val() === null) {

+            return '"' + $(element).attr("parameter-name") + '"';

+        } else {

+            return "";

+        }

     };

 

     var callback = function(element, scope) {

-	scope.callback({

-	    id : $(element).attr("parameter-id")

-	});

+        scope.callback({

+            id : $(element).attr("parameter-id")

+        });

     };

 

     return {

-	restrict : "EA",

-	replace  : true,

-	template : "<div><table style='" + tableStyle + "'></table></div>",

-	scope : {

-	    control : "=",

-	    callback : "&"

-	},

-	link : function(scope, element, attrs) {

-		

-	    var control = scope.control || {};

+        restrict : "EA",

+        replace  : true,

+        template : "<div><table style='" + tableStyle + "'></table></div>",

+        scope : {

+            control : "=",

+            callback : "&"

+        },

+        link : function(scope, element, attrs) {

 

-	    control.setList = function(parameterList) {

-		var html = "";

-		for (var i = 0; i < parameterList.length; i++) {

-		    html += getParameterHtml(parameterList[i], attrs.editable);

-		}

-		element.html(html);

-		element.find("input, select").bind("change", function() {

-		    callback(this, scope);

-		});

-	    }

+            var control = scope.control || {};

 

-	    control.updateList = function(parameterList) {

-		element.find("input, select").each(

-			function() {

-			    for (var i = 0; i < parameterList.length; i++) {

-				if (parameterList[i].id === $(this).attr(

-					"parameter-id")) {

-				    updateParameter(parameterList[i], this,

-					    attrs.editable);

-				}

-			    }

-			});

-		element.find("input, select").bind("change", function() {

-		    callback(this, scope);

-		});

-	    }

+            control.setList = function(parameterList) {

+                var html = "";

+                for (var i = 0; i < parameterList.length; i++) {

+                    html += getParameterHtml(parameterList[i], attrs.editable);

+                }

+                element.html(html);

+                element.find("input, select").bind("change", function() {

+                    callback(this, scope);

+                });

+            }

 

-	    control.getList = function(expectedId) {

-		var parameterList = new Array();

-		element.find("input, select").each(function() {

-		    var parameter = getParameter(this, expectedId);

-		    if (parameter !== undefined) {

-			parameterList.push(parameter);

-		    }

-		});

-		return parameterList;

-	    }

+            control.updateList = function(parameterList) {

+                element.find("input, select").each(

+                    function() {

+                        for (var i = 0; i < parameterList.length; i++) {

+                            if (parameterList[i].id === $(this).attr(

+                                    "parameter-id")) {

+                                updateParameter(parameterList[i], this,

+                                    attrs.editable);

+                            }

+                        }

+                    });

+                element.find("input, select").bind("change", function() {

+                    callback(this, scope);

+                });

+            }

 

-	    control.getRequiredFields = function() {

-		var requiredFields = "";

-		var count = 0;

-		element.find("input, select").each(function() {

-			if ($(this).attr("is-required") === "true") {

-			var requiredField = getRequiredField(this);

-			if (requiredField !== "") {

-			    if (++count == 1) {

-				requiredFields = requiredField;

-			    }

-			}

-			}

-		});

-		if (--count <= 0) {

-		    return requiredFields;

-		} else if (count == 1) {

-		    return requiredFields + " and 1 other field";

-		} else {

-		    return requiredFields + " and " + count + " other fields";

-		}

-	    }

-    }

+            control.getList = function(expectedId) {

+                var parameterList = new Array();

+                element.find("input, select").each(function() {

+                    var parameter = getParameter(this, expectedId);

+                    if (parameter !== undefined) {

+                        parameterList.push(parameter);

+                    }

+                });

+                return parameterList;

+            }

+

+            control.getRequiredFields = function() {

+                var requiredFields = "";

+                var count = 0;

+                element.find("input, select").each(function() {

+                    if ($(this).attr("is-required") === "true") {

+                        var requiredField = getRequiredField(this);

+                        if (requiredField !== "") {

+                            if (++count == 1) {

+                                requiredFields = requiredField;

+                            }

+                        }

+                    }

+                });

+                if (--count <= 0) {

+                    return requiredFields;

+                } else if (count == 1) {

+                    return requiredFields + " and 1 other field";

+                } else {

+                    return requiredFields + " and " + count + " other fields";

+                }

+            }

+        }

     }

 }

 

 appDS2.directive('parameterBlock', [ "$log", "PARAMETER", "UtilityService",

-	parameterBlockDirective ]);

+    parameterBlockDirective ]);

 

 

 appDS2.directive('onlyIntegers', function () {

@@ -416,7 +438,7 @@
                 } else if (event.which >= 96 && event.which <= 105) {

                     // numpad number

                     return true;

-                } 

+                }

                 // else if ([110, 190].indexOf(event.which) > -1) {

                 //     // dot and numpad dot

                 //     return true;

@@ -435,13 +457,13 @@
         restrict: 'A',

         link: function (scope, elm, attrs, ctrl) {

             elm.on('keydown', function (event) {

-              if ([110, 190].indexOf(event.which) > -1) {

+                if ([110, 190].indexOf(event.which) > -1) {

                     // dot and numpad dot

                     event.preventDefault();

                     return true;

                 }

                 else{

-                  return false;

+                    return false;

                 }

             });

         }

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/directives/parameterBlockDirective.js.orig b/vid-app-common/src/main/webapp/app/vid/scripts/directives/parameterBlockDirective.js.orig
new file mode 100644
index 0000000..0e93782
--- /dev/null
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/directives/parameterBlockDirective.js.orig
@@ -0,0 +1,507 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+"use strict";
+
+var parameterBlockDirective = function($log, PARAMETER, UtilityService) {
+    /*
+     * If "IS_SINGLE_OPTION_AUTO_SELECTED" is set to "true" ...
+     * 
+     * IF these 3 conditions all exist:
+     * 
+     * 1) The parameter type is PARAMETER.SELECT
+     * 
+     * 2) AND the "prompt" attribute is set to a string.
+     *
+     * 3) AND the optionList" only contains a single entry
+     * 
+     * THEN the "prompt" will not be displayed as an initial select option.
+     */
+
+    var IS_SINGLE_OPTION_AUTO_SELECTED = true;
+
+    /*
+     * Optionally remove "nameStyle" and "valueStyle" "width" entries to set
+     * dynamic sizing.
+     */
+    var tableStyle = "width: auto; margin: 0 auto; border-collapse: collapse; border: none;";
+    var nameStyle = "width: 220px; text-align: left; vertical-align: middle; font-weight: bold; padding: 3px 5px; border: none;";
+    var valueStyle = "width: 400px; text-align: left; vertical-align: middle; padding: 3px 5px; border: none;";
+    var checkboxValueStyle = "width: 400px; text-align: center; vertical-align: middle; padding: 3px 5px; border: none;"
+    var textInputStyle = "height: 25px; padding: 2px 5px;";
+    var checkboxInputStyle = "height: 18px; width: 18px; padding: 2px 5px;";
+    var selectStyle = "height: 25px; padding: 2px; text-align: center;";
+    var requiredLabelStyle = "width: 25px; padding: 5px 10px 10px 5px;";
+
+
+    var getParameterHtml = function(parameter, editable) {
+        var style = valueStyle;
+        var attributeString = "";
+        if (parameter.type === PARAMETER.BOOLEAN) {
+            style = checkboxValueStyle;
+        }
+        if (UtilityService.hasContents(parameter.description)) {
+            attributeString += " title=' " + parameter.description + " '";
+        }
+        var rowstyle='';
+        if(parameter.type == 'file' && !parameter.isVisiblity){
+            rowstyle = ' style="display:none;"';
+        }
+        var html = "<tr"+rowstyle+"><td style='" + nameStyle + "'" + attributeString + ">"
+            + getNameHtml(parameter) + "</td>";
+        if (editable === undefined) {
+            if (UtilityService.hasContents(parameter.value)) {
+                html += "<td data-tests-id='" +  getParameterName(parameter) + "' style='" + style + "'>" + parameter.value;
+            } else {
+                html += "<td data-tests-id='" +  getParameterName(parameter) + "' style='" + style + "'>";
+            }
+        } else {
+            html += "<td style='" + style + "'>" + getValueHtml(parameter);
+        }
+        html += "</td></tr>";
+        return html;
+    };
+
+    var updateParameter = function(parameter, element, editable) {
+        $(element).parent().parent().children("td").first().html(
+            getNameHtml(parameter));
+        if (editable === undefined) {
+            $(element).html(parameter.value);
+        } else {
+            $(element).parent().html(getValueHtml(parameter));
+        }
+    };
+
+    var getNameHtml = function(parameter) {
+        if (parameter.isVisible === false) {
+            return "";
+        }
+        var name = getParameterName(parameter);
+
+        var requiredLabel = "";
+        if (parameter.isRequired) {
+            requiredLabel = "<img src='app/vid/images/asterisk.png' style='"
+                + requiredLabelStyle + "'></img>";
+        }
+        return name + ":" + requiredLabel;
+    };
+
+    var getParameterName = function(parameter) {
+        var name = "";
+        if (UtilityService.hasContents(parameter.name)) {
+            name = parameter.name;
+        } else {
+            name = parameter.id;
+        }
+        return name;
+    }
+
+    var getValueHtml = function(parameter) {
+
+        var textInputPrompt = "Enter data";
+        var attributeString = " data-tests-id='" + parameter.id +"' parameter-id='" + parameter.id + "'";
+        var additionalStyle = "";
+        if (parameter.isEnabled === false) {
+            attributeString += " disabled='disabled'";
+        }
+        if (parameter.isRequired) {
+            attributeString += " is-required='true'";
+        }
+        if (UtilityService.hasContents(parameter.description)) {
+            attributeString += " title=' " + parameter.description + " '";
+        }
+        if (UtilityService.hasContents(parameter.isReadOnly) && (parameter.isReadOnly === true)) {
+            attributeString += " readonly";
+        }
+        if ( (UtilityService.hasContents(parameter.maxLength)) && (UtilityService.hasContents(parameter.minLength)) ) {
+            attributeString += " pattern='.{" + parameter.minLength + "," + parameter.maxLength + "}' required";
+        }
+        else if (UtilityService.hasContents(parameter.maxLength)) {
+            attributeString += " maxlength='" + parameter.maxLength + "'";
+        }
+        else if (UtilityService.hasContents(parameter.minLength)) {
+            attributeString += " pattern='.{" + parameter.minLength + ",}'"
+        }
+        if (parameter.isVisible === false) {
+            additionalStyle = " visibility: hidden;";
+        }
+
+        var name = "";
+        if (UtilityService.hasContents(parameter.name)) {
+            name = parameter.name;
+        } else {
+            name = parameter.id;
+        }
+        attributeString += " parameter-name='" + name + "'";
+
+        if ( parameter.type === PARAMETER.MAP ) {
+            textInputPrompt = "{<key1>: <value1>,\.\.\.,<keyN>: <valueN>}";
+        }
+
+        if ( parameter.type === PARAMETER.LIST ) {
+            textInputPrompt = "[<value1>,\.\.\.,<valueN>]";
+        }
+
+        switch (parameter.type) {
+            case PARAMETER.BOOLEAN:
+                if (parameter.value) {
+                    return "<select" + attributeString + " style='" + selectStyle
+                        + additionalStyle + "'>" + "<option value=true>true</option>"
+                        + "<option value=false>false</option>";
+                    + "</select>";
+                }else{
+                    return "<select" + attributeString + " style='" + selectStyle
+                        + additionalStyle + "'>" + "<option value=false>false</option>"
+                        + "<option value=true>true</option>"
+                        + "</select>";
+                }
+                break;
+            case PARAMETER.CHECKBOX:
+                if (parameter.value) {
+                    return "<input type='checkbox' "+attributeString+ " checked='checked' style='"+checkboxInputStyle+"'"
+                        + " value='true'/>";
+                }else{
+                    return "<input type='checkbox' "+attributeString+ "' style='"+checkboxInputStyle+"'"
+                        + " value='false'/>";
+                }
+                break;
+            case PARAMETER.FILE:
+                return "<input type='file' "+attributeString+ " id='"+parameter.id+"' value='"+parameter.value+"'/>";
+                break;
+            case PARAMETER.NUMBER:
+                var value=parameter.value;
+                var parameterSpec = "<input type='number'" + attributeString + " style='" + textInputStyle + additionalStyle + "'";
+
+                if ( UtilityService.hasContents(parameter.min) ) {
+                    parameterSpec += " min='" + parameter.min + "'";
+                }
+                if ( UtilityService.hasContents(parameter.max) ) {
+                    parameterSpec += " max='" + parameter.max + "'";
+                }
+                if (UtilityService.hasContents(value)) {
+                    parameterSpec += " value='" + value + "'";
+                }
+                parameterSpec += ">";
+
+                /*if(!isNaN(value) && value.toString().index('.') != -1){
+                 //float
+                 return "<input type='text'" + attributeString + " style='"
+                 + textInputStyle + additionalStyle + "' only-integers" + value
+                 + "></input>";
+                 } else {
+                 //integer
+                 return "<input type='text'" + attributeString + " style='"
+                 + textInputStyle + additionalStyle + "'  only-float" + value
+                 + "></input>";
+                 }*/
+                return (parameterSpec);
+                break;
+            case PARAMETER.SELECT:
+                if (UtilityService.hasContents(parameter.prompt)) {
+                    attributeString += " prompt='" + parameter.prompt + "'";
+                }
+                return "<select" + attributeString + " style='" + selectStyle
+                    + additionalStyle + "'>" + getOptionListHtml(parameter)
+                    + "</select>";
+                break;
+            case PARAMETER.STRING:
+            default:
+                var value = "";
+                if (UtilityService.hasContents(parameter.value)) {
+                    value = " value='" + parameter.value + "'";
+                }
+                if (UtilityService.hasContents(parameter.prompt)) {
+                    attributeString += " placeholder='" + parameter.prompt + "'";
+                } else if (textInputPrompt !== "") {
+                    attributeString += " placeholder='" + textInputPrompt + "'";
+                }
+                var finalString = "<input type='text'" + attributeString + " style='"
+                    + textInputStyle + additionalStyle + "'" + value
+                    + ">";
+                return finalString;
+        }
+    };
+
+
+    var getBooleanListHtml = function(parameter){
+        var html = "";
+
+    };
+
+    var getOptionListHtml = function(parameter) {
+
+<<<<<<< HEAD
+	var html = "";
+
+	if (!angular.isArray(parameter.optionList)
+		|| parameter.optionList.length === 0) {
+	    return "";
+	}
+
+	if (UtilityService.hasContents(parameter.prompt)) {
+	    if (!(IS_SINGLE_OPTION_AUTO_SELECTED && parameter.optionList.length === 1) || !(parameter.isSingleOptionAutoSelected && parameter.optionList.length === 1)) {
+		html += "<option value=''>" + parameter.prompt + "</option>";
+	    }
+	}
+
+	for (var i = 0; i < parameter.optionList.length; i++) {
+	    var option = parameter.optionList[i];
+	    var name = option.name;
+	    var value = "";
+	    if (option.id === undefined) {
+		value = option.name;
+	    } else {
+		if (name === undefined) {
+		    name = option.id;
+		}
+		value = option.id;
+	    }
+	    if (option.isDefault === undefined || option.isDefault === false )  {
+	    	html += "<option value='" + value + "'>" + name + "</option>";
+	    }
+	    else {
+	    	html += "<option value='" + value + "' selected>" + name + "</option>";
+	    }
+	}
+	return html;
+=======
+        var html = "";
+
+        if (!angular.isArray(parameter.optionList)
+            || parameter.optionList.length === 0) {
+            return "";
+        }
+
+        if (UtilityService.hasContents(parameter.prompt)) {
+            if (!(IS_SINGLE_OPTION_AUTO_SELECTED && parameter.optionList.length === 1)) {
+                html += "<option value=''>" + parameter.prompt + "</option>";
+            }
+        }
+
+        for (var i = 0; i < parameter.optionList.length; i++) {
+            var option = parameter.optionList[i];
+            var name = option.name;
+            var value = "";
+            if (option.id === undefined) {
+                value = option.name;
+            } else {
+                if (name === undefined) {
+                    name = option.id;
+                }
+                value = option.id;
+            }
+            html += getOptionHtml(option.isPermitted, option.isDataLoading, value, name, parameter);
+        }
+        return html;
+>>>>>>> 7e45cad... merge
+    };
+
+    function getOptionHtml(isPermitted, isDefault, value, name, parameter) {
+        var html = "";
+        if (isDefault === undefined || isDefault === false )  {
+            if(isPermitted)
+                html = "<option class='" + parameter.id + "Option' value='" + value + "'>" + name + "</option>";
+            else {
+                html = "<option class='" + parameter.id + "Option' value='" + value + "' disabled>" + name + "</option>";
+            }
+        }
+        else {
+            if(isPermitted)
+                html = "<option class='" + parameter.id + "Option' value='" + value + "'>" + "' selected>"  + name + "</option>";
+            else {
+                html = "<option class='" + parameter.id + "Option' value='" + value + "' disabled>" + "' selected>"  + name + "</option>";
+            }
+        }
+        return html;
+    }
+
+    var getParameter = function(element, expectedId) {
+        var id = $(element).attr("parameter-id");
+        if (expectedId !== undefined && expectedId !== id) {
+            return undefined;
+        }
+        var parameter = {
+            id : id
+        };
+        if ($(element).prop("type") === "checkbox") {
+            parameter.value = $(element).prop("checked");
+        }else if ($(element).prop("type") === "file") {
+            parameter.value = $('#'+id).attr("value");
+
+        } else {
+            if ($(element).prop("type") === "text") {
+                $(element).val($(element).val().trim());
+            }
+            parameter.value = $(element).val();
+        }
+        if ($(element).prop("selectedIndex") === undefined) {
+            parameter.selectedIndex = -1;
+        } else {
+            parameter.selectedIndex = $(element).prop("selectedIndex");
+            if (UtilityService.hasContents($(element).attr("prompt"))) {
+                parameter.selectedIndex--;
+            }
+        }
+        return parameter;
+    };
+
+    var getRequiredField = function(element) {
+        if ($(element).prop("type") === "text") {
+            $(element).val($(element).val().trim());
+        }
+        if ($(element).val() === "" || $(element).val() === null) {
+            return '"' + $(element).attr("parameter-name") + '"';
+        } else {
+            return "";
+        }
+    };
+
+    var callback = function(element, scope) {
+        scope.callback({
+            id : $(element).attr("parameter-id")
+        });
+    };
+
+    return {
+        restrict : "EA",
+        replace  : true,
+        template : "<div><table style='" + tableStyle + "'></table></div>",
+        scope : {
+            control : "=",
+            callback : "&"
+        },
+        link : function(scope, element, attrs) {
+
+            var control = scope.control || {};
+
+            control.setList = function(parameterList) {
+                var html = "";
+                for (var i = 0; i < parameterList.length; i++) {
+                    html += getParameterHtml(parameterList[i], attrs.editable);
+                }
+                element.html(html);
+                element.find("input, select").bind("change", function() {
+                    callback(this, scope);
+                });
+            }
+
+            control.updateList = function(parameterList) {
+                element.find("input, select").each(
+                    function() {
+                        for (var i = 0; i < parameterList.length; i++) {
+                            if (parameterList[i].id === $(this).attr(
+                                    "parameter-id")) {
+                                updateParameter(parameterList[i], this,
+                                    attrs.editable);
+                            }
+                        }
+                    });
+                element.find("input, select").bind("change", function() {
+                    callback(this, scope);
+                });
+            }
+
+            control.getList = function(expectedId) {
+                var parameterList = new Array();
+                element.find("input, select").each(function() {
+                    var parameter = getParameter(this, expectedId);
+                    if (parameter !== undefined) {
+                        parameterList.push(parameter);
+                    }
+                });
+                return parameterList;
+            }
+
+            control.getRequiredFields = function() {
+                var requiredFields = "";
+                var count = 0;
+                element.find("input, select").each(function() {
+                    if ($(this).attr("is-required") === "true") {
+                        var requiredField = getRequiredField(this);
+                        if (requiredField !== "") {
+                            if (++count == 1) {
+                                requiredFields = requiredField;
+                            }
+                        }
+                    }
+                });
+                if (--count <= 0) {
+                    return requiredFields;
+                } else if (count == 1) {
+                    return requiredFields + " and 1 other field";
+                } else {
+                    return requiredFields + " and " + count + " other fields";
+                }
+            }
+        }
+    }
+}
+
+appDS2.directive('parameterBlock', [ "$log", "PARAMETER", "UtilityService",
+    parameterBlockDirective ]);
+
+
+appDS2.directive('onlyIntegers', function () {
+    return  {
+        restrict: 'A',
+        link: function (scope, elm, attrs, ctrl) {
+            elm.on('keydown', function (event) {
+                if(event.shiftKey){event.preventDefault(); return false;}
+                //console.log(event.which);
+                if ([8, 13, 27, 37, 38, 39, 40].indexOf(event.which) > -1) {
+                    // backspace, enter, escape, arrows
+                    return true;
+                } else if (event.which >= 49 && event.which <= 57) {
+                    // numbers
+                    return true;
+                } else if (event.which >= 96 && event.which <= 105) {
+                    // numpad number
+                    return true;
+                }
+                // else if ([110, 190].indexOf(event.which) > -1) {
+                //     // dot and numpad dot
+                //     return true;
+                // }
+                else {
+                    event.preventDefault();
+                    return false;
+                }
+            });
+        }
+    }
+});
+
+appDS2.directive('onlyFloat', function () {
+    return  {
+        restrict: 'A',
+        link: function (scope, elm, attrs, ctrl) {
+            elm.on('keydown', function (event) {
+                if ([110, 190].indexOf(event.which) > -1) {
+                    // dot and numpad dot
+                    event.preventDefault();
+                    return true;
+                }
+                else{
+                    return false;
+                }
+            });
+        }
+    }
+});
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 ee99547..09c70eb 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,339 +20,365 @@
 

 "use strict";

 

-var AaiService = function($http, $log, PropertyService, UtilityService, COMPONENT, FIELD) {

+var AaiService = function ($http, $log, PropertyService, UtilityService, COMPONENT, FIELD) {

     return {

-    	getSubscriberName : function(globalCustomerId,

-    			successCallbackFunction) {

-    		    $log

-    			    .debug("AaiService:getSubscriberName: globalCustomerId: "

-    				    + globalCustomerId);

-    		    $http.get(

-    			          COMPONENT.AAI_SUB_DETAILS_PATH

-    				    + globalCustomerId + COMPONENT.ASSIGN + Math.random(),

-    			    {

-    				timeout : PropertyService

-    					.getServerResponseTimeoutMsec()

-    			    }).then(function(response) {

-    			    	var subName = "";

-    			    	if (response.data) {

-    			    		subName = response.data[FIELD.ID.SUBNAME];

-    			    	}

-    			    	successCallbackFunction(subName);

-    			    })["catch"]

-    			    (UtilityService.runHttpErrorHandler);

-    		},

+        getSubscriberName: function (globalCustomerId,

+                                     successCallbackFunction) {

+            $log

+                .debug("AaiService:getSubscriberName: globalCustomerId: "

+                    + globalCustomerId);

+            $http.get(

+                COMPONENT.AAI_SUB_DETAILS_PATH

+                + globalCustomerId + COMPONENT.ASSIGN + Math.random(),

+                {

+                    timeout: PropertyService

+                        .getServerResponseTimeoutMsec()

+                }).then(function (response) {

+                var subName = "";

+                if (response.data) {

+                    subName = response.data[FIELD.ID.SUBNAME];

+                }

+                successCallbackFunction(subName);

+            })["catch"]

+            (UtilityService.runHttpErrorHandler);

+        },

 

-    		

-    		runNamedQuery : function (namedQueryId, globalCustomerId, serviceType, serviceInstanceId, successCallback, errorCallback) {

-    		

-    			var url = COMPONENT.AAI_SUB_VIEWEDIT_PATH +

-    				COMPONENT.FORWARD_SLASH + encodeURIComponent(namedQueryId) +

-    				COMPONENT.FORWARD_SLASH + encodeURIComponent(globalCustomerId) + 

-    				COMPONENT.FORWARD_SLASH + encodeURIComponent(serviceType) + 

-    				COMPONENT.FORWARD_SLASH + encodeURIComponent(serviceInstanceId);

-    			$http.get(url, {

 

-    			},{

-    				timeout : PropertyService.getServerResponseTimeoutMsec()

-    			}).then(function(response) {

-    				if (response.data != null) { 

-    				successCallback(response);

-    				} else {

-    					errorCallback(response);

-    				}

-    			}, function(response) {

-    				errorCallback(response);

-    			});

-    		},

-    		

-    		

-    		getSubDetails : function(selectedSubscriber, selectedServiceInstance, successCallback, errorCallback) { 

-    			var subscriber;

-    			var displayData;

-    			$http.get( COMPONENT.AAI_SUB_DETAILS_PATH  + selectedSubscriber, {

+        runNamedQuery: function (namedQueryId, globalCustomerId, serviceType, serviceInstanceId, successCallback, errorCallback) {

 

-    			},{

-    				timeout : PropertyService.getServerResponseTimeoutMsec()

-    			}).then(function(response) {

-    				displayData = [];

-    				subscriber = response.data;

-    				var subscriberName = subscriber[FIELD.ID.SUBNAME];

-    				if (subscriber[FIELD.ID.SERVICE_SUBSCRIPTIONS] != null) {

-    					angular.forEach(subscriber[FIELD.ID.SERVICE_SUBSCRIPTIONS][FIELD.ID.SERVICE_SUBSCRIPTION], function(serviceSubscription, key) {

-    						var serviceInstanceId = [];

-    						var serviceType = "";

-    						if (serviceSubscription[FIELD.ID.SERVICETYPE] != null) {

-    							serviceType = serviceSubscription[FIELD.ID.SERVICETYPE];

-    						} else {

-    							serviceType = FIELD.PROMPT.NO_SERVICE_SUB;

-    						}

-    						if (serviceSubscription[FIELD.ID.SERVICE_INSTANCES] != null) {

-    							angular.forEach(serviceSubscription[FIELD.ID.SERVICE_INSTANCES][FIELD.ID.SERVICE_INSTANCE], function(instValue, instKey) {

-    								// put them together, i guess

-    								var inst = { "serviceInstanceId": instValue[FIELD.ID.SERVICE_INSTANCE_ID], 

-											"aaiModelInvariantId": instValue[FIELD.ID.MODEL_INVAR_ID],

-											"aaiModelVersionId": instValue[FIELD.ID.MODEL_VERSION_ID],

-    										"serviceInstanceName": instValue[FIELD.ID.SERVICE_INSTANCE_NAME]

-    								};

-    								if (selectedServiceInstance != null) {

-    									if ((instValue[FIELD.ID.SERVICE_INSTANCE_ID] == selectedServiceInstance ) || (instValue[FIELD.ID.SERVICE_INSTANCE_NAME] == selectedServiceInstance)) {

-    										serviceInstanceId.push(inst);

-    									}

-    								} else {

-    									serviceInstanceId.push(inst);

-    								}

-    							});

-    						} else {

-    							if (serviceInstanceId == []) {

-    								serviceInstanceId = [ FIELD.PROMPT.NO_SERVICE_INSTANCE ];

-    							}

-    						}

-    						angular.forEach(serviceInstanceId, function(subVal, subKey) {

-    							displayData.push({

-    								globalCustomerId 	: selectedSubscriber,

-    								subscriberName   	: subscriberName,

-    								serviceType 		: serviceType,

-    								serviceInstanceId 	: subVal.serviceInstanceId,

-    								aaiModelInvariantId		: subVal.aaiModelInvariantId,

-    								aaiModelVersionId

-    								: subVal.aaiModelVersionId,

-    								serviceInstanceName	: subVal.serviceInstanceName

-    							});

-    						});

-    					});

-    				} else { 

-    					displayData.push({

-    						globalCustomerId 	: selectedSubscriber,

-    						subscriberName   	: selectedSubscriberName,

-    						serviceType 		: FIELD.PROMPT.NO_SERVICE_SUB,

-    						serviceInstanceId 	: FIELD.PROMPT.NO_SERVICE_INSTANCE

-    					});  

-    				}

-    				successCallback(displayData, subscriberName);

-    			}, function(response) { 

-    				errorCallback(response);

-    			});

-        	},

-    	getSubList : function(successCallback, errorCallback ) {

+            var url = COMPONENT.AAI_SUB_VIEWEDIT_PATH +

+                COMPONENT.FORWARD_SLASH + encodeURIComponent(namedQueryId) +

+                COMPONENT.FORWARD_SLASH + encodeURIComponent(globalCustomerId) +

+                COMPONENT.FORWARD_SLASH + encodeURIComponent(serviceType) +

+                COMPONENT.FORWARD_SLASH + encodeURIComponent(serviceInstanceId);

+            $http.get(url, {}, {

+                timeout: PropertyService.getServerResponseTimeoutMsec()

+            }).then(function (response) {

+                if (response.data != null) {

+                    successCallback(response);

+                } else {

+                    errorCallback(response);

+                }

+            }, function (response) {

+                errorCallback(response);

+            });

+        },

 

-    		$http.get( FIELD.ID.AAI_GET_FULL_SUBSCRIBERS, {

 

-    		},{

-    			timeout : PropertyService.getServerResponseTimeoutMsec()

-    		}).then(function(response) {

-    			var customerList = [];

-    			if (response.data.customer != null) {

-    				angular.forEach(response.data.customer, function(subVal, subKey) {

-    					var cust = { "globalCustomerId": subVal[FIELD.ID.GLOBAL_CUSTOMER_ID], "subscriberName": subVal[FIELD.ID.SUBNAME] };

-    					customerList.push(cust);

-    				});	

-    				successCallback(customerList);

-    			} else { 	

-    				errorCallback(response);

-    			}

-    		},function(response) {

-    			errorCallback(response);

-    		});

-    	},

-    	

-    	getServices2 : function(successCallback, errorCallback ) {

+        getSubDetails: function (selectedSubscriber, selectedServiceInstance, successCallback, errorCallback) {

+            var subscriber;

+            var displayData;

+            $http.get(COMPONENT.AAI_SUB_DETAILS_PATH + selectedSubscriber, {}, {

+                timeout: PropertyService.getServerResponseTimeoutMsec()

+            }).then(function (response) {

+                displayData = [];

+                subscriber = response.data;

+                var subscriberName = subscriber[FIELD.ID.SUBNAME];

+                if (subscriber[FIELD.ID.SERVICE_SUBSCRIPTIONS] != null) {

+                    angular.forEach(subscriber[FIELD.ID.SERVICE_SUBSCRIPTIONS][FIELD.ID.SERVICE_SUBSCRIPTION], function (serviceSubscription, key) {

+                        var serviceInstanceId = [];

+                        var serviceType = "";

+                        if (serviceSubscription[FIELD.ID.SERVICETYPE] != null) {

+                            serviceType = serviceSubscription[FIELD.ID.SERVICETYPE];

+                        } else {

+                            serviceType = FIELD.PROMPT.NO_SERVICE_SUB;

+                        }

+                        if (serviceSubscription[FIELD.ID.SERVICE_INSTANCES] != null) {

+                            angular.forEach(serviceSubscription[FIELD.ID.SERVICE_INSTANCES][FIELD.ID.SERVICE_INSTANCE], function (instValue, instKey) {

+                                // put them together, i guess

+                                var inst = {

+                                    "serviceInstanceId": instValue[FIELD.ID.SERVICE_INSTANCE_ID],

+                                    "aaiModelInvariantId": instValue[FIELD.ID.MODEL_INVAR_ID],

+                                    "aaiModelVersionId": instValue[FIELD.ID.MODEL_VERSION_ID],

+                                    "serviceInstanceName": instValue[FIELD.ID.SERVICE_INSTANCE_NAME]

+                                };

+                                if (selectedServiceInstance != null) {

+                                    if ((instValue[FIELD.ID.SERVICE_INSTANCE_ID] == selectedServiceInstance ) || (instValue[FIELD.ID.SERVICE_INSTANCE_NAME] == selectedServiceInstance)) {

+                                        serviceInstanceId.push(inst);

+                                    }

+                                } else {

+                                    serviceInstanceId.push(inst);

+                                }

+                            });

+                        } else {

+                            if (serviceInstanceId == []) {

+                                serviceInstanceId = [FIELD.PROMPT.NO_SERVICE_INSTANCE];

+                            }

+                        }

+                        angular.forEach(serviceInstanceId, function (subVal, subKey) {

+                            displayData.push({

+                                globalCustomerId: selectedSubscriber,

+                                subscriberName: subscriberName,

+                                serviceType: serviceType,

+                                serviceInstanceId: subVal.serviceInstanceId,

+                                aaiModelInvariantId: subVal.aaiModelInvariantId,

+                                aaiModelVersionId: subVal.aaiModelVersionId,

+                                serviceInstanceName: subVal.serviceInstanceName,

+                                isPermitted: serviceSubscription[FIELD.ID.IS_PERMITTED]

+                            });

+                        });

+                    });

+                } else {

+                    displayData.push({

+                        globalCustomerId: selectedSubscriber,

+                        subscriberName: selectedSubscriberName,

+                        serviceType: FIELD.PROMPT.NO_SERVICE_SUB,

+                        serviceInstanceId: FIELD.PROMPT.NO_SERVICE_INSTANCE

+                    });

+                }

+                successCallback(displayData, subscriberName);

+            }, function (response) {

+                errorCallback(response);

+            });

+        },

+        getSubList: function (successCallback, errorCallback) {

 

-    		$http.get( FIELD.ID.AAI_GET_SERVICES, {

+            $http.get(FIELD.ID.AAI_GET_FULL_SUBSCRIBERS, {}, {

+                timeout: PropertyService.getServerResponseTimeoutMsec()

+            }).then(function (response) {

+                var customerList = [];

+                if (response.data.customer != null) {

+                    angular.forEach(response.data.customer, function (subVal, subKey) {

+                        var cust = {

+                            "globalCustomerId": subVal[FIELD.ID.GLOBAL_CUSTOMER_ID],

+                            "subscriberName": subVal[FIELD.ID.SUBNAME],

+                            "isPermitted": subVal[FIELD.ID.IS_PERMITTED],

+                        };

+                        customerList.push(cust);

+                    });

+                    successCallback(customerList);

+                } else {

+                    errorCallback(response);

+                }

+            }, function (response) {

+                errorCallback(response);

+            });

+        },

 

-    		},{

-    			timeout : PropertyService.getServerResponseTimeoutMsec()

-    		}).then(function(response) {

-    			var customerList = [];

-    			if (response.data != null) {

-    				var serviceIdList = [];

-    				angular.forEach(response.data, function(value, key) {

-    					angular.forEach(value, function(subVal, key) {

-    						var newVal = { "id" : subVal[FIELD.ID.SERVICE_ID], "description" : subVal[FIELD.ID.SERVICE_DESCRIPTION] };

-    						serviceIdList.push(newVal);

-    					});

-    				});

-    				successCallback(serviceIdList);

-    			} else { 	

-    				errorCallback(response);

-    			}

-    		},function(response) {

-    			errorCallback(response);

-    		});

-    	},

-    	

-		getSubscriptionServiceTypeList : function(globalCustomerId,

-			successCallbackFunction) {

-		    $log

-			    .debug("AaiService:getSubscriptionServiceTypeList: globalCustomerId: "

-				    + globalCustomerId);

-		    if ( UtilityService.hasContents(globalCustomerId) ) {

-			    $http.get(

-				        COMPONENT.AAI_SUB_DETAILS_PATH

-					    + globalCustomerId + COMPONENT.ASSIGN + Math.random(),

-				    {

-					timeout : PropertyService

-						.getServerResponseTimeoutMsec()

-				    }).then(function(response) {

-				    	if (response.data && response.data[FIELD.ID.SERVICE_SUBSCRIPTIONS]) {

-					    	var serviceTypes = [];

-					    	var serviceSubscriptions = response.data[FIELD.ID.SERVICE_SUBSCRIPTIONS][FIELD.ID.SERVICE_SUBSCRIPTION];

-					    	

-					    	for (var i = 0; i < serviceSubscriptions.length; i++) {

-					    		serviceTypes.push(serviceSubscriptions[i][FIELD.ID.SERVICETYPE]);

-					    	}

-					    	successCallbackFunction(serviceTypes);

-				    	} else {

-				    		successCallbackFunction([]);

-				    	}

-				    })["catch"]

-				    (UtilityService.runHttpErrorHandler);

-			    }

-		},

-		getLcpCloudRegionTenantList : function(globalCustomerId, serviceType,

-				successCallbackFunction) {

-			    $log

-				    .debug("AaiService:getLcpCloudRegionTenantList: globalCustomerId: "

-					    + globalCustomerId);

-			    var url =   COMPONENT.AAI_GET_TENANTS

-			    + globalCustomerId + COMPONENT.FORWARD_SLASH + serviceType + COMPONENT.ASSIGN + Math.random();

-			    

-			    $http.get(url,

-				    {

-					timeout : PropertyService

-						.getServerResponseTimeoutMsec()

-				    }).then(function(response) {

-				    	var lcpCloudRegionTenants = [];

-				    	var aaiLcpCloudRegionTenants = response.data;

-				    	

-				    	lcpCloudRegionTenants.push({

-			    			"cloudRegionId": "",

-			    			"tenantName": FIELD.PROMPT.REGION,

-			    			"tenantId": ""

-			    		});

-				    	

-				    	for (var i = 0; i < aaiLcpCloudRegionTenants.length; i++) {

-				    		lcpCloudRegionTenants.push({

-				    			"cloudRegionId": aaiLcpCloudRegionTenants[i][COMPONENT.CLOUD_REGION_ID],

-				    			"tenantName": aaiLcpCloudRegionTenants[i][COMPONENT.TENANT_NAME],

-				    			"tenantId": aaiLcpCloudRegionTenants[i][COMPONENT.TENANT_ID]

-				    		});

-				    	}

-				    	

-				    	successCallbackFunction(lcpCloudRegionTenants);

-				    })["catch"]

-				    (UtilityService.runHttpErrorHandler);

-		},

-		getSubscribers : function(successCallbackFunction) {

-			    $log

-				    .debug("AaiService:getSubscribers");

-			    var url =  FIELD.ID.AAI_GET_SUBSCRIBERS + COMPONENT.ASSIGN + Math.random();

-		

-			    $http.get(url,

-				    {

-					timeout : PropertyService

-						.getServerResponseTimeoutMsec()

-				    }).then(function(response) {

-				    	if (response.data) {

-				    		successCallbackFunction(response.data.customer);

-				    	} else {

-				    		successCallbackFunction([]);

-				    	}

-				    })["catch"]

-				    (UtilityService.runHttpErrorHandler);

-		},

-		getProvOptionsFromSystemProp : function(successCallbackFunction) {

-		    $log

-			    .debug("AaiService:getProvOptionsFromSystemProp");

-		    var url =  COMPONENT.GET_SYSTEM_PROP_VNF_PROV_STATUS_PATH;

-	

-		    $http.get(url,

-			    {

-				timeout : PropertyService

-					.getServerResponseTimeoutMsec()

-			    }).then(function(response) {

-			    	if (response.data) {

-			    		successCallbackFunction(response);

-			    	} else {

-			    		successCallbackFunction([]);

-			    	}

-			    })["catch"]

-			    (UtilityService.runHttpErrorHandler);

-	    },

-	    getLoggedInUserID : function(successCallbackFunction) {

-		    $log

-			    .debug("AaiService:getLoggedInUserID");

-		    var url = COMPONENT.GET_USER_ID;

-	

-		    $http.get(url,

-			    {

-				timeout : PropertyService

-					.getServerResponseTimeoutMsec()

-			    }).then(function(response) {

-			    	if (response.data) {

-			    		successCallbackFunction(response);

-			    	} else {

-			    		successCallbackFunction([]);

-			    	}

-			    })["catch"]

-			    (UtilityService.runHttpErrorHandler);

-	    },

-		getServices : function(successCallbackFunction) {

-		    $log

-			    .debug("AaiService:getServices");

-		    var url =  COMPONENT.AAI_GET_SERVICES + COMPONENT.ASSIGN + Math.random();

-	

-		    $http.get(url,

-			    {

-				timeout : PropertyService

-					.getServerResponseTimeoutMsec()

-			    }).then(function(response) {

-			    	if (response.data) {

-			    		successCallbackFunction(response);

-			    	} else {

-			    		successCallbackFunction([]);

-			    	}

-			    })["catch"]

-			    (UtilityService.runHttpErrorHandler);

-	},

-	getServiceModels : function(globalCustomerId,serviceType,successCallbackFunction) {

-	    $log

-		    .debug("AaiService:getServices");

-		 var url =   COMPONENT.AAI_GET_SERVICES + COMPONENT.FORWARD_SLASH+globalCustomerId+ COMPONENT.FORWARD_SLASH +serviceType+COMPONENT.ASSIGN + Math.random();

+        getServices2: function (successCallback, errorCallback) {

 

-	    $http.get(url,

-		    {

-			timeout : PropertyService

-				.getServerResponseTimeoutMsec()

-		    }).then(function(response) {

-		    	if (response.data) {

-		    		successCallbackFunction(response);

-		    	} else {

-		    		successCallbackFunction([]);

-		    	}

-		    })["catch"]

-		    (UtilityService.runHttpErrorHandler);

-},

-getServiceModelsByServiceType : function(namedQueryId,globalCustomerId,serviceType,successCallbackFunction) {

-		$log

-		.debug("AaiService:getServiceModelsByServiceType");

-		var url =   COMPONENT.AAI_GET_SERVICES_BY_TYPE+COMPONENT.FORWARD_SLASH+namedQueryId+COMPONENT.FORWARD_SLASH+globalCustomerId+COMPONENT.FORWARD_SLASH +serviceType+COMPONENT.ASSIGN + Math.random();

-		

-		$http.get(url,

-				{

-			timeout : PropertyService

-			.getServerResponseTimeoutMsec()

-				}).then(function(response) {

-					if (response.data) {

-						successCallbackFunction(response);

-					} else {

-						successCallbackFunction([]);

-					}

-				})["catch"]

-		(UtilityService.runHttpErrorHandler);

-	}

+            $http.get(FIELD.ID.AAI_GET_SERVICES, {}, {

+                timeout: PropertyService.getServerResponseTimeoutMsec()

+            }).then(function (response) {

+                var customerList = [];

+                if (response.data != null) {

+                    var serviceIdList = [];

+                    angular.forEach(response.data, function (value, key) {

+                        angular.forEach(value, function (subVal, key) {

+                            var newVal = {

+                                "id": subVal[FIELD.ID.SERVICE_ID],

+                                "description": subVal[FIELD.ID.SERVICE_DESCRIPTION],

+                                "isPermitted" : subVal[FIELD.ID.IS_PERMITTED]

+

+                            };

+                            serviceIdList.push(newVal);

+                        });

+                    });

+                    successCallback(serviceIdList);

+                } else {

+                    errorCallback(response);

+                }

+            }, function (response) {

+                errorCallback(response);

+            });

+        },

+

+        getSubscriptionServiceTypeList: function (globalCustomerId,

+                                                  successCallbackFunction) {

+            $log

+                .debug("AaiService:getSubscriptionServiceTypeList: globalCustomerId: "

+                    + globalCustomerId);

+            if (UtilityService.hasContents(globalCustomerId)) {

+                $http.get(

+                    COMPONENT.AAI_SUB_DETAILS_PATH

+                    + globalCustomerId + COMPONENT.ASSIGN + Math.random(),

+                    {

+                        timeout: PropertyService

+                            .getServerResponseTimeoutMsec()

+                    }).then(function (response) {

+                    if (response.data && response.data[FIELD.ID.SERVICE_SUBSCRIPTIONS]) {

+                        var serviceTypes = [];

+                        var serviceSubscriptions = response.data[FIELD.ID.SERVICE_SUBSCRIPTIONS][FIELD.ID.SERVICE_SUBSCRIPTION];

+

+                        for (var i = 0; i < serviceSubscriptions.length; i++) {

+                            serviceTypes.push({

+                                "name": serviceSubscriptions[i][FIELD.ID.SERVICETYPE],

+                                "isPermitted": serviceSubscriptions[i][FIELD.ID.IS_PERMITTED],

+                                "id": i

+                            });

+                        }

+                        successCallbackFunction(serviceTypes);

+                    } else {

+                        successCallbackFunction([]);

+                    }

+                })["catch"]

+                (UtilityService.runHttpErrorHandler);

+            }

+        },

+        getLcpCloudRegionTenantList: function (globalCustomerId, serviceType,

+                                               successCallbackFunction) {

+            $log

+                .debug("AaiService:getLcpCloudRegionTenantList: globalCustomerId: "

+                    + globalCustomerId);

+            var url = COMPONENT.AAI_GET_TENANTS

+                + globalCustomerId + COMPONENT.FORWARD_SLASH + serviceType + COMPONENT.ASSIGN + Math.random();

+

+            $http.get(url,

+                {

+                    timeout: PropertyService

+                        .getServerResponseTimeoutMsec()

+                }).then(function (response) {

+                var lcpCloudRegionTenants = [];

+                var aaiLcpCloudRegionTenants = response.data;

+

+                lcpCloudRegionTenants.push({

+                    "cloudRegionId": "",

+                    "tenantName": FIELD.PROMPT.REGION,

+                    "tenantId": ""

+                });

+

+                for (var i = 0; i < aaiLcpCloudRegionTenants.length; i++) {

+                    lcpCloudRegionTenants.push({

+                        "cloudRegionId": aaiLcpCloudRegionTenants[i][COMPONENT.CLOUD_REGION_ID],

+                        "tenantName": aaiLcpCloudRegionTenants[i][COMPONENT.TENANT_NAME],

+                        "tenantId": aaiLcpCloudRegionTenants[i][COMPONENT.TENANT_ID],

+                        "isPermitted": aaiLcpCloudRegionTenants[i][COMPONENT.IS_PERMITTED]

+                    });

+                }

+

+                successCallbackFunction(lcpCloudRegionTenants);

+            })["catch"]

+            (UtilityService.runHttpErrorHandler);

+        },

+        getSubscribers: function (successCallbackFunction) {

+            $log

+                .debug("AaiService:getSubscribers");

+            var url = FIELD.ID.AAI_GET_SUBSCRIBERS + COMPONENT.ASSIGN + Math.random();

+

+            $http.get(url,

+                {

+                    timeout: PropertyService

+                        .getServerResponseTimeoutMsec()

+                }).then(function (response) {

+                if (response.data) {

+                    successCallbackFunction(response.data.customer);

+                } else {

+                    successCallbackFunction([]);

+                }

+            })["catch"]

+            (UtilityService.runHttpErrorHandler);

+        },

+        getProvOptionsFromSystemProp: function (successCallbackFunction) {

+            $log

+                .debug("AaiService:getProvOptionsFromSystemProp");

+            var url = COMPONENT.GET_SYSTEM_PROP_VNF_PROV_STATUS_PATH;

+

+            $http.get(url,

+                {

+                    timeout: PropertyService

+                        .getServerResponseTimeoutMsec()

+                }).then(function (response) {

+                if (response.data) {

+                    successCallbackFunction(response);

+                } else {

+                    successCallbackFunction([]);

+                }

+            })["catch"]

+            (UtilityService.runHttpErrorHandler);

+        },

+        getLoggedInUserID: function (successCallbackFunction) {

+            $log

+                .debug("AaiService:getLoggedInUserID");

+            var url = COMPONENT.GET_USER_ID;

+

+            $http.get(url,

+                {

+                    timeout: PropertyService

+                        .getServerResponseTimeoutMsec()

+                }).then(function (response) {

+                if (response.data) {

+                    successCallbackFunction(response);

+                } else {

+                    successCallbackFunction([]);

+                }

+            })["catch"]

+            (UtilityService.runHttpErrorHandler);

+        },

+        getServices: function (successCallbackFunction) {

+            $log

+                .debug("AaiService:getServices");

+            var url = COMPONENT.AAI_GET_SERVICES + COMPONENT.ASSIGN + Math.random();

+

+            $http.get(url,

+                {

+                    timeout: PropertyService

+                        .getServerResponseTimeoutMsec()

+                }).then(function (response) {

+                if (response.data) {

+                    successCallbackFunction(response);

+                } else {

+                    successCallbackFunction([]);

+                }

+            })["catch"]

+            (UtilityService.runHttpErrorHandler);

+        },

+

+        getAicZones: function (successCallbackFunction) {

+            $log

+                .debug("getAicZones:getAicZones");

+            var url = COMPONENT.AAI_GET_AIC_ZONES + COMPONENT.ASSIGN + Math.random();

+

+            $http.get(url,

+                {

+                    timeout: PropertyService

+                        .getServerResponseTimeoutMsec()

+                }).then(function (response) {

+                if (response.data) {

+                    successCallbackFunction(response);

+                } else {

+                    successCallbackFunction([]);

+                }

+            })["catch"]

+            (UtilityService.runHttpErrorHandler);

+        },

+        getServiceModels: function (globalCustomerId, serviceType, successCallbackFunction) {

+            $log

+                .debug("AaiService:getServices");

+            var url = COMPONENT.AAI_GET_SERVICES + COMPONENT.FORWARD_SLASH + globalCustomerId + COMPONENT.FORWARD_SLASH + serviceType + COMPONENT.ASSIGN + Math.random();

+

+            $http.get(url,

+                {

+                    timeout: PropertyService

+                        .getServerResponseTimeoutMsec()

+                }).then(function (response) {

+                if (response.data) {

+                    successCallbackFunction(response);

+                } else {

+                    successCallbackFunction([]);

+                }

+            })["catch"]

+            (UtilityService.runHttpErrorHandler);

+        },

+        getServiceModelsByServiceType: function (namedQueryId, globalCustomerId, serviceType, successCallbackFunction) {

+            $log

+                .debug("AaiService:getServiceModelsByServiceType");

+            var url = COMPONENT.AAI_GET_SERVICES_BY_TYPE + COMPONENT.FORWARD_SLASH + namedQueryId + COMPONENT.FORWARD_SLASH + globalCustomerId + COMPONENT.FORWARD_SLASH + serviceType + COMPONENT.ASSIGN + Math.random();

+

+            $http.get(url,

+                {

+                    timeout: PropertyService

+                        .getServerResponseTimeoutMsec()

+                }).then(function (response) {

+                if (response.data) {

+                    successCallbackFunction(response);

+                } else {

+                    successCallbackFunction([]);

+                }

+            })["catch"]

+            (UtilityService.runHttpErrorHandler);

+        }

     }

 }

 

-appDS2.factory("AaiService", [ "$http", "$log", "PropertyService",

-	"UtilityService", "COMPONENT", "FIELD", AaiService ]);

+appDS2.factory("AaiService", ["$http", "$log", "PropertyService",

+    "UtilityService", "COMPONENT", "FIELD", AaiService]);

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/componentService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/componentService.js
index 391c6ba..ea46dcb 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/componentService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/componentService.js
@@ -30,7 +30,9 @@
     }, {

 	id : COMPONENT.SERVICE,

 	displayName : "Service Instance"

-    }, {

+    }, {id : COMPONENT.OLDVERSION,

+	displayName : "Previous Version"

+	}, {

 	id : COMPONENT.VNF,

 	displayName : "Virtual Network Function"

     }, {

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 11e61b3..9309ce6 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
@@ -39,7 +39,7 @@
 			getLoggedInUserID();

 		switch (_this.componentId) {

 		case COMPONENT.SERVICE:

-			return [ getSubscribers, getServices ];

+			return [ getSubscribers, getServices,getAicZones ];

 		case COMPONENT.NETWORK:

 			return [ getLcpCloudRegionTenantList ];

 		case COMPONENT.VNF:

@@ -121,6 +121,13 @@
 					.getModelInfo(_this.componentId)[FIELD.ID.DESCRIPTION]);

 			addToList(FIELD.NAME.SERVICE_CATEGORY, DataService

 					.getModelInfo(_this.componentId)[FIELD.ID.CATEGORY]);

+			if (DataService.getModelInfo(_this.componentId)[FIELD.ID.SERVICE_TYPE] != "null") {

+				addToList(FIELD.NAME.SERVICE_TYPE, DataService

+					.getModelInfo(_this.componentId)[FIELD.ID.SERVICE_TYPE]);

+				addToList(FIELD.NAME.SERVICE_ROLE, DataService

+					.getModelInfo(_this.componentId)[FIELD.ID.SERVICE_ROLE]);

+			}

+

 			break;

 		case COMPONENT.VF_MODULE:

 			addToList(FIELD.NAME.SUBSCRIBER_NAME, DataService

@@ -209,14 +216,18 @@
 				if(!isInTop){

 					if (isUserProvidedNaming) {

 						parameterList = [ FIELD.PARAMETER.INSTANCE_NAME ];

-						

+

 					}

 					parameterList = parameterList.concat([ getSubscribersParameter() ]);

 					parameterList = parameterList.concat([ getServiceId(),

 						FIELD.PARAMETER.SERVICE_TYPE,

 						FIELD.PARAMETER.LCP_REGION,

 						FIELD.PARAMETER.LCP_REGION_TEXT_HIDDEN,

-						FIELD.PARAMETER.TENANT_DISABLED ]);

+						FIELD.PARAMETER.TENANT_DISABLED,

+						]);

+					parameterList = parameterList.concat([ getAICZones() ]);

+

+

 				}else{

 					parameterList = parameterList.concat([ getServiceId(),

 						FIELD.PARAMETER.LCP_REGION,

@@ -263,23 +274,27 @@
 		}

 		parameterList.push(FIELD.PARAMETER.SUPPRESS_ROLLBACK);

 		if(_this.componentId === COMPONENT.VF_MODULE ){

-			parameterList.push({name: "SDN-C Pre-Load",

-				id: "sdncPreload",

+			if(DataService.getSubscriberName() === FIELD.NAME.MOBILITY){

+			parameterList.push({name: FIELD.NAME.SDN_C_PRELOAD,

+				id: FIELD.ID.SDN_C_PRELOAD,

 				type: "checkbox",

 				isEnabled: true,

-				isRequired: false

+				isRequired: false,

+				hideFieldAndLabel: true

 				}

 			);

-			parameterList.push({name: "Upload Supplementory Data file",

-				id: "uploadSupplementoryDataFile",

+			}

+			parameterList.push({name: FIELD.NAME.UPLOAD_SUPPLEMENTORY_DATA_FILE,

+				id: FIELD.ID.UPLOAD_SUPPLEMENTORY_DATA_FILE,

 				type: "checkbox",

 				isEnabled: true,

-				isRequired: false

+				isRequired: false,

+				value:false

 				}

 			);

 			

-			parameterList.push({name: "Supplemetory file (JSON format)",

-				id: "supplementoryDataFile",

+			parameterList.push({name: FIELD.NAME.SUPPLEMENTORY_DATA_FILE,

+				id: FIELD.ID.SUPPLEMENTORY_DATA_FILE,

 				type: "file",

 				isRequired: false,

 				isVisiblity: false

@@ -288,16 +303,16 @@
 		}

 		

 		if( VIDCONFIGURATION.UPLOAD_SUPPLEMENTARY_STATUS_CHECK_ENABLED  && _this.componentId === COMPONENT.VOLUME_GROUP){

-				parameterList.push({name: "Upload Supplementory Data file",

-					id: "uploadSupplementoryDataFile",

+			parameterList.push({name: FIELD.NAME.UPLOAD_SUPPLEMENTORY_DATA_FILE,

+				id: FIELD.ID.UPLOAD_SUPPLEMENTORY_DATA_FILE,

 					type: "checkbox",

 					isEnabled: true,

 					isRequired: false

 					}

 				);

 				

-				parameterList.push({name: "Supplemetory file (JSON format)",

-					id: "supplementoryDataFile",

+			parameterList.push({name: FIELD.NAME.SUPPLEMENTORY_DATA_FILE,

+				id: FIELD.ID.SUPPLEMENTORY_DATA_FILE,

 					type: "file",

 					isRequired: false,

 					isVisiblity: false

@@ -584,7 +599,12 @@
 			

 			break;

 		case COMPONENT.VF_MODULE:

-				break;

+		requestDetails.requestParameters.usePreload = getValueFromList(

+					FIELD.ID.SDN_C_PRELOAD, parameterList);

+			if(_this.componentId == COMPONENT.VF_MODULE &&(requestDetails.requestParameters.usePreload== null || requestDetails.requestParameters.usePreload === '')){

+				requestDetails.requestParameters.usePreload = true;

+			}

+			break;

 		case COMPONENT.VOLUME_GROUP:

 			break;

 		}

@@ -716,12 +736,24 @@
 				break;

 			case FIELD.ID.SUBSCRIBER_NAME:

 				break;

+			case FIELD.ID.SDN_C_PRELOAD:

+				break;

+			case FIELD.ID.UPLOAD_SUPPLEMENTORY_DATA_FILE:

+				break;

+			case FIELD.ID.SUPPLEMENTORY_DATA_FILE:

+				arbitraryParameters =  FIELD.PARAMETER.SUPPLEMENTORY_DATA_FILE['value'];

+				arbitraryArray=arbitraryParameters;

+				FIELD.PARAMETER.SUPPLEMENTORY_DATA_FILE['value']=[];

+				break;

+

 			default:

-				arbitraryParameters = {

-					name : parameter.id,

-					value : parameter.value

+				if (parameter.value != '') {

+					arbitraryParameters = {

+						name: parameter.id,

+						value: parameter.value

+					}

+					arbitraryArray.push(arbitraryParameters);

 				}

-				arbitraryArray.push(arbitraryParameters);

 			}

 		}

 		return (arbitraryArray);

@@ -766,15 +798,40 @@
 			var serviceIdList = [];

 			angular.forEach(response.data, function(value, key) {

 				angular.forEach(value, function(subVal, key) {

-					var newVal = { "id" : subVal[FIELD.ID.SERVICE_ID], "description" : subVal[FIELD.ID.SERVICE_DESCRIPTION] };

+					var newVal = {

+						"id" : subVal[FIELD.ID.SERVICE_ID],

+						"description" : subVal[FIELD.ID.SERVICE_DESCRIPTION],

+						"isPermitted" : subVal[FIELD.ID.IS_PERMITTED],

+					};

 					serviceIdList.push(newVal);

 					DataService.setServiceIdList(serviceIdList);

 				});

 			});

-		

+

 			UtilityService.startNextAsyncOperation();

 		});

 	};

+	var getAicZones = function() {

+		AaiService.getAicZones(function(response) {

+			var serviceIdList = [];

+			angular.forEach(response.data, function(value, key) {

+				angular.forEach(value, function(subVal, key) {

+					var newVal = {

+						"id" : subVal[FIELD.ID.ZONE_ID],

+						"name" : subVal[FIELD.ID.ZONE_NAME],

+					};

+					serviceIdList.push(newVal);

+					DataService.setAicZones(serviceIdList);

+				});

+			});

+

+			UtilityService.startNextAsyncOperation();

+		});

+

+	};

+

+

+

 	var getLcpCloudRegionTenantList = function() {

 		AaiService.getLcpCloudRegionTenantList(DataService

 				.getGlobalCustomerId(), DataService.getServiceType(), function(

@@ -802,7 +859,8 @@
 			for (var i = 0; i < subscribers.length; i++) {

 				parameter.optionList.push({

 					id : subscribers[i][FIELD.ID.GLOBAL_CUSTOMER_ID],

-					name : subscribers[i][FIELD.ID.SUBNAME]

+					name : subscribers[i][FIELD.ID.SUBNAME],

+					isPermitted : subscribers[i][FIELD.ID.IS_PERMITTED]

 				})

 			}

 		}

@@ -819,7 +877,8 @@
 			for (var i = 0; i < serviceIdList.length; i++) {

 				parameter.optionList.push({

 					id : serviceIdList[i].id,

-					name : serviceIdList[i].description

+					name : serviceIdList[i].description,

+					isPermitted : serviceIdList[i].isPermitted

 				});

 			}

 		}

@@ -827,6 +886,26 @@
 		return parameter;

 	};

 

+	var getAICZones = function() {

+		var aicList = DataService.getAicZones();

+		var parameter = FIELD.PARAMETER.AIC_ZONES;

+		parameter.optionList = new Array();

+		if ( UtilityService.hasContents(aicList) ) {

+			// load them all

+			for (var i = 0; i < aicList.length; i++) {

+				parameter.optionList.push({

+					id : aicList[i].id,

+					name : aicList[i].name,

+					isPermitted : true

+

+				});

+			}

+		}

+

+		return parameter;

+	};

+

+

 	var getLcpRegion = function() {

 		var cloudRegionTenantList = DataService.getCloudRegionTenantList();

 		console.log ( "cloudRegionTenantList=");

@@ -838,14 +917,17 @@
 			for (var i = 0; i < cloudRegionTenantList.length; i++) {

 				for (var j = 0; j < parameter.optionList.length; j++) {

 					if (parameter.optionList[j].id === cloudRegionTenantList[i].cloudRegionId) {

-						break;

-					}

+                        parameter.optionList[j].isPermitted =

+							parameter.optionList[j].isPermitted || cloudRegionTenantList[i].isPermitted;

+                        break;

+                    }

 				}

 				if (j < parameter.optionList.length) {

 					continue;

 				}

 				parameter.optionList.push({

-					id : cloudRegionTenantList[i].cloudRegionId

+					id : cloudRegionTenantList[i].cloudRegionId,

+					isPermitted : cloudRegionTenantList[i].isPermitted

 				});

 			}

 		}

@@ -862,8 +944,10 @@
 				if (cloudRegionTenantList[i].cloudRegionId === cloudRegionId) {

 					parameter.optionList.push({

 						id : cloudRegionTenantList[i].tenantId,

-						name : cloudRegionTenantList[i].tenantName

-					});

+						name : cloudRegionTenantList[i].tenantName,

+                        isPermitted : cloudRegionTenantList[i].isPermitted

+

+                    });

 				}

 			}

 		}

@@ -878,7 +962,8 @@
 		}

 		for (var i = 0; i < optionSimpleArray.length; i++) {

 			optionList.push({

-				name : optionSimpleArray[i]

+				name : optionSimpleArray[i],

+                isPermitted :true,

 			});

 		}

 		parameter.optionList = optionList;

@@ -918,6 +1003,7 @@
 				.updateList([ FIELD.PARAMETER.UPLOAD_SUPPLEMENTORY_DATA_FILE_CHECKED ]);

 			}else{

 				$('input[parameter-id="'+FIELD.ID.SUPPLEMENTORY_DATA_FILE+'"]').closest('tr').hide();

+				FIELD.PARAMETER.UPLOAD_SUPPLEMENTORY_DATA_FILE_CHECKED.value=false;

 				parameterListControl

 				.updateList([ FIELD.PARAMETER.UPLOAD_SUPPLEMENTORY_DATA_FILE_UNCHECKED ]);

 			}

@@ -959,9 +1045,11 @@
 

 					for (var i = 0; i < response.length; i++) {

 						serviceTypeParameters.optionList.push({

-							"id" : response[i],

-							"name" : response[i]

-						});

+							"id" : response[i].name,

+							"name" : response[i].name,

+                            "isPermitted" :response[i].isPermitted

+

+                        });

 					}

 					console.log ( "updateUserParameterList: service type parameters " ); 

 					console.log ( JSON.stringify (serviceTypeParameters, null, 4));

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 bb5adad..2d7fa6c 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
@@ -94,6 +94,12 @@
 		setServiceIdList : function(serviceIdList) {

 			_this.serviceIdList = serviceIdList;

 		},

+		setAicZones : function(aicZones) {

+			_this.aicZones = aicZones;

+		},

+		getAicZones : function(){

+			return _this.aicZones;

+		},

 		getServiceInstanceId : function() {

 			return _this.serviceInstanceId;

 		},

@@ -249,6 +255,15 @@
 			}

 			return _this.aLaCarte;

 		},

+		setMacro : function(aval) {

+			_this.macro = aval;

+		},

+		getMacro : function() {

+			if (_this.macro === undefined) {

+				return false;

+			}

+			return _this.macro;

+		},

 		getResources : function() {

 			return _this.resources;

 		},

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/deletionService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/deletionService.js
index 62c2b19..7928299 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/deletionService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/deletionService.js
@@ -380,15 +380,19 @@
 			for (var i = 0; i < cloudRegionTenantList.length; i++) {

 				for (var j = 0; j < parameter.optionList.length; j++) {

 					if (parameter.optionList[j].id === cloudRegionTenantList[i].cloudRegionId) {

-						break;

+                        parameter.optionList[j].isPermitted =

+                            parameter.optionList[j].isPermitted || cloudRegionTenantList[i].isPermitted;

+                        break;

 					}

 				}

 				if (j < parameter.optionList.length) {

 					continue;

 				}

 				parameter.optionList.push({

-					id : cloudRegionTenantList[i].cloudRegionId

-				});

+					id : cloudRegionTenantList[i].cloudRegionId,

+          isPermitted : cloudRegionTenantList[i].isPermitted

+

+        });

 			}

 		}

 		return parameter;

@@ -404,8 +408,9 @@
 				if (cloudRegionTenantList[i].cloudRegionId === cloudRegionId) {

 					parameter.optionList.push({

 						id : cloudRegionTenantList[i].tenantId,

-						name : cloudRegionTenantList[i].tenantName

-					});

+						name : cloudRegionTenantList[i].tenantName,

+                        isPermitted : cloudRegionTenantList[i].isPermitted

+                    });

 				}

 			}

 		}

@@ -465,8 +470,8 @@
 

 					for (var i = 0; i < response.length; i++) {

 						serviceTypeParameters.optionList.push({

-							"id" : response[i],

-							"name" : response[i]

+							"id" : response[i].name,

+							"name" : response[i].name

 						});

 					}

 					parameterListControl.updateList([ serviceTypeParameters ]);

@@ -493,7 +498,8 @@
 	},

 	updateUserParameterList : updateUserParameterList,

 	getMsoRequestDetails : getMsoRequestDetails,

-	getMsoUrl : getMsoUrl

+	getMsoUrl : getMsoUrl,

+	isMacro : DataService.getMacro()

     }

 }

 

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/vnfService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/vnfService.js
index 836279b..3fc04ba 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/vnfService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/vnfService.js
@@ -41,21 +41,42 @@
 		if ( ( UtilityService.hasContents ( vnfInstance.object[FIELD.ID.ORCHESTRATION_STATUS] ) ) &&

 				( UtilityService.hasContents ( vnfInstance.object[FIELD.ID.IN_MAINT] ) ) &&

 				( UtilityService.hasContents ( vnfInstance.object[FIELD.ID.PROV_STATUS] ) ) ) {

-

+			

 			status.provStatus = vnfInstance.object[FIELD.ID.PROV_STATUS].toLowerCase();

+			console.log ("PROVSTATUS: " + vnfInstance.object[FIELD.ID.PROV_STATUS].toLowerCase());

+			

 			status.orchestrationStatus = vnfInstance.object[FIELD.ID.ORCHESTRATION_STATUS].toLowerCase();

+			console.log ("ORCHESTRATION STATUS: " + vnfInstance.object[FIELD.ID.ORCHESTRATION_STATUS].toLowerCase());

+			

 			status.inMaint = vnfInstance.object[FIELD.ID.IN_MAINT];

-

+			console.log ("IN MAINT: " + vnfInstance.object[FIELD.ID.IN_MAINT]);

+			

 			if ( UtilityService.hasContents(vnfInstance.object[FIELD.ID.OPERATIONAL_STATUS]) ) {

 				status.operationalStatus = vnfInstance.object[FIELD.ID.OPERATIONAL_STATUS].toLowerCase();

 			}

-

-			if ( UtilityService.arrayContains ( VIDCONFIGURATION.VNF_VALID_STATUS_LIST, status ) ) {

-				return ("");

-			}

-			else {

-				return (errorInvalidCombinationMsg);

-			}

+			var i = VIDCONFIGURATION.VNF_VALID_STATUS_LIST.length;

+		    if ( i > 0 ) {

+			    while (i--) {

+			    	var item = VIDCONFIGURATION.VNF_VALID_STATUS_LIST[i];

+			        if ( (item.provStatus === status.provStatus) && (item.inMaint === status.inMaint ) 

+			        		&& (item.orchestrationStatus === status.orchestrationStatus) )  {

+			        	if (UtilityService.hasContents(vnfInstance.object[FIELD.ID.OPERATIONAL_STATUS])) {

+			        		if (status.operationalStatus === "") { status.operationalStatus = null }

+			        		if ( item.operationalStatus === status.operationalStatus ) {

+			        			return ("");

+			        		}

+			        	}

+			        	else {

+			        		// no contents

+			        		if ( item.operationalStatus === null ) {

+			        			return ("");

+			        		}

+			        	}

+			       }

+			    }

+		    }

+			

+			return (errorInvalidCombinationMsg);

 		}

 		else {

 			return (errorAaiStatusMsg);

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubs.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubs.htm
index d22e3d9..c5c5cca 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubs.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubs.htm
@@ -18,66 +18,85 @@
   ============LICENSE_END=========================================================

   -->

 

-<link rel="stylesheet" type="text/css" href="app/vid/styles/aaiGetSubs.css" />

-<link rel="stylesheet" type="text/css" href="app/vid/styles/aaiSubDetails.css" />

+<link rel="stylesheet" type="text/css" href="app/vid/styles/aaiGetSubs.css"/>

+<link rel="stylesheet" type="text/css" href="app/vid/styles/aaiSubDetails.css"/>

 <script src="app/vid/scripts/controller/aaiSubscriberController.js"></script>

 <div ng-controller="aaiSubscriberController" ng-cloak>

 

-	<div>

-		<div class="statusLine" ng-class="{true:'aaiVisible', false:'aaiHidden'}[isSpinnerVisible]">

-			<img src="app/vid/images/spinner.gif"></img>

-			<label>Status:</label><span class="status">{{status}}</span>

-		</div>

+    <div>

+        <div class="statusLine" ng-class="{true:'aaiVisible', false:'aaiHidden'}[isSpinnerVisible]">

+            <img src="app/vid/images/spinner.gif"></img>

+            <label>Status:</label><span class="status">{{status}}</span>

+        </div>

 

-		<div ng-if="errorMsg != null"><font color='red'>{{errorMsg}}<pre>{{errorDetails | json}}</pre></font></div>

-		

-		 <h2 class="heading2"><center>Search Existing Service Instances</center></h2>

-     		<br>

-    	Please search by the Subscriber name or enter Service Instance Id or Service Instance Name below:&nbsp;<br><br>

-    	 

-		<table> 

-			<tr>

-				<td style="width:30%">

-				<div class="fn-ebz-container">	

-					<label  class="fn-ebz-text-label">Subscriber Name:</label>

-				</div>

-				</td>

-				<td style="width:30%" nowrap>

-					<div class="fn-ebz-container" ng-init="autoGetSubs();">

-						<select  ng-model="selectedCustomer" ng-options="item.globalCustomerId as item.subscriberName for item in customerList | orderBy:'subscriberName'">

-						<option value="">Select a subscriber</option></select>

-					  &nbsp;&nbsp;<a class="btn btn-primary" ng-click="refreshSubs();" ><span class="glyphicon glyphicon-refresh"></span></a>

-					</div>

-				</td>

-	 		

-			</tr>

-			<tr>

-				<td style="width:30%">

-					<div class="fn-ebz-container">

-						<select  style="width: 250px;" ng-model="selectedserviceinstancetype" ng-options="stype.sinstance as stype.sinstance for stype in serviceInstanceses" >

-						<option value="">Select a Service Instance</option>						

-						</select>

-					</div>

-				</td>

-    			<td style="width:60%">

-    				<div class="fn-ebz-container">

-						<input type="text" style="width: 350px;" name="selectedServiceInstance" ng-model="selectedServiceInstance" restrict-input ="{type : selectedserviceinstancetype}" />

-					</div> 

-				</td>

-				

-    		</tr>

-    		<tr>

-				<td>

-				<td style="width:30%">

-					<div>	

-						<button type="submit" class="btn btn-primary" size="small" ng-click="getSubscriberDet(selectedCustomer,selectedserviceinstancetype,selectedServiceInstance);">Submit</button></a>

-					</div>

-				</td>

-				</td>

-			</tr>

-		</table>	

-		

-	

-	</div>

+        <div ng-if="errorMsg != null"><font color='red'>{{errorMsg}}

+            <pre>{{errorDetails | json}}</pre>

+        </font></div>

+

+        <h2 class="heading2">

+            <center>Search Existing Service Instances</center>

+        </h2>

+        <br>

+        Please search by the Subscriber name or enter Service Instance Id or Service Instance Name below:&nbsp;<br><br>

+

+        <table>

+            <tr>

+                <td style="width:30%">

+                    <div class="fn-ebz-container">

+                        <label class="fn-ebz-text-label">Subscriber Name:</label>

+                    </div>

+                </td>

+                <td style="width:30%" nowrap>

+                    <div class="fn-ebz-container" ng-init="autoGetSubs();">

+                        <!--<select name="selectedCustomer" ng-model="selectedCustomer">-->

+                        <!--<option ng-repeat="item in customerList" value="{{item.globalCustomerId}}" ng-disabled="getPermitted(item)">{{item.subscriberName}}</option>-->

+                        <!--</select>-->

+                        <select ng-model="selectedCustomer"

+                                ng-options="item.globalCustomerId as item.subscriberName for item in customerList | orderBy:'subscriberName'">

+                            <option value="">Select a subscriber</option>

+                        </select>

+

+                        &nbsp;&nbsp;<a class="btn btn-primary" ng-click="refreshSubs();"><span

+                            class="glyphicon glyphicon-refresh"></span></a>

+                    </div>

+                </td>

+

+            </tr>

+            <tr>

+                <td style="width:30%">

+                    <div class="fn-ebz-container">

+                        <select style="width: 250px;" ng-model="selectedserviceinstancetype"

+                                ng-options="stype.sinstance as stype.sinstance for stype in serviceInstanceses">

+                            <option value="">Select a Service Instance</option>

+                        </select>

+                    </div>

+                </td>

+                <td style="width:60%">

+                    <div class="fn-ebz-container">

+                        <input type="text" style="width: 350px;" name="selectedServiceInstance"

+                               ng-model="selectedServiceInstance"

+                               data-tests-id="searchForExistingInstancesText"

+                               restrict-input="{type : selectedserviceinstancetype}"/>

+                    </div>

+                </td>

+

+            </tr>

+            <tr>

+                <td>

+                <td style="width:30%">

+                    <div>

+                        <button type="submit" class="btn btn-primary" size="small"

+                                ng-click="getSubscriberDet(selectedCustomer,selectedserviceinstancetype,selectedServiceInstance);">

+                            Submit

+                        </button>

+                        </a>

+                    </div>

+                </td>

+                </td>

+            </tr>

+        </table>

+

+

+    </div>

 

 </div>

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubscriberList.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubscriberList.htm
index 6a911be..16357dd 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubscriberList.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiGetSubscriberList.htm
@@ -42,8 +42,10 @@
 				</td>

 				<td style="width:80%" nowrap>

 					<div class="fn-ebz-container" ng-init="autoGetSubs();">

-						<select  ng-model="selectedCustomer" ng-options="item.globalCustomerId as item.subscriberName for item in customerList | orderBy:'subscriberName'">

-						<option value="">Select Subscriber Name</option></select>

+						<select ng-model="selectedCustomer" data-tests-id="subscriberName">

+							<option value="">Select Subscriber Name</option>

+							<option ng-repeat="item in customerList | orderBy:'subscriberName'" ng-value="item.globalCustomerId" ng-disabled="!item.isPermitted" class="subscriberNameOption">{{item.subscriberName}}</option>

+						</select>

 					  &nbsp;&nbsp;<a class="btn btn-primary" ng-click="refreshSubs();" ><span class="glyphicon glyphicon-refresh"></span></a>

 					</div>

 				</td>

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiServiceTypes.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiServiceTypes.htm
index 6711bfa..06a53c3 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiServiceTypes.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiServiceTypes.htm
@@ -41,7 +41,7 @@
 				</td>

 				<td style="width:80%" nowrap>

 					<div class="fn-ebz-container">

-					<textarea style=" height: 15px  width: 100% border: none resize: none  overflow: hidden background-color: #ddd outline: none" ng-model="createSubscriberName">{{createSubscriberName}}</textarea>

+					<textarea style="height: 33px; width: 100%; border: none; resize: none;  overflow: hidden; background-color: #ddd; outline: none;" ng-model="createSubscriberName" data-tests-id="selectedSubscriberName">{{createSubscriberName}}</textarea>

 						

 					</div>

 				</td>

@@ -55,8 +55,10 @@
 				</td>

 				<td style="width:80%" nowrap>

 					<div class="fn-ebz-container" ng-init="getServiceTypesList()">

-						<select  ng-model="selectedServicetype" ng-options="key as value for (key , value) in serviceTypeList">

-						<option value="">Select Service Type</option></select>

+						<select ng-model="selectedServicetype" data-tests-id="serviceType">

+							<option value="">Select Service Type</option>

+							<option ng-repeat="serviceType in serviceTypeList" class="serviceTypeOption" ng-value="serviceType.id" ng-disabled="!serviceType.isPermitted">{{serviceType.name}}</option>

+						</select>

 					  &nbsp;&nbsp;<a class="btn btn-primary" ng-click="refreshServiceTypes(subId);" ><span class="glyphicon glyphicon-refresh"></span></a>

 					</div>

 				</td>

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubDetails.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubDetails.htm
index 2426f15..3471fcb 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubDetails.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubDetails.htm
@@ -54,15 +54,14 @@
 							<tr>

 								 <td att-table-body>

 									<div>

-										<a alt="View/Edit" ng-click="getAsdcModel(disData);"> View/Edit </a>

+										<a alt="View/Edit" ng-click="getAsdcModel(disData);" data-tests-id="{{'view/edit-test-data-id-' + disData['serviceInstanceId']}}" ng-bind="disData.isPermitted ? 'View/Edit' : 'View'"></a>

 									</div>

-								</td> 

-							<!--	<td att-table-body ><button type=button ng-click="getAsdcModel(disData);" att-button btn-type="primary" size="small">View/Edit</button></td> --->

+								</td>

 								<td att-table-body ng-bind="disData['globalCustomerId']"></td>

 								<td att-table-body ng-bind="disData['subscriberName']"></td>

 								<td att-table-body ng-bind="disData['serviceType']"></td>

 								<td att-table-body ng-bind="disData['serviceInstanceName']"></td>

-								<td att-table-body ng-bind="disData['serviceInstanceId']"></td>

+								<td att-table-body data-tests-id="{{'instance-id-for-name-' + disData['serviceInstanceName']}}" ng-bind="disData['serviceInstanceId']"></td>

 							</tr>

 						</tbody>

 					</table>

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubViewEdit.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubViewEdit.htm
index a7ea833..40bd148 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubViewEdit.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/aaiSubViewEdit.htm
@@ -20,128 +20,144 @@
 

 <div ng-controller="aaiSubscriberController" ng-cloak>

 

-	<div popup-window class="popupContents" ngx-show="{{popup.isVisible}}"

-		ng-cloak>

-		<div ng-include="'app/vid/scripts/view-models/creationDialog.htm'"></div>

-		<div ng-include="'app/vid/scripts/view-models/deletionDialog.htm'"></div>

-		<div ng-include="'app/vid/scripts/view-models/detailsDialog.htm'"></div>

-	</div> 

+    <div popup-window class="popupContents" ngx-show="{{popup.isVisible}}"

+         ng-cloak>

+        <div ng-include="'app/vid/scripts/view-models/creationDialog.htm'"></div>

+        <div ng-include="'app/vid/scripts/view-models/deletionDialog.htm'"></div>

+        <div ng-include="'app/vid/scripts/view-models/detailsDialog.htm'"></div>

+    </div>

 

-	<div>

-		<div class="statusLine">

-			<img src="app/vid/images/spinner.gif"

-				ng-class="{true:'aaiVisible', false:'aaiHidden'}[isSpinnerVisible]"></img>

-			<label>Status:</label><span class="status">{{status}}</span>

-		</div>

+    <div>

+        <div class="statusLine">

+            <img src="app/vid/images/spinner.gif"

+                 ng-class="{true:'aaiVisible', false:'aaiHidden'}[isSpinnerVisible]"></img>

+            <label>Status:</label><span class="status">{{status}}</span>

+        </div>

 

-		<h2 class="heading2">

-			<center>VIEW/EDIT SERVICE INSTANCE <a class="btn btn-primary btn-xs pull-right" ng-click="reloadRoute();" ><span class="glyphicon glyphicon-refresh"></span></a></center>

-			</h2>

-			</center>

-		</h2>

-		<br>

+        <h2 class="heading2">

+            <center>VIEW/EDIT SERVICE INSTANCE <a class="btn btn-primary btn-xs pull-right"

+                                                  ng-click="reloadRoute();"><span

+                    class="glyphicon glyphicon-refresh"></span></a></center>

+        </h2>

+        </center>

+        </h2>

+        <br>

 

 

-		<center>

-			<table border="1">

-				<tr>

-					<th style="text-align: center" width="33%">SUBSCRIBER:

-						{{globalCustomerId}}</th>

-					<th style="text-align: center" width="34%">SERVICE TYPE:

-						{{serviceType}}</th>

-					<th style="text-align: center" width="33%">SERVICE INSTANCE

-						ID: {{serviceInstanceId}}</th>

-				<tr>

-				<tr>

-					<td colspan='3' style="text-align: center">Service Instance

-						Name: {{serviceInstanceName || "Not defined"}}

-					</td>

-				<tr>

-			</table>

+        <center>

+            <table border="1">

+                <tr>

+                    <th style="text-align: center" width="33%">SUBSCRIBER:

+                        {{globalCustomerId}}

+                    </th>

+                    <th style="text-align: center" width="34%">SERVICE TYPE:

+                        {{serviceType}}

+                    </th>

+                    <th style="text-align: center" width="33%">SERVICE INSTANCE

+                        ID: {{serviceInstanceId}}

+                    </th>

+                <tr>

+                <tr>

+                    <td colspan='3' style="text-align: center">Service Instance

+                        Name: {{serviceInstanceName || "Not defined"}}

+                    </td>

+                <tr>

+            </table>

 

-		</center>

+        </center>

 

 

-		<br>

+        <br>

 

-		<div ng-init="autoPopulateViewEdit();">

-			<script type="text/ng-template" id="nodes_renderer.html">

-  <div ui-tree-handle data-drag-enabled="false" class="tree-node tree-node-content">

-    <a class="btn btn-success btn-xs" ng-if="node.nodes && node.nodes.length > 0" data-nodrag ng-click="toggle(this)"><span

-        class="glyphicon"

-        ng-class="{

+        <div ng-init="autoPopulateViewEdit();">

+            <script type="text/ng-template" id="nodes_renderer.html">

+                <div ui-tree-handle data-drag-enabled="false" class="tree-node tree-node-content">

+                    <a class="btn btn-success btn-xs" ng-if="node.nodes && node.nodes.length > 0" data-nodrag

+                       ng-click="toggle(this)"><span

+                            class="glyphicon"

+                            ng-class="{

           'glyphicon-chevron-right': collapsed,

           'glyphicon-chevron-down': !collapsed

         }"></span></a>

-   <div class='btn'>{{node.nodeType}}</div><div class='btn'>{{node.nodeId}}</div><div class='btn'>{{node.nodeStatus}}</div>

-	

-	<a class="pull-right btn btn-danger btn-xs" ng-if="node.delete != false" data-nodrag ng-click="showVnfDetails(node);"><span class="glyphicon glyphicon-remove"></a> 

-    <a class="pull-right btn btn-primary btn-xs" ng-if="node.info != false" data-nodrag ng-click="showVnfDetails();"><span

-        class="glyphicon glyphicon-zoom-in"></span></a>

-    

-  </div>

-  <ol ui-tree-nodes ng-model="node.nodes" ng-class="{hidden: collapsed}">

-    <li ng-repeat="node in node.nodes" ui-tree-node ng-include="'nodes_renderer.html'">

-    </li>

-  </ol>

-</script>

-			<b>EXISTING</b>

-			<div ng-controller="TreeCtrl">

-				<div>

-					<div ui-tree id="tree-root" >

-						<ol ui-tree-nodes ng-model="treeList"">

-							<li ng-repeat="node in treeList" ui-tree-node data-nodrag

-								ng-include="'nodes_renderer.html'"></li>

-						</ol>

-					</div>

-				</div>

+                    <div class='btn'>{{node.nodeType}}</div>

+                    <div class='btn'>{{node.nodeId}}</div>

+                    <div class='btn'>{{node.nodeStatus}}</div>

 

-			</div>

-			<b>AVAILABLE</b>

-			

-						<script type="text/ng-template" id="nodes_renderer2.html">

-  <div ui-tree-handle data-drag-enabled="false" class="tree-node tree-node-content" >

-    <a class="btn btn-success btn-xs" ng-if="node.nodes && node.nodes.length > 0" data-nodrag ng-click="toggle(this)"><span

-        class="glyphicon"

-        ng-class="{

+                    <a class="pull-right btn btn-danger btn-xs" ng-if="node.delete != false" data-nodrag

+                       ng-click="showVnfDetails(node);"><span class="glyphicon glyphicon-remove"></a>

+                    <a class="pull-right btn btn-primary btn-xs" ng-if="node.info != false" data-nodrag

+                       ng-click="showVnfDetails();"><span

+                            class="glyphicon glyphicon-zoom-in"></span></a>

+

+                </div>

+                <ol ui-tree-nodes ng-model="node.nodes" ng-class="{hidden: collapsed}">

+                    <li ng-repeat="node in node.nodes" ui-tree-node ng-include="'nodes_renderer.html'">

+                    </li>

+                </ol>

+            </script>

+            <b>EXISTING</b>

+            <div ng-controller="TreeCtrl">

+                <div>

+                    <div ui-tree id="tree-root">

+                        <ol ui-tree-nodes ng-model="treeList">

+                        <li ng-repeat="node in treeList" ui-tree-node data-nodrag

+                            ng-include="'nodes_renderer.html'"></li>

+                        </ol>

+                    </div>

+                </div>

+

+            </div>

+            <b>AVAILABLE</b>

+

+            <script type="text/ng-template" id="nodes_renderer2.html">

+                <div ui-tree-handle data-drag-enabled="false" class="tree-node tree-node-content">

+                    <a class="btn btn-success btn-xs" ng-if="node.nodes && node.nodes.length > 0" data-nodrag

+                       ng-click="toggle(this)"><span

+                            class="glyphicon"

+                            ng-class="{

           'glyphicon-chevron-right': collapsed,

           'glyphicon-chevron-down': !collapsed

         }"></span></a>

-    <div class='btn'>{{node.nodeType}}</div><div class='btn'>{{node.nodeId}}</div><div class='btn'>{{node.nodeStatus}}</div>

-	

-	<a class="pull-right btn btn-primary btn-xs" ng-if="node.delete != false" data-nodrag ng-click="callDelete(this)">

-		<span class="glyphicon glyphicon-plus"></span>

-	</a>

+                    <div class='btn'>{{node.nodeType}}</div>

+                    <div class='btn'>{{node.nodeId}}</div>

+                    <div class='btn'>{{node.nodeStatus}}</div>

 

-    <a class="pull-right btn btn-primary btn-xs" ng-if="node.info != false" data-nodrag ng-click="showInfoDialog(node.itemType, node.nodeId, node.nodeType);">

-		<span class="glyphicon glyphicon-zoom-in"></span>

-	</a>

-    

-  </div>

-  <ol ui-tree-nodes ng-model="node.nodes" ng-class="{hidden: collapsed}">

-    <li ng-repeat="node in node.nodes" ui-tree-node ng-include="'nodes_renderer2.html'">

-    </li>

-  </ol>

-</script>

-				

-			<div ng-controller="TreeCtrl">

-				<div>

-					<div ui-tree id="tree-root">

-						<ol ui-tree-nodes ng-model="availableTreeList">

-							<li ng-repeat="node in availableTreeList" ui-tree-node

-								data-nodrag ng-include="'nodes_renderer2.html'"></li>

-						</ol>

-					</div>

-				</div>

-			</div>

-		</div>

-		<div>

-		

-		<button type="button" " att-button

-					btn-type="primary" size="small">Show Details</button>

-		

-			<pre>

+                    <a class="pull-right btn btn-primary btn-xs" ng-if="node.delete != false" data-nodrag

+                       ng-click="callDelete(this)">

+                        <span class="glyphicon glyphicon-plus"></span>

+                    </a>

+

+                    <a class="pull-right btn btn-primary btn-xs" ng-if="node.info != false" data-nodrag

+                       ng-click="showInfoDialog(node.itemType, node.nodeId, node.nodeType);">

+                        <span class="glyphicon glyphicon-zoom-in"></span>

+                    </a>

+

+                </div>

+                <ol ui-tree-nodes ng-model="node.nodes" ng-class="{hidden: collapsed}">

+                    <li ng-repeat="node in node.nodes" ui-tree-node ng-include="'nodes_renderer2.html'">

+                    </li>

+                </ol>

+            </script>

+

+            <div ng-controller="TreeCtrl">

+                <div>

+                    <div ui-tree id="tree-root">

+                        <ol ui-tree-nodes ng-model="availableTreeList">

+                            <li ng-repeat="node in availableTreeList" ui-tree-node

+                                data-nodrag ng-include="'nodes_renderer2.html'"></li>

+                        </ol>

+                    </div>

+                </div>

+            </div>

+        </div>

+        <div>

+

+            <button type="button"

+            " att-button

+            btn-type="primary" size="small">Show Details</button>

+

+            <pre>

   				{{inventoryResponseItem | json}}

 			</pre>

-		</div>

-	</div>

+        </div>

+    </div>

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/createInstanceServiceModels.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/createInstanceServiceModels.htm
index 4d02ae8..0f69461 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/createInstanceServiceModels.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/createInstanceServiceModels.htm
@@ -19,6 +19,9 @@
   -->

 

 <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/previousVersion.htm'"/>

+</div>

 <div popup-window class="popupContents" ngx-show="{{popup.isVisible}}" ng-cloak>

 	<div ng-include="'app/vid/scripts/view-models/creationDialog.htm'"/>

 </div>

@@ -37,13 +40,13 @@
 		

 		<tr>

 				<td >

-				<div class="fn-ebz-container">	

+				<div class="fn-ebz-container">

 					<label  class="fn-ebz-text-label" >Subscriber Name :</label>

 				</div>

 				</td>

 				<td style="width:80%" nowrap>

 					<div class="fn-ebz-container">

-					<textarea style=" height: 15px  width: 100% border: none resize: none  overflow: hidden background-color: #ddd outline: none" ng-model="createSubscriberName">{{createSubscriberName}}</textarea>

+					<textarea style="height: 33px; width: 100%; border: none; resize: none;  overflow: hidden; background-color: #ddd; outline: none;" ng-model="createSubscriberName" data-tests-id="selectedSubscriberName">{{createSubscriberName}}</textarea>

 						

 					</div>

 				</td>

@@ -57,7 +60,7 @@
 				</td>

 				<td style="width:80%" nowrap>

 					<div class="fn-ebz-container">

-					<textarea style=" height: 15px  width: 100% border: none resize: none  overflow: hidden background-color: #ddd outline: none" ng-model="serviceTypeName">{{serviceTypeName}}</textarea>

+					<textarea style="height: 33px; width: 100%; border: none; resize: none;  overflow: hidden; background-color: #ddd; outline: none;" ng-model="serviceTypeName" data-tests-id="selectedServiceTypeName">{{serviceTypeName}}</textarea>

 						

 					</div>

 				</td>

@@ -68,7 +71,7 @@
 	

    	<div class="fn-ebz-container">

 		         Filter:

-		          <input class="fn-ebz-text" type="text" ng-model="searchString" size="20" style="width: 250px;">

+		          <input class="fn-ebz-text" type="text" data-tests-id="browseFilter" ng-model="searchString" size="20" style="width: 250px;">

 	</div>

 

 	<!-- <h1 class="heading1" style="margin-top:20px;">Browse SDC Service Models</h1> -->

@@ -89,14 +92,19 @@
 		    </thead>

 		    <tbody att-table-row type="body" row-repeat="service in services">

 		       <tr>

-		        	<td att-table-body ><button type=button ng-click="deployService(service,true)" att-button btn-type="primary" size="small">Deploy</button></td>

+		        	<td att-table-body ><button type=button ng-click="deployService(service,true)" data-tests-id="deploy-{{service['extra-properties']['extra-property'][1]['property-value']}}" att-button btn-type="primary" size="small">Deploy</button></td>

 	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][2]['property-value']"></td>

 	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][0]['property-value']"></td>

 	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][3]['property-value']"></td>

 	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][1]['property-value']"></td>

 	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][4]['property-value']"></td>

 	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][6]['property-value']"></td>

-	            	<td att-table-body ><button type=button ng-click="deploService(service)" att-button btn-type="primary" size="small">Previous Versions</button></td>

+	            	<td att-table-body ng-show="service['extra-properties']['extra-property'][6]['property-value'] > '1.0' ">

+	            		<button type=button ng-click="loadPreviousVersionData(service['extra-properties']['extra-property'][6]['property-value'],service['extra-properties']['extra-property'][4]['property-value'])" att-button btn-type="primary" size="small">

+	            			Previous Versions

+	            		</button>

+	            	</td>

+	            	<td att-table-body ng-show="service['extra-properties']['extra-property'][6]['property-value'] <= '1.0' ">&nbsp;</td>

 		        </tr>

 		    </tbody>	  

 		</table>

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 ff79d70..4449285 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
@@ -31,7 +31,7 @@
 

 		</div>

 		<div class="buttonRow">

-			<button ngx-enabled="{{isConfirmEnabled}}" att-button size="small"

+			<button data-tests-id="confirmButton" ngx-enabled="{{isConfirmEnabled}}" att-button size="small"

 				ng-click="confirm();">Confirm</button>

 			<button type="button" ng-click="cancel();" att-button

 				btn-type="primary" size="small">Cancel</button>

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 e4bb67f..27622ff 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
@@ -20,24 +20,24 @@
 

 <div ng-controller="InstantiationController">

 

-    <div popup-window class="popupContents" ngx-show="{{popup.isVisible}}"

-		ng-cloak>

+	<div popup-window class="popupContents" ngx-show="{{popup.isVisible}}"

+		 ng-cloak>

 		<div ng-include="'app/vid/scripts/view-models/creationDialog.htm'"></div>

 		<div ng-include="'app/vid/scripts/view-models/deletionDialog.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> 

+	</div>

 	<div ng-controller="aaiSubscriberController" ng-init="getComponentList() ">

-	<div class="statusLine" ng-class="{true:'aaiVisible', false:'aaiHidden'}[isSpinnerVisible]">

+		<div class="statusLine" ng-class="{true:'aaiVisible', false:'aaiHidden'}[isSpinnerVisible]">

 			<img src="app/vid/images/spinner.gif"></img>

 			<label>Status:</label><span class="status">{{status}}</span>

-	</div>

-	

-	<div ng-if="errorMsg != null"><font color='red'>{{errorMsg}}<pre>{{errorDetails | json}}</pre></font></div>

-	

-			<h1 class="heading1" style="margin-top: 20px;">View/Edit Service Instance</h1>

-			<a class="btn btn-primary btn-xs pull-right" ng-click="reloadRoute();" ><span class="glyphicon glyphicon-refresh"></span></a>

-		

+		</div>

+

+		<div ng-if="errorMsg != null"><font color='red'>{{errorMsg}}<pre>{{errorDetails | json}}</pre></font></div>

+

+		<h1 class="heading1" style="margin-top: 20px;">{{isPermitted == "true" ? "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>

 

 		<center>

@@ -58,191 +58,191 @@
 			</table>

 

 		</center>

-	

-	<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.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}}

-					<a ng-if="((isMacro()) || ( ( isObjectEmpty(aService.instance.vnfs) && isObjectEmpty(aService.instance.networks) ) ))" 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 && (!(isObjectEmpty(aService.convertedModel.vnfs))) && (!(aService.convertedModel.isNewFlow))">

-					  <button type="button" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">

-						Add VNF<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" ng-click="addVnfInstance(vnf, aService.instance.vnfs)">{{vnf.modelCustomizationName}}</a>

-					    	

-					  </ul>

-					</div>

-					<div class="pull-right btn-group" ng-if="aService.convertedModel.vnfs && (!(isObjectEmpty(aService.convertedModel.vnfs))) && (aService.convertedModel.isNewFlow)">

-					  <button type="button" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">

-						Add VNF<span class="caret"></span>

-					  </button>

-					  <ul class="dropdown-menu" ng-model="aService.convertedModel.vnfs">

-					    <li role="menuitem" ng-repeat="(vnfUuid, vnf) in aService.convertedModel.vnfs">

-					    	<a 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)))">

-					 <!--<div class="pull-right btn-group" ng-if="aService.model.networks">-->

-					  <button type="button" 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 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>

-				</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)" 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))">

-								

-							  <button type="button" 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" ng-click="addVfModuleInstance(vnf, vfModule)">{{vfModule.modelCustomizationName}} </a>

-							  </ul>

-							</div>

-						

-							

-							<div class="pull-right btn-group" ng-if="(hasVfModules(vnf.object) && (!(aService.convertedModel.isNewFlow)))">

-								

-							  <button type="button" 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" ng-click="addVfModuleInstance(vnf, vfModule)">{{vfModule.modelCustomizationName}}</a>

-							    </li>

-							  </ul>

-								

-							</div>

-				

-							<div class="pull-right btn-group" ng-if="(hasVolumeGroups(vnf.object) && (aService.convertedModel.isNewFlow))">

-								

-							  <button type="button" 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" ng-click="addVolumeGroupInstance(vnf, volumeGroup)">{{volumeGroup.modelCustomizationName}}</a>

-							  </ul>

-							</div>

-				

-							<div class="pull-right btn-group" ng-if="(hasVolumeGroups(vnf.object) && (!(aService.convertedModel.isNewFlow)))">

-								

-							  <button type="button" 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" ng-click="addVolumeGroupInstance(vnf, volumeGroup)">{{volumeGroup.modelCustomizationName}}</a>

-							    </li>

-							  </ul>

-								

-							</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 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.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}}

+						<a ng-if="((isMacro()) ||  (isObjectEmpty(aService.instance.vnfs) && isObjectEmpty(aService.instance.networks))) && 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 && !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 VNF<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>

+

+							</ul>

 						</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" 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="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 VNF<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)))">

+							<!--<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 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>

+					</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>

-								<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 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>

+

+								</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="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>

+

+								<!-- 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" 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>

-									</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" 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>

-				<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())" 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>

-			</li>

-		</ol>

+										<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>

+									<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>

+					<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"></span>

+								</a>

+							</div>

+						</li>

+					</ol>

+				</li>

+			</ol>

 		</div>

 	</div>

 </div>

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/msoCommit.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/msoCommit.htm
index e3f415c..4826824 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/msoCommit.htm
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/msoCommit.htm
@@ -41,7 +41,7 @@
 	<pre class="log">{{log}}</pre>

 

 	<div class="buttonRow">

-		<button ngx-enabled="{{isCloseEnabled}}" att-button size="small"

+		<button data-tests-id="msoCommitDialogCloseButton" ngx-enabled="{{isCloseEnabled}}" att-button size="small"

 			ng-click="close();">Close</button>

 	</div>

 </div>

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/view-models/previousVersion.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/previousVersion.htm
new file mode 100644
index 0000000..dd60463
--- /dev/null
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/previousVersion.htm
@@ -0,0 +1,44 @@
+<div ng-controller="previousVersionContoller">
+
+	<div ng-show="isTableDialogVisible">
+		<div class="titleLine">
+			<img src="app/vid/images/spinner.gif"
+				ngx-visible="{{isTableSpinnerVisible}}"></img>
+			<h3>{{componentName}} - {{createType}}</h3>
+		</div>
+
+		<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">
+		    <thead  att-table-row type="header">
+				<tr>
+					<th att-table-header key="action">Action</th>
+					<th att-table-header key="serviceInstanceName">Service Name</th>
+					<th att-table-header key="serviceDescription">Service Description</th>
+					<th att-table-header key="serviceType">Service Type</th>
+		            <th att-table-header key="serviceUuid">Service UUID</th>
+		            <th att-table-header key="serviceInvariantUuid">Service Invariant UUID</th>
+		            <th att-table-header key="serviceVersion">Service Version</th>
+		        </tr>
+		    </thead>
+		    <tbody att-table-row type="body" row-repeat="service in tableData">
+		        <tr>
+		        	<td att-table-body ><button type=button ng-click="deployService(service,true)" att-button btn-type="primary" size="small">Deploy</button></td>
+	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][2]['property-value']"></td>
+	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][0]['property-value']"></td>
+	            	<td att-table-body ng-bind="serviceType"></td>
+	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][1]['property-value']"></td>
+	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][4]['property-value']"></td>
+	            	<td att-table-body ng-bind="service['extra-properties']['extra-property'][6]['property-value']"></td>
+		        </tr>     
+		    </tbody>	  
+		</table>
+		
+		
+		<div class="buttonRow">
+			<button type="button" ng-click="cancelTable();" 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/previousVersionDialog.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/previousVersionDialog.htm
new file mode 100644
index 0000000..2912c70
--- /dev/null
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/previousVersionDialog.htm
@@ -0,0 +1,48 @@
+<div ng-controller="previousVersionDialogController">
+
+	<div ng-show="isTableDialogVisible">
+		<div class="titleLine">
+			<img src="app/vid/images/spinner.gif"
+				ngx-visible="{{isTableSpinnerVisible}}"></img>
+			<h3>{{componentName}} - {{createType}}</h3>
+		</div>
+
+		<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">
+		    <thead  att-table-row type="header">
+				<tr>
+					<th att-table-header key="action">Action</th>
+					<th att-table-header key="uuid">UUID</th>
+					<th att-table-header key="invariantUUID">Invariant UUID</th>
+					<th att-table-header key="name">Name</th>
+		            <th att-table-header key="version">Version</th>
+		            <th att-table-header key="category">Category</th>
+		            <th att-table-header key="distributionStatus">Distribution Status</th>
+		            <th att-table-header key="lastUpdaterUserId">Last Updated By</th>
+		            <th att-table-header key="toscaModelUrl">Tosca Model</th>
+		        </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>
+	            	<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>
+	            	<td att-table-body ng-bind="row['version']"></td>
+	            	<td att-table-body ng-bind="row['category']"></td>
+	            	<td att-table-body ng-bind="row['distributionStatus']"></td>
+	            	<td att-table-body ng-bind="row['lastUpdaterUserId']"></td>
+	            	<td att-table-body ng-bind="row['toscaModelUrl']"></td>
+		        </tr>     
+		    </tbody>	  
+		</table>
+		
+		
+		<div class="buttonRow">
+			<button type="button" ng-click="cancelTable();" 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/serviceModels.htm b/vid-app-common/src/main/webapp/app/vid/scripts/view-models/serviceModels.htm
index 00b8972..3cba871 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
@@ -19,6 +19,9 @@
   -->

 

 <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'"/>

+</div>

 <div popup-window class="popupContents" ngx-show="{{popup.isVisible}}" ng-cloak>

 	<div ng-include="'app/vid/scripts/view-models/creationDialog.htm'"/>

 </div>

@@ -34,7 +37,7 @@
 

 	<div class="fn-ebz-container">

 		         Filter:

-		          <input class="fn-ebz-text" type="text" ng-model="searchString" size="20" style="width: 250px;">

+		          <input class="fn-ebz-text" data-tests-id="browseFilter" type="text" ng-model="searchString" size="20" style="width: 250px;">

 	</div>

 

 	<h1 class="heading1" style="margin-top:20px;">Browse SDC Service Models</h1>

@@ -57,7 +60,7 @@
 		    </thead>

 		    <tbody att-table-row type="body" row-repeat="service in services">

 		        <tr>

-		        	<td att-table-body ><button type=button ng-click="deployService(service)" att-button btn-type="primary" size="small">Deploy</button></td>

+		        	<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>

@@ -66,7 +69,8 @@
 	            	<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 ><button type=button ng-click="deloyService(service)" att-button btn-type="primary" size="small">Previous Versions</button></td>

+					<td att-table-body ng-show="service['version'] > '1.0' "><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['version'] <= '1.0' ">&nbsp;</td>

 		        </tr>     

 		    </tbody>	  

 		</table>

diff --git a/vid-app-common/src/main/webapp/app/vid/test/testMso.js b/vid-app-common/src/main/webapp/app/vid/test/testMso.js
index 884ba8d..f6ebed4 100755
--- a/vid-app-common/src/main/webapp/app/vid/test/testMso.js
+++ b/vid-app-common/src/main/webapp/app/vid/test/testMso.js
@@ -41,7 +41,7 @@
 		    setTestMsoMode($cookieStore.get(TEST_MODE_COOKIE));

 		    PropertyService.setMsoMaxPollingIntervalMsec(1000);

 		    PropertyService.setMsoMaxPolls(7);

-		    PropertyService.setServerResponseTimeoutMsec(10000);

+		    PropertyService.setServerResponseTimeoutMsec(30000);

 		};

 

 		$scope.testMsoModeChanged = function() {

diff --git a/vid-app-common/src/main/webapp/app/vid/test/testViewEdit.js b/vid-app-common/src/main/webapp/app/vid/test/testViewEdit.js
index 73da4db..7ddc3de 100755
--- a/vid-app-common/src/main/webapp/app/vid/test/testViewEdit.js
+++ b/vid-app-common/src/main/webapp/app/vid/test/testViewEdit.js
@@ -90,7 +90,7 @@
 	PropertyService.setAsdcBaseUrl("testasdc");

 	PropertyService.setMsoMaxPollingIntervalMsec(1000);

 	PropertyService.setMsoMaxPolls(7);

-	PropertyService.setServerResponseTimeoutMsec(10000);

+	PropertyService.setServerResponseTimeoutMsec(30000);

     };

 

     $scope.testMsoModeChanged = function() {