Merge "add junit for AuthenticationMethodFactory"
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfig.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfig.java
index ef37f9f..5d16a95 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfig.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/cloud/CloudConfig.java
@@ -46,7 +46,6 @@
  *
  * This class also contains methods to query cloud sites and/or identity
  * services by ID.
- *
  */
 
 @JsonRootName("cloud_config")
@@ -89,21 +88,20 @@
      * individual entries to try and find one with a CLLI that matches the ID
      * and an AIC version of 2.5.
      *
-     * @param id
-     *            the ID to match
-     * @return a CloudSite, or null of no match found
+     * @param id the ID to match
+     * @return an Optional of CloudSite object.
      */
-    public synchronized CloudSite getCloudSite(String id) {
-        if (id != null) {
-            if (cloudSites.containsKey(id)) {
-                return cloudSites.get(id);
-            }
-            // check for id == CLLI now as well
-            return getCloudSiteWithClli(id);
+    public synchronized Optional<CloudSite> getCloudSite(String id) {
+        if (id == null) {
+            return Optional.empty();
         }
-        return null;
+        if (cloudSites.containsKey(id)) {
+            return Optional.ofNullable(cloudSites.get(id));
+        }
+        return Optional.ofNullable(getCloudSiteWithClli(id));
     }
 
+
     private CloudSite getCloudSiteWithClli(String clli) {
         Optional <CloudSite> cloudSiteOptional = cloudSites.values().stream().filter(cs ->
                 cs.getClli() != null && clli.equals(cs.getClli()) && (CLOUD_SITE_VERSION.equals(cs.getAic_version())))
@@ -111,7 +109,6 @@
         return cloudSiteOptional.orElse(getDefaultCloudSite(clli));
     }
 
-    // TODO in future the result will be optional
     private CloudSite getDefaultCloudSite(String clli) {
         Optional<CloudSite> cloudSiteOpt = cloudSites.values().stream()
                 .filter(cs -> cs.getId().equalsIgnoreCase(DEFAULT_CLOUD_SITE_ID)).findAny();
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoCommonUtils.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoCommonUtils.java
index 269f6b0..7d6de31 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoCommonUtils.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoCommonUtils.java
@@ -129,6 +129,7 @@
     					Thread.sleep (retryDelay * 1000L);
     				} catch (InterruptedException e1) {
                         logger.debug ("Thread interrupted while sleeping", e1);
+						Thread.currentThread().interrupt();
     				}
     			}
         		else
@@ -144,6 +145,7 @@
         				Thread.sleep (retryDelay * 1000L);
         			} catch (InterruptedException e1) {
                         logger.debug ("Thread interrupted while sleeping", e1);
+						Thread.currentThread().interrupt();
         			}
         		}
         		else
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatEnvironmentEntry.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatEnvironmentEntry.java
index 3aa77c2..69da437 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatEnvironmentEntry.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatEnvironmentEntry.java
@@ -21,212 +21,83 @@
 
 package org.openecomp.mso.openstack.utils;
 
-
-
-import java.util.HashSet;
-import java.util.ArrayList;
 import java.util.Set;
-import org.openecomp.mso.db.catalog.beans.HeatTemplateParam;
 import org.openecomp.mso.logger.MsoLogger;
 
 public class MsoHeatEnvironmentEntry {
 
-    private static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA);
-    
-	private Set<MsoHeatEnvironmentParameter> parameters = null;
-	private Set<MsoHeatEnvironmentResource> resources = null;
-	private StringBuilder rawEntry = null;
+	private static final MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.RA);
+	private Set<MsoHeatEnvironmentParameter> parameters;
+	private String rawEntry;
 	private boolean valid = true;
-	private String errorString = null;
-	private StringBuilder resourceRegistryEntryRaw = null;
-	
-	public MsoHeatEnvironmentEntry() {
-		super();
+	private String errorString;
+	private String resourceRegistryEntryRaw;
+
+	private MsoHeatEnvironmentEntry(String rawEntry) {
+		this.rawEntry = rawEntry;
 	}
-	
-	public MsoHeatEnvironmentEntry(StringBuilder sb) {
-		this();
-		this.rawEntry = sb;
-		this.processRawEntry();
+
+	private MsoHeatEnvironmentEntry(Set<MsoHeatEnvironmentParameter> parameters, String rawEntry, boolean valid,
+			String errorString, String resourceRegistryEntryRaw) {
+		this.parameters = parameters;
+		this.rawEntry = rawEntry;
+		this.valid = valid;
+		this.errorString = errorString;
+		this.resourceRegistryEntryRaw = resourceRegistryEntryRaw;
 	}
-	
-	private void processRawEntry() {
-		try {
-			if (this.rawEntry == null || "".equals(this.rawEntry))
-				return;
-			byte[] b = this.rawEntry.toString().getBytes();
-			MsoYamlEditorWithEnvt yaml = new MsoYamlEditorWithEnvt(b);
-			this.parameters = yaml.getParameterListFromEnvt();
-			//this.resources = yaml.getResourceListFromEnvt();
-			StringBuilder sb = this.getResourceRegistryRawEntry();
-			if (sb == null) {
-				this.resourceRegistryEntryRaw = new StringBuilder("");
-			} else {
-				this.resourceRegistryEntryRaw = sb;
-			}
-		} catch (Exception e) {
-		    LOGGER.debug("Exception:", e);
-			this.valid = false;
-			this.errorString = e.getMessage();
-			//e.printStackTrace();
-		}
-	}
-	
+
 	public boolean isValid() {
 		return this.valid;
 	}
 	public String getErrorString() {
 		return this.errorString;
 	}
-	
-	public Set<MsoHeatEnvironmentParameter> getParameters() {
-		return this.parameters;
-	}
-	public Set<MsoHeatEnvironmentResource> getResources() {
-		return this.resources;
-	}
-	public void setParameters(Set<MsoHeatEnvironmentParameter> paramSet) {
-		if (paramSet == null) {
-			this.parameters = null;
-		} else {
-			this.parameters = paramSet;
-		}
-	}
-	public void setResources(Set<MsoHeatEnvironmentResource> resourceSet) {
-		if (resourceSet == null) {
-			this.resources = null;
-		} else {
-			this.resources = resourceSet;
-		}
-	}
-	
-	public void addParameter(MsoHeatEnvironmentParameter hep) {
-		if (this.parameters == null) {
-			this.parameters = new HashSet<>();
-		}
-		this.parameters.add(hep);
-	}
-	public void addResource(MsoHeatEnvironmentResource her) {
-		if (this.resources == null) {
-			this.resources = new HashSet<>();
-		}
-		this.resources.add(her);
-	}
-	
-	public int getNumberOfParameters() {
-		return this.parameters.size();
-	}
-	public int getNumberOfResources() {
-		return this.resources.size();
-	}
-	
-	public boolean hasResources() {
-		if (this.resources != null && this.resources.size() > 0) {
-			return true;
-		} 
-		return false;
-	}
-	public boolean hasParameters() {
-		if (this.parameters != null && this.parameters.size() > 0) {
-			return true;
-		}
-		return false;
-	}
-	
+
 	public boolean containsParameter(String paramName) {
-		boolean contains = false;
 		if (this.parameters == null || this.parameters.size() < 1) {
 			return false;
 		}
 		if (this.parameters.contains(new MsoHeatEnvironmentParameter(paramName))) {
-			contains = true;
-		}
-		return contains;
-	}
-	
-	public boolean containsParameter(String paramName, String paramAlias) {
-		if (this.containsParameter(paramName)) {
-			return true;
-		}
-		if (this.containsParameter(paramAlias)) {
 			return true;
 		}
 		return false;
 	}
-	
-	public StringBuilder toFullStringExcludeNonParams(Set<HeatTemplateParam> params) {
-		// Basically give back the envt - but exclude the params that aren't in the HeatTemplate 
-		
-		StringBuilder sb = new StringBuilder();
-		ArrayList<String> paramNameList = new ArrayList<String>(params.size());
-		for (HeatTemplateParam htp : params) {
-			paramNameList.add(htp.getParamName());
-		}
-		
-		if (this.hasParameters()) {
-			sb.append("parameters:\n");
-			for (MsoHeatEnvironmentParameter hep : this.parameters) {
-				String paramName = hep.getName();
-				if (paramNameList.contains(paramName)) {
-					// This parameter *is* in the Heat Template - so include it:
-					sb.append("  " + hep.getName() + ": " + hep.getValue() + "\n");
-					// New - 1607 - if any of the params mapped badly - JUST RETURN THE ORIGINAL ENVT!
-					if (hep.getValue().startsWith("_BAD")) {
-						return this.rawEntry;
-					}
-				} 
-			}
-			sb.append("\n");
-		}
-//		if (this.hasResources()) {
-//			sb.append("resource_registry:\n");
-//			for (MsoHeatEnvironmentResource her : this.resources) {
-//				sb.append("   \"" + her.getName() + "\": " + her.getValue() + "\n");
-//			}
-//		}
-		sb.append("\n");
-		sb.append(this.resourceRegistryEntryRaw);				
-		return sb;
-	}
-	
-	public StringBuilder toFullString() {
-		StringBuilder sb = new StringBuilder();
-		
-		if (this.hasParameters()) {
-			sb.append("parameters:\n");
-			for (MsoHeatEnvironmentParameter hep : this.parameters) {
-				sb.append("   " + hep.getName() + ":  " + hep.getValue() + "\n");
-			}
-			sb.append("\n");
-		}
-//		if (this.hasResources()) {
-//			sb.append("resource_registry:\n");
-//			for (MsoHeatEnvironmentResource her : this.resources) {
-//				sb.append("   \"" + her.getName() + "\": " + her.getValue() + "\n");
-//			}
-//		}
-		sb.append("\n");
-		sb.append(this.resourceRegistryEntryRaw);			
-		return sb;
+
+	@Override
+	public String toString() {
+		final StringBuilder sb = new StringBuilder("MsoHeatEnvironmentEntry{");
+		sb.append("parameters=").append(parameters);
+		sb.append(", resourceRegistryEntryRaw='").append(resourceRegistryEntryRaw).append('\'');
+		sb.append('}');
+		return sb.toString();
 	}
 
-	public StringBuilder getRawEntry() {
-		return this.rawEntry;
+	public String getRawEntry() {
+		return rawEntry;
 	}
 	
-	private StringBuilder getResourceRegistryRawEntry() {
-		
-		if (this.rawEntry == null) {
-			return null;
+	private static String getResourceRegistryRawEntry(String rawEntry) {
+		int indexOf = rawEntry.indexOf("resource_registry:");
+		if (indexOf < 0) {
+			return "";
 		}
-		
-		StringBuilder sb = new StringBuilder();
-		int indexOf = this.rawEntry.indexOf("resource_registry:");
-		if (indexOf < 0) { // no resource_registry:
-			return null;
-		}
-		sb.append(this.rawEntry.substring(indexOf));
-		return sb;
+		return rawEntry.substring(indexOf);
 	}
-	
+
+	public static MsoHeatEnvironmentEntry create(String rawEntry) {
+		if (rawEntry == null || rawEntry.isEmpty()) {
+			return new MsoHeatEnvironmentEntry(rawEntry);
+		}
+		try {
+			Set<MsoHeatEnvironmentParameter> parameters = new MsoYamlEditorWithEnvt(rawEntry.getBytes())
+					.getParameterListFromEnvt();
+			return new MsoHeatEnvironmentEntry(parameters, rawEntry, true, null,
+					getResourceRegistryRawEntry(rawEntry));
+		} catch (Exception e) {
+			LOGGER.debug(String.format("An exception occurred during processing the following raw entry: %s", rawEntry),
+					e);
+			return new MsoHeatEnvironmentEntry(null, rawEntry, false, e.getMessage(), null);
+		}
+	}
+
 }
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatUtils.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatUtils.java
index 8f21cfb..acc6d72 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatUtils.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatUtils.java
@@ -258,7 +258,7 @@
      * @param cloudSiteId The cloud (may be a region) in which to create the stack.
      * @param tenantId The Openstack ID of the tenant in which to create the Stack
      * @param stackName The name of the stack to create
-     * @param stackTemplate The Heat template
+     * @param heatTemplate The Heat template
      * @param stackInputs A map of key/value inputs
      * @param pollForCompletion Indicator that polling should be handled in Java vs. in the client
      * @param environment An optional yaml-format string to specify environmental parameters
@@ -309,10 +309,8 @@
         }
 
         // Obtain the cloud site information where we will create the stack
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
-            throw new MsoCloudSiteNotFound (cloudSiteId);
-        }
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
         LOGGER.debug("Found: " + cloudSite.toString());
         // Get a Heat client. They are cached between calls (keyed by tenantId:cloudId)
         // This could throw MsoTenantNotFound or MsoOpenstackException (both propagated)
@@ -632,10 +630,8 @@
         LOGGER.debug ("Query HEAT stack: " + stackName + " in tenant " + tenantId);
 
         // Obtain the cloud site information where we will create the stack
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
-            throw new MsoCloudSiteNotFound (cloudSiteId);
-        }
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
         LOGGER.debug("Found: " + cloudSite.toString());
 
         // Get a Heat client. They are cached between calls (keyed by tenantId:cloudId)
@@ -696,10 +692,8 @@
                                   String stackName,
                                   boolean pollForCompletion) throws MsoException {
         // Obtain the cloud site information where we will create the stack
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
-            throw new MsoCloudSiteNotFound (cloudSiteId);
-        }
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
         LOGGER.debug("Found: " + cloudSite.toString());
 
         // Get a Heat client. They are cached between calls (keyed by tenantId:cloudId)
@@ -838,11 +832,8 @@
      */
     public List <StackInfo> queryAllStacks (String tenantId, String cloudSiteId) throws MsoException {
         // Obtain the cloud site information where we will create the stack
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
-            throw new MsoCloudSiteNotFound (cloudSiteId);
-        }
-
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
         // Get a Heat client. They are cached between calls (keyed by tenantId:cloudId)
         Heat heatClient = getHeatClient (cloudSite, tenantId);
 
@@ -950,8 +941,6 @@
      * tenantID + cloudId so that it can be reused without reauthenticating with
      * Openstack every time.
      *
-     * @param tenantName
-     * @param cloudId
      * @return an authenticated Heat object
      */
     public Heat getHeatClient (CloudSite cloudSite, String tenantId) throws MsoException {
@@ -1038,8 +1027,6 @@
      * the same Tenant Name is repeatedly used for creation/deletion.
      * <p>
      *
-     * @param tenantName
-     * @param cloudId
      */
     public static void expireHeatClient (String tenantId, String cloudId) {
         String cacheKey = cloudId + ":" + tenantId;
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatUtilsWithUpdate.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatUtilsWithUpdate.java
index dba52d4..2465b30 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatUtilsWithUpdate.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoHeatUtilsWithUpdate.java
@@ -21,7 +21,6 @@
 
 package org.openecomp.mso.openstack.utils;
 
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -160,7 +159,7 @@
      * @param tenantId The Openstack ID of the tenant in which to create the Stack
      * @param cloudSiteId The cloud identifier (may be a region) in which to create the tenant.
      * @param stackName The name of the stack to update
-     * @param stackTemplate The Heat template
+     * @param heatTemplate The Heat template
      * @param stackInputs A map of key/value inputs
      * @param pollForCompletion Indicator that polling should be handled in Java vs. in the client
      * @param environment An optional yaml-format string to specify environmental parameters
@@ -194,10 +193,8 @@
         }
 
         // Obtain the cloud site information where we will create the stack
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
-            throw new MsoCloudSiteNotFound (cloudSiteId);
-        }
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
         // Get a Heat client. They are cached between calls (keyed by tenantId:cloudId)
         // This could throw MsoTenantNotFound or MsoOpenstackException (both propagated)
         Heat heatClient = getHeatClient (cloudSite, tenantId);
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoKeystoneUtils.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoKeystoneUtils.java
index ee89840..be36d67 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoKeystoneUtils.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoKeystoneUtils.java
@@ -26,6 +26,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import java.util.Optional;
 import org.openecomp.mso.cloud.CloudIdentity;
 import org.openecomp.mso.cloud.CloudSite;
 import org.openecomp.mso.logger.MsoAlarmLogger;
@@ -58,7 +59,7 @@
     // token will be used until it expires.
     //
     // The cache key is "cloudId"
-    private static Map <String, KeystoneCacheEntry> adminClientCache = new HashMap <String, KeystoneCacheEntry> ();
+    private static Map <String, KeystoneCacheEntry> adminClientCache = new HashMap<>();
 
 	private static MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA);
 	String msoPropID;
@@ -92,13 +93,12 @@
                                 Map <String, String> metadata,
                                 boolean backout) throws MsoException {
         // Obtain the cloud site information where we will create the tenant
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
+        Optional<CloudSite> cloudSiteOpt = cloudConfig.getCloudSite(cloudSiteId);
+        if (!cloudSiteOpt.isPresent()) {
         	LOGGER.error(MessageEnum.RA_CREATE_TENANT_ERR, "MSOCloudSite not found", "", "", MsoLogger.ErrorCode.DataError, "MSOCloudSite not found");
             throw new MsoCloudSiteNotFound (cloudSiteId);
         }
-        Keystone keystoneAdminClient = getKeystoneAdminClient (cloudSite);
-
+        Keystone keystoneAdminClient = getKeystoneAdminClient(cloudSiteOpt.get());
         Tenant tenant = null;
         try {
             // Check if the tenant already exists
@@ -129,7 +129,7 @@
         // Add MSO User to the tenant as a member and
         // apply tenant metadata if supported by the cloud site
         try {
-            CloudIdentity cloudIdentity = cloudSite.getIdentityService ();
+            CloudIdentity cloudIdentity = cloudSiteOpt.get().getIdentityService ();
 
             User msoUser = findUserByNameOrId (keystoneAdminClient, cloudIdentity.getMsoId ());
             Role memberRole = findRoleByNameOrId (keystoneAdminClient, cloudIdentity.getMemberRole ());
@@ -197,10 +197,8 @@
      */
     public MsoTenant queryTenant (String tenantId, String cloudSiteId) throws MsoException {
         // Obtain the cloud site information where we will query the tenant
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
-            throw new MsoCloudSiteNotFound (cloudSiteId);
-        }
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
 
         Keystone keystoneAdminClient = getKeystoneAdminClient (cloudSite);
 
@@ -247,10 +245,8 @@
      */
     public MsoTenant queryTenantByName (String tenantName, String cloudSiteId) throws MsoException {
         // Obtain the cloud site information where we will query the tenant
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
-            throw new MsoCloudSiteNotFound (cloudSiteId);
-        }
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
         Keystone keystoneAdminClient = getKeystoneAdminClient (cloudSite);
 
         try {
@@ -294,10 +290,8 @@
      */
     public boolean deleteTenant (String tenantId, String cloudSiteId) throws MsoException {
         // Obtain the cloud site information where we will query the tenant
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
-            throw new MsoCloudSiteNotFound (cloudSiteId);
-        }
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
         Keystone keystoneAdminClient = getKeystoneAdminClient (cloudSite);
 
         try {
@@ -326,59 +320,6 @@
         return true;
     }
 
-    /**
-     * Delete the specified Tenant (by Name) in the given cloud. This method returns true or
-     * false, depending on whether the tenant existed and was successfully deleted, or if
-     * the tenant already did not exist. Both cases are treated as success (no Exceptions).
-     * <p>
-     * Note for the AIC Cloud (DCP/LCP): all admin requests go to the centralized identity
-     * service in DCP. So deleting a tenant from one cloudSiteId will remove it from all
-     * sites managed by that identity service.
-     * <p>
-     *
-     * @param tenantName The name of the tenant to delete
-     * @param cloudSiteId The cloud identifier from which to delete the tenant.
-     * @return true if the tenant was deleted, false if the tenant did not exist.
-     * @throws MsoOpenstackException If the Openstack API call returns an exception.
-     */
-    public boolean deleteTenantByName (String tenantName, String cloudSiteId) throws MsoException {
-        // Obtain the cloud site information where we will query the tenant
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
-            throw new MsoCloudSiteNotFound (cloudSiteId);
-        }
-        Keystone keystoneAdminClient = getKeystoneAdminClient (cloudSite);
-
-        try {
-            // Need the Tenant ID to delete (can't directly delete by name)
-            Tenant tenant = findTenantByName (keystoneAdminClient, tenantName);
-            if (tenant == null) {
-                // OK if tenant already doesn't exist.
-            	LOGGER.error(MessageEnum.RA_TENANT_NOT_FOUND, tenantName, cloudSiteId, "", "", MsoLogger.ErrorCode.DataError, "Tenant not found");
-                return false;
-            }
-
-            // Execute the Delete. It has no return value.
-            OpenStackRequest <Void> request = keystoneAdminClient.tenants ().delete (tenant.getId ());
-            executeAndRecordOpenstackRequest (request, msoProps);
-
-            LOGGER.debug ("Deleted Tenant " + tenant.getId () + " (" + tenant.getName () + ")");
-
-            // Clear any cached clients. Not really needed, ID will not be reused.
-            MsoHeatUtils.expireHeatClient (tenant.getId (), cloudSiteId);
-            MsoNeutronUtils.expireNeutronClient (tenant.getId (), cloudSiteId);
-        } catch (OpenStackBaseException e) {
-            // Note: It doesn't seem to matter if tenant doesn't exist, no exception is thrown.
-            // Convert Keystone OpenStackResponseException to MsoOpenstackException
-            throw keystoneErrorToMsoException (e, "DeleteTenant");
-        } catch (RuntimeException e) {
-            // Catch-all
-            throw runtimeExceptionToMsoException (e, "DeleteTenant");
-        }
-
-        return true;
-    }
-
     // -------------------------------------------------------------------
     // PRIVATE UTILITY FUNCTIONS FOR USE WITHIN THIS CLASS
 
@@ -463,29 +404,6 @@
     }
 
     /*
-     * Find a tenant (or query its existance) by its Name or Id. Check first against the
-     * ID. If that fails, then try by name.
-     *
-     * @param adminClient an authenticated Keystone object
-     *
-     * @param tenantName the tenant name or ID to query
-     *
-     * @return a Tenant object or null if not found
-     */
-    public Tenant findTenantByNameOrId (Keystone adminClient, String tenantNameOrId) {
-        if (tenantNameOrId == null) {
-            return null;
-        }
-
-        Tenant tenant = findTenantById (adminClient, tenantNameOrId);
-        if (tenant == null) {
-            tenant = findTenantByName (adminClient, tenantNameOrId);
-        }
-
-        return tenant;
-    }
-
-    /*
      * Find a tenant (or query its existance) by its Id.
      *
      * @param adminClient an authenticated Keystone object
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoNeutronUtils.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoNeutronUtils.java
index ad3eae4..50a5946 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoNeutronUtils.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoNeutronUtils.java
@@ -7,9 +7,9 @@
  * 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.
@@ -43,7 +43,6 @@
 import org.openecomp.mso.openstack.exceptions.MsoNetworkAlreadyExists;
 import org.openecomp.mso.openstack.exceptions.MsoNetworkNotFound;
 import org.openecomp.mso.openstack.exceptions.MsoOpenstackException;
-import org.openecomp.mso.openstack.exceptions.MsoTenantNotFound;
 import com.woorea.openstack.base.client.OpenStackBaseException;
 import com.woorea.openstack.base.client.OpenStackConnectException;
 import com.woorea.openstack.base.client.OpenStackRequest;
@@ -71,7 +70,7 @@
 
 	private static MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA);
 	private String msoPropID;
-	
+
 	public enum NetworkType {
 		BASIC, PROVIDER, MULTI_PROVIDER
 	};
@@ -99,13 +98,11 @@
 	 * @throws MsoCloudSiteNotFound Thrown if the cloudSite is invalid or unknown
 	 */
 	public NetworkInfo createNetwork (String cloudSiteId, String tenantId, NetworkType type, String networkName, String provider, List<Integer> vlans)
-		throws MsoException, MsoNetworkAlreadyExists, MsoCloudSiteNotFound
+            throws MsoException
 	{
 		// Obtain the cloud site information where we will create the stack
-		CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId);
-		if (cloudSite == null) {
-			throw new MsoCloudSiteNotFound(cloudSiteId);
-		}
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
 
 		Quantum neutronClient = getNeutronClient (cloudSite, tenantId);
 
@@ -177,19 +174,15 @@
 	 * @throws MsoOpenstackException Thrown if the Openstack API call returns an exception
 	 * @throws MsoCloudSiteNotFound
 	 */
-	public NetworkInfo queryNetwork (String networkNameOrId, String tenantId, String cloudSiteId)
-		throws MsoException, MsoCloudSiteNotFound
+    public NetworkInfo queryNetwork(String networkNameOrId, String tenantId, String cloudSiteId) throws MsoException
 	{
 		LOGGER.debug("In queryNetwork");
 
 		// Obtain the cloud site information
-		CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId);
-		if (cloudSite == null) {
-			throw new MsoCloudSiteNotFound(cloudSiteId);
-		}
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
 
 		Quantum neutronClient = getNeutronClient (cloudSite, tenantId);
-
 		// Check if the network exists and return its info
 		try {
 			Network network = findNetworkByNameOrId (neutronClient, networkNameOrId);
@@ -215,24 +208,20 @@
 	 * Delete the specified Network (by ID) in the given cloud.
 	 * If the network does not exist, success is returned.
 	 * <p>
-	 * @param networkNameOrId The name or Openstack ID of the network to delete
-	 * @param cloudId The cloud identifier (may be a region) from which to delete the network.
+	 * @param networkId Openstack ID of the network to delete
+	 * @param tenantId The Openstack tenant.
+	 * @param cloudSiteId The cloud identifier (may be a region) from which to delete the network.
 	 * @return true if the network was deleted, false if the network did not exist
 	 * @throws MsoOpenstackException If the Openstack API call returns an exception, this local
 	 * exception will be thrown.
 	 * @throws MsoCloudSiteNotFound
 	 */
-	public boolean deleteNetwork (String networkId, String tenantId, String cloudSiteId)
-		throws MsoException, MsoCloudSiteNotFound
+    public boolean deleteNetwork(String networkId, String tenantId, String cloudSiteId) throws MsoException
 	{
 		// Obtain the cloud site information where we will create the stack
-		CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId);
-		if (cloudSite == null) {
-			throw new MsoCloudSiteNotFound(cloudSiteId);
-		}
-
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
 		Quantum neutronClient = getNeutronClient (cloudSite, tenantId);
-
 		try {
 			// Check that the network exists.
 			Network network = findNetworkById (neutronClient, networkId);
@@ -273,7 +262,7 @@
 	 * to manage the virtual networking).
 	 *
 	 * @param cloudSiteId The cloud site ID (may be a region) in which to update the network.
-	 * @param the Openstack ID of the tenant in which to update the network
+	 * @param tenantId Openstack ID of the tenant in which to update the network
 	 * @param networkId The unique Openstack ID of the network to be updated
 	 * @param type The network type (Basic, Provider, Multi-Provider)
 	 * @param provider The provider network name.  This should not change.
@@ -284,15 +273,12 @@
 	 * @throws MsoCloudSiteNotFound
 	 */
 	public NetworkInfo updateNetwork (String cloudSiteId, String tenantId, String networkId, NetworkType type, String provider, List<Integer> vlans)
-		throws MsoException, MsoNetworkNotFound, MsoCloudSiteNotFound
+            throws MsoException
 	{
 		// Obtain the cloud site information where we will create the stack
-		CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId);
-		if (cloudSite == null) {
-			throw new MsoCloudSiteNotFound(cloudSiteId);
-		}
+        CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+                () -> new MsoCloudSiteNotFound(cloudSiteId));
 		Quantum neutronClient = getNeutronClient (cloudSite, tenantId);
-
 		// Check that the network exists
 		Network network = findNetworkById (neutronClient, networkId);
 
@@ -359,8 +345,7 @@
 	 * @param tenantId - Openstack tenant ID
 	 * @return an authenticated Quantum object
 	 */
-	private Quantum getNeutronClient (CloudSite cloudSite, String tenantId)
-		throws MsoTenantNotFound, MsoException
+    private Quantum getNeutronClient(CloudSite cloudSite, String tenantId) throws MsoException
 	{
 		String cloudId = cloudSite.getId();
 
@@ -440,9 +425,6 @@
 	 * the KeystoneClient in case where a tenant is deleted.  In that case,
 	 * all cached credentials must be purged so that fresh authentication is
 	 * done on subsequent calls.
-	 * <p>
-	 * @param tenantName
-	 * @param cloudId
 	 */
 	public static void expireNeutronClient (String tenantId, String cloudId) {
 		String cacheKey = cloudId + ":" + tenantId;
@@ -602,6 +584,6 @@
 	 * This may be useful if cached credentials get out of sync.
 	 */
 	public static void neutronCacheReset () {
-		neutronClientCache = new HashMap<String,NeutronCacheEntry>();
+		neutronClientCache = new HashMap<>();
 	}
 }
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoTenantUtils.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoTenantUtils.java
index 4a19828..2cd4597 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoTenantUtils.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoTenantUtils.java
@@ -21,27 +21,18 @@
 package org.openecomp.mso.openstack.utils;
 
 
-import java.io.Serializable;
-import java.util.Calendar;
-import java.util.HashMap;
 import java.util.Map;
-
 import org.openecomp.mso.cloud.CloudConfig;
 import org.openecomp.mso.cloud.CloudConfigFactory;
 import org.openecomp.mso.cloud.CloudIdentity;
-import org.openecomp.mso.logger.MsoAlarmLogger;
-import org.openecomp.mso.logger.MsoLogger;
 import org.openecomp.mso.logger.MessageEnum;
+import org.openecomp.mso.logger.MsoLogger;
 import org.openecomp.mso.openstack.beans.MsoTenant;
-import org.openecomp.mso.openstack.exceptions.MsoAdapterException;
 import org.openecomp.mso.openstack.exceptions.MsoCloudSiteNotFound;
 import org.openecomp.mso.openstack.exceptions.MsoException;
-import org.openecomp.mso.openstack.exceptions.MsoOpenstackException;
-import org.openecomp.mso.openstack.exceptions.MsoTenantAlreadyExists;
 import org.openecomp.mso.properties.MsoJavaProperties;
 import org.openecomp.mso.properties.MsoPropertiesException;
 import org.openecomp.mso.properties.MsoPropertiesFactory;
-import com.woorea.openstack.keystone.Keystone;
 
 public abstract class MsoTenantUtils extends MsoCommonUtils {
 
diff --git a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoTenantUtilsFactory.java b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoTenantUtilsFactory.java
index a659fb6..e36d468 100644
--- a/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoTenantUtilsFactory.java
+++ b/adapters/mso-adapter-utils/src/main/java/org/openecomp/mso/openstack/utils/MsoTenantUtilsFactory.java
@@ -26,6 +26,7 @@
 import org.openecomp.mso.cloud.CloudSite;
 
 import java.lang.reflect.InvocationTargetException;
+import org.openecomp.mso.openstack.exceptions.MsoCloudSiteNotFound;
 
 
 public class MsoTenantUtilsFactory {
@@ -39,12 +40,11 @@
 	}
 
 	//based on Cloud IdentityServerType returns ORM or KEYSTONE Utils
-	public MsoTenantUtils getTenantUtils(String cloudSiteId) {
-
+	public MsoTenantUtils getTenantUtils(String cloudSiteId) throws MsoCloudSiteNotFound {
 		// Obtain the cloud site information
 		cloudConfig = cloudConfigFactory.getCloudConfig();
-		CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-
+		CloudSite cloudSite = cloudConfig.getCloudSite(cloudSiteId).orElseThrow(
+				() -> new MsoCloudSiteNotFound(cloudSiteId));
 		return getTenantUtilsByServerType(cloudSite.getIdentityService().getIdentityServerType().toString());
 	}
 
diff --git a/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/adapter_utils/tests/MsoHeatUtilsWithUpdateTest.java b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/adapter_utils/tests/MsoHeatUtilsWithUpdateTest.java
index 714bb66..62043e8 100644
--- a/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/adapter_utils/tests/MsoHeatUtilsWithUpdateTest.java
+++ b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/adapter_utils/tests/MsoHeatUtilsWithUpdateTest.java
@@ -26,6 +26,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import java.util.Optional;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -68,8 +69,8 @@
         cloudIdentity.setKeystoneUrl ("toto");
         cloudIdentity.setMsoPass (CloudIdentity.encryptPassword ("mockId"));
         cloudSite.setIdentityService (cloudIdentity);
-        when (cloudConfig.getCloudSite ("cloud")).thenReturn (cloudSite);
-        when (cloudConfig.getCloudSite ("none")).thenReturn (null);
+        when(cloudConfig.getCloudSite("cloud")).thenReturn (Optional.of(cloudSite));
+        when(cloudConfig.getCloudSite("none")).thenReturn (Optional.empty());
     }
 
     @Test
diff --git a/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/cloud/CloudConfigTest.java b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/cloud/CloudConfigTest.java
index a73e435..1c2501e 100644
--- a/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/cloud/CloudConfigTest.java
+++ b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/cloud/CloudConfigTest.java
@@ -26,6 +26,7 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.Optional;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -112,29 +113,29 @@
     @Test
     public void cloudSiteIsGotById_when_IdFound() throws MsoCloudIdentityNotFound {
         CloudConfig con = createTestObject(cloudConfigJsonFilePath);
-        CloudSite cloudSite = con.getCloudSite("MT");
-        assertNotNull(cloudSite);
-        assertEquals("regionOne", cloudSite.getRegionId());
-        assertEquals("MT_KEYSTONE", cloudSite.getIdentityServiceId());
+        Optional<CloudSite> cloudSite = con.getCloudSite("MT");
+        assertTrue(cloudSite.isPresent());
+        assertEquals("regionOne", cloudSite.get().getRegionId());
+        assertEquals("MT_KEYSTONE", cloudSite.get().getIdentityServiceId());
     }
 
     @Test
     public void cloudSiteIsGotByClli_when_IdNotFound() throws MsoCloudIdentityNotFound {
         CloudConfig con = createTestObject(cloudConfigJsonFilePath);
-        CloudSite cloudSite = con.getCloudSite("CS_clli");
-        assertNotNull(cloudSite);
-        assertEquals("clliRegion", cloudSite.getRegionId());
-        assertEquals("CS_clli", cloudSite.getClli());
-        assertEquals("CS_service", cloudSite.getIdentityServiceId());
+        Optional<CloudSite> cloudSite = con.getCloudSite("CS_clli");
+        assertTrue(cloudSite.isPresent());
+        assertEquals("clliRegion", cloudSite.get().getRegionId());
+        assertEquals("CS_clli", cloudSite.get().getClli());
+        assertEquals("CS_service", cloudSite.get().getIdentityServiceId());
     }
 
     @Test
     public void cloudSiteIsGotByDefault_when_IdAndClliNotFound() throws MsoCloudIdentityNotFound {
         CloudConfig con = createTestObject(cloudDefaultConfigJsonFilePath);
-        CloudSite cloudSite = con.getCloudSite("not_existing_id");
-        assertNotNull(cloudSite);
-        assertEquals("not_existing_id", cloudSite.getId());
-        assertEquals("not_existing_id", cloudSite.getRegionId());
+        Optional<CloudSite> cloudSite = con.getCloudSite("not_existing_id");
+        assertTrue(cloudSite.isPresent());
+        assertEquals("not_existing_id", cloudSite.get().getId());
+        assertEquals("not_existing_id", cloudSite.get().getRegionId());
     }
 
     @Test
diff --git a/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/openstack/utils/MsoHeatEnvironmentEntryTest.java b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/openstack/utils/MsoHeatEnvironmentEntryTest.java
new file mode 100644
index 0000000..60faa76
--- /dev/null
+++ b/adapters/mso-adapter-utils/src/test/java/org/openecomp/mso/openstack/utils/MsoHeatEnvironmentEntryTest.java
@@ -0,0 +1,79 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.mso.openstack.utils;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+public class MsoHeatEnvironmentEntryTest {
+
+    private static final String PARAMETER_NAME = "keyTest";
+    private static final String VALUE_NAME = "valueTest";
+    private static final String NOT_EXISTING_PARAM = "notExistingParam";
+    private static final String RAW_ENTRY_WITH_NO_RESOURCE_REGISTRY = "parameters: {"
+            + PARAMETER_NAME + ": " + VALUE_NAME + "}";
+    private static final String RAW_ENTRY_WITH_RESOURCE_REGISTRY = "resource_registry: resourceTest";
+    private static final String RAW_ENTRY_INVALID = "invalidRawEntry";
+    private static final String WHITESPACE = " ";
+
+    @Test
+    public void createObjectWithNullStringBuilder() {
+        MsoHeatEnvironmentEntry testedObject = MsoHeatEnvironmentEntry.create(null);
+        assertThat(testedObject.getRawEntry()).isNull();
+        assertThat(testedObject.containsParameter(PARAMETER_NAME)).isFalse();
+        assertThat(testedObject.isValid()).isTrue();
+    }
+
+    @Test
+    public void toFullString_ResourceRegistryNotPresentInRawEntry() {
+        MsoHeatEnvironmentEntry testedObject = MsoHeatEnvironmentEntry.create(RAW_ENTRY_WITH_NO_RESOURCE_REGISTRY);
+        assertThat(testedObject.getRawEntry()).isEqualTo(RAW_ENTRY_WITH_NO_RESOURCE_REGISTRY);
+        assertThat(testedObject.isValid()).isTrue();
+        assertThat(testedObject.containsParameter(PARAMETER_NAME)).isTrue();
+        assertThat(testedObject.toString()).contains(PARAMETER_NAME).contains(VALUE_NAME);
+    }
+
+    @Test
+    public void toFullString_ResourceRegistryPresentInRawEntry() {
+        MsoHeatEnvironmentEntry testedObject = MsoHeatEnvironmentEntry.create(RAW_ENTRY_WITH_RESOURCE_REGISTRY);
+        assertThat(testedObject.getRawEntry()).isEqualTo(RAW_ENTRY_WITH_RESOURCE_REGISTRY);
+        assertThat(testedObject.containsParameter(PARAMETER_NAME)).isFalse();
+        assertThat(testedObject.isValid()).isTrue();
+        assertThat(testedObject.toString()).contains(RAW_ENTRY_WITH_RESOURCE_REGISTRY);
+    }
+
+    @Test
+    public void toFullString_ExceptionOccurred() {
+        MsoHeatEnvironmentEntry testedObject = MsoHeatEnvironmentEntry.create(RAW_ENTRY_INVALID);
+        assertThat(testedObject.getRawEntry()).isEqualTo(RAW_ENTRY_INVALID);
+        assertThat(testedObject.isValid()).isFalse();
+        assertThat(testedObject.getErrorString()).isNotNull().isNotEmpty();
+    }
+
+    @Test
+    public void checkIfContainsTheParameter() {
+        MsoHeatEnvironmentEntry testedObject = MsoHeatEnvironmentEntry.create(RAW_ENTRY_WITH_NO_RESOURCE_REGISTRY);
+        assertThat(testedObject.containsParameter(PARAMETER_NAME)).isTrue();
+        assertThat(testedObject.containsParameter(NOT_EXISTING_PARAM)).isFalse();
+    }
+
+}
diff --git a/adapters/mso-network-adapter/src/main/java/org/openecomp/mso/adapters/network/MsoNetworkAdapterImpl.java b/adapters/mso-network-adapter/src/main/java/org/openecomp/mso/adapters/network/MsoNetworkAdapterImpl.java
index 6879306..2c04ae9 100644
--- a/adapters/mso-network-adapter/src/main/java/org/openecomp/mso/adapters/network/MsoNetworkAdapterImpl.java
+++ b/adapters/mso-network-adapter/src/main/java/org/openecomp/mso/adapters/network/MsoNetworkAdapterImpl.java
@@ -26,6 +26,7 @@
 import java.util.List;
 import java.util.Map;
 
+import java.util.Optional;
 import javax.jws.WebService;
 import javax.xml.ws.Holder;
 
@@ -271,8 +272,8 @@
         // So this is just catching that error in a bit more obvious way up front.
 
         cloudConfig = cloudConfigFactory.getCloudConfig ();
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null)
+        Optional<CloudSite> cloudSiteOpt = cloudConfig.getCloudSite(cloudSiteId);
+        if (!cloudSiteOpt.isPresent())
         {
         	String error = "Configuration Error. Stack " + networkName + " in "
         			+ cloudSiteId
@@ -299,7 +300,7 @@
                                                             physicalNetworkName,
                                                             vlans,
                                                             routeTargets,
-                                                            cloudSite);
+                                                            cloudSiteOpt.get());
             String mode = networkResource.getOrchestrationMode ();
             NetworkType neutronNetworkType = NetworkType.valueOf (networkResource.getNeutronNetworkType ());
 
@@ -787,8 +788,8 @@
         networkRollback.setMsoRequest (msoRequest);
 
         cloudConfig = cloudConfigFactory.getCloudConfig ();
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null) {
+        Optional<CloudSite> cloudSiteOpt = cloudConfig.getCloudSite (cloudSiteId);
+        if (!cloudSiteOpt.isPresent()) {
         	   String error = "UpdateNetwork: Configuration Error. Stack " + networkName + " in "
                        + cloudSiteId
                        + "/"
@@ -814,7 +815,7 @@
                     physicalNetworkName,
                     vlans,
                     routeTargets,
-                    cloudSite);
+                    cloudSiteOpt.get());
             String mode = networkResource.getOrchestrationMode();
             NetworkType neutronNetworkType = NetworkType.valueOf(networkResource.getNeutronNetworkType());
 
@@ -1233,7 +1234,7 @@
                               Holder <NetworkStatus> status,
                               Holder <List <Integer>> vlans,
                               Holder <Map <String, String>> subnetIdMap) throws NetworkException {
-        queryNetwork (cloudSiteId,
+        queryNetworkInfo(cloudSiteId,
                       tenantId,
                       networkNameOrId,
                       msoRequest,
@@ -1242,7 +1243,6 @@
                       neutronNetworkId,
                       status,
                       vlans,
-                      null,
                       subnetIdMap);
     }
 
@@ -1257,7 +1257,7 @@
                                       Holder <NetworkStatus> status,
                                       Holder <List <String>> routeTargets,
                                       Holder <Map <String, String>> subnetIdMap) throws NetworkException {
-        queryNetwork (cloudSiteId,
+        queryNetworkInfo(cloudSiteId,
                       tenantId,
                       networkNameOrId,
                       msoRequest,
@@ -1266,18 +1266,17 @@
                       neutronNetworkId,
                       status,
                       null,
-                      routeTargets,
                       subnetIdMap);
     }
 
     /**
-     * This is the queryNetwork method. It returns the existence and status of
+     * This is the queryNetworkInfo method. It returns the existence and status of
      * the specified network, along with its Neutron UUID and list of VLANs.
      * This method attempts to find the network using both Heat and Neutron.
      * Heat stacks are first searched based on the provided network name/id.
      * If none is found, the Neutron is directly queried.
      */
-    private void queryNetwork (String cloudSiteId,
+    private void queryNetworkInfo(String cloudSiteId,
                               String tenantId,
                               String networkNameOrId,
                               MsoRequest msoRequest,
@@ -1286,7 +1285,6 @@
                               Holder <String> neutronNetworkId,
                               Holder <NetworkStatus> status,
                               Holder <List <Integer>> vlans,
-                              Holder <List <String>> routeTargets,
                               Holder <Map <String, String>> subnetIdMap) throws NetworkException {
         MsoLogger.setLogContext (msoRequest);
         MsoLogger.setServiceName ("QueryNetwork");
@@ -1309,9 +1307,9 @@
             throw new NetworkException (error, MsoExceptionCategory.USERDATA);
         }
 
-        cloudConfig = cloudConfigFactory.getCloudConfig ();
-        CloudSite cloudSite = cloudConfig.getCloudSite (cloudSiteId);
-        if (cloudSite == null)
+        cloudConfig = cloudConfigFactory.getCloudConfig();
+        Optional<CloudSite> cloudSiteOpt = cloudConfig.getCloudSite(cloudSiteId);
+        if (!cloudSiteOpt.isPresent())
         {
         	String error = "Configuration Error. Stack " + networkNameOrId + " in "
         			+ cloudSiteId
@@ -1414,7 +1412,7 @@
                 status.value = NetworkStatus.NOTFOUND;
                 neutronNetworkId.value = null;
                 if (vlans != null)
-                	vlans.value = new ArrayList <Integer> ();
+                	vlans.value = new ArrayList<>();
 
                 LOGGER.debug ("Network " + networkNameOrId + " not found");
             }
diff --git a/adapters/mso-sdnc-adapter/src/test/java/org/openecomp/mso/adapters/sdnc/SDNCAdapterRequestTest.java b/adapters/mso-sdnc-adapter/src/test/java/org/openecomp/mso/adapters/sdnc/SDNCAdapterRequestTest.java
new file mode 100644
index 0000000..fa96b79
--- /dev/null
+++ b/adapters/mso-sdnc-adapter/src/test/java/org/openecomp/mso/adapters/sdnc/SDNCAdapterRequestTest.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * 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=========================================================
+ */
+
+
+package org.openecomp.mso.adapters.sdnc;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openecomp.mso.adapters.sdnc.SDNCAdapterRequest;
+import org.openecomp.mso.adapters.sdnc.RequestHeader;
+
+
+public class SDNCAdapterRequestTest {
+
+	static Object sd= new SDNCAdapterRequest();
+	static RequestHeader rh=new RequestHeader();
+	
+	@BeforeClass
+	public static final void RHeader()
+	{
+		rh.setCallbackUrl("callback");
+		rh.setMsoAction ("action");
+		rh.setRequestId ("reqid");
+		rh.setSvcAction ("svcAction");
+		rh.setSvcInstanceId ("svcId");
+		rh.setSvcOperation ("op");
+	}
+	@Test
+	public final void testtoString(){
+		((SDNCAdapterRequest) sd).setRequestData("data");
+		((SDNCAdapterRequest) sd).setRequestHeader(rh);
+        assert (((SDNCAdapterRequest) sd).getRequestData()!= null) ;
+		assert(((SDNCAdapterRequest) sd).getRequestData().equals("data"));
+		assert(((SDNCAdapterRequest) sd).getRequestHeader().equals(rh));		
+	}
+
+}
diff --git a/adapters/mso-tenant-adapter/src/main/java/org/openecomp/mso/adapters/tenant/MsoTenantAdapterImpl.java b/adapters/mso-tenant-adapter/src/main/java/org/openecomp/mso/adapters/tenant/MsoTenantAdapterImpl.java
index 29f5630..58169f6 100644
--- a/adapters/mso-tenant-adapter/src/main/java/org/openecomp/mso/adapters/tenant/MsoTenantAdapterImpl.java
+++ b/adapters/mso-tenant-adapter/src/main/java/org/openecomp/mso/adapters/tenant/MsoTenantAdapterImpl.java
@@ -28,6 +28,7 @@
 import javax.xml.ws.Holder;
 import javax.xml.ws.WebServiceContext;
 
+import org.openecomp.mso.openstack.exceptions.MsoCloudSiteNotFound;
 import org.openecomp.mso.properties.MsoPropertiesFactory;
 import org.openecomp.mso.adapters.tenant.exceptions.TenantAlreadyExists;
 import org.openecomp.mso.adapters.tenant.exceptions.TenantException;
@@ -84,7 +85,7 @@
                               Boolean backout,
                               MsoRequest msoRequest,
                               Holder <String> tenantId,
-                              Holder <TenantRollback> rollback) throws TenantException, TenantAlreadyExists {
+                              Holder <TenantRollback> rollback) throws TenantException {
         MsoLogger.setLogContext (msoRequest);
         MsoLogger.setServiceName (CREATE_TENANT);
 
@@ -99,15 +100,16 @@
         TenantRollback tenantRollback = new TenantRollback ();
         tenantRollback.setCloudId (cloudSiteId);
         tenantRollback.setMsoRequest (msoRequest);
-        
-        MsoTenantUtils tUtils = tFactory.getTenantUtils (cloudSiteId);
 
+        MsoTenantUtils tUtils;
         MsoTenant newTenant = null;
         String newTenantId;
         long queryTenantStartTime = System.currentTimeMillis ();
         try {
+            tUtils = tFactory.getTenantUtils (cloudSiteId);
             newTenant = tUtils.queryTenantByName (tenantName, cloudSiteId);
             logger.recordMetricEvent (queryTenantStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", OPENSTACK, QUERY_TENANT, null);
+
         } catch (MsoException me) {
             logger.recordMetricEvent (queryTenantStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with Open Stack", OPENSTACK, QUERY_TENANT, null);
             String error = "Create Tenant " + tenantName + ": " + me;
@@ -166,11 +168,11 @@
         // Will capture execution time for metrics
         long startTime = System.currentTimeMillis ();
 
-        MsoTenantUtils tUtils = tFactory.getTenantUtils (cloudSiteId);
-        
+        MsoTenantUtils tUtils = null;
         MsoTenant qTenant = null;
         long subStartTime = System.currentTimeMillis ();
         try {
+            tUtils = tFactory.getTenantUtils (cloudSiteId);
             qTenant = tUtils.queryTenant (tenantNameOrId, cloudSiteId);
             logger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from Open Stack", OPENSTACK, QUERY_TENANT, null);
             if (qTenant == null) {
diff --git a/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vnf/MsoVnfAdapterImpl.java b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vnf/MsoVnfAdapterImpl.java
index fb86b8c..7fe09be 100644
--- a/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vnf/MsoVnfAdapterImpl.java
+++ b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/adapters/vnf/MsoVnfAdapterImpl.java
@@ -21,7 +21,7 @@
 
 package org.openecomp.mso.adapters.vnf;
 
-
+import java.util.Optional;
 import org.codehaus.jackson.JsonNode;
 import org.codehaus.jackson.JsonParseException;
 import org.codehaus.jackson.map.ObjectMapper;
@@ -953,15 +953,14 @@
             }
             if (minVersionVnf != null && maxVersionVnf != null) {
                 MavenLikeVersioning aicV = new MavenLikeVersioning();
-                CloudSite cloudSite = null;
                 if (this.cloudConfig == null) {
                     this.cloudConfig = this.cloudConfigFactory.getCloudConfig();
                 }
                 // double check
                 if (this.cloudConfig != null) {
-                    cloudSite = this.cloudConfig.getCloudSite(cloudSiteId);
-                    if (cloudSite != null) {
-                        aicV.setVersion(cloudSite.getAic_version());
+                    Optional<CloudSite> cloudSiteOpt = this.cloudConfig.getCloudSite(cloudSiteId);
+                    if (cloudSiteOpt.isPresent()) {
+                        aicV.setVersion(cloudSiteOpt.get().getAic_version());
                         // Add code to handle unexpected values in here
                         boolean moreThanMin = true;
                         boolean equalToMin = true;
@@ -980,10 +979,10 @@
                         if (!doNotTest) {
                             if ((moreThanMin || equalToMin) // aic >= min
                                     && (equalToMax || !(moreThanMax))) { //aic <= max
-                                LOGGER.debug("VNF Resource " + vnfResource.getModelName() + ", ModelUuid=" + vnfResource.getModelUuid() + " VersionMin=" + minVersionVnf + " VersionMax:" + maxVersionVnf + " supported on Cloud: " + cloudSite.getId() + " with AIC_Version:" + cloudSite.getAic_version());
+                                LOGGER.debug("VNF Resource " + vnfResource.getModelName() + ", ModelUuid=" + vnfResource.getModelUuid() + " VersionMin=" + minVersionVnf + " VersionMax:" + maxVersionVnf + " supported on Cloud: " + cloudSiteOpt.get().getId() + " with AIC_Version:" + cloudSiteOpt.get().getAic_version());
                             } else {
                                 // ERROR
-                                String error = "VNF Resource type: " + vnfResource.getModelName() + ", ModelUuid=" + vnfResource.getModelUuid() + " VersionMin=" + minVersionVnf + " VersionMax:" + maxVersionVnf + " NOT supported on Cloud: " + cloudSite.getId() + " with AIC_Version:" + cloudSite.getAic_version();
+                                String error = "VNF Resource type: " + vnfResource.getModelName() + ", ModelUuid=" + vnfResource.getModelUuid() + " VersionMin=" + minVersionVnf + " VersionMax:" + maxVersionVnf + " NOT supported on Cloud: " + cloudSiteOpt.get().getId() + " with AIC_Version:" + cloudSiteOpt.get().getAic_version();
                                 LOGGER.error(MessageEnum.RA_CONFIG_EXC, error, "OpenStack", "", MsoLogger.ErrorCode.BusinessProcesssError, "Exception - setVersion");
                                 LOGGER.debug(error);
                                 throw new VnfException(error, MsoExceptionCategory.USERDATA);
@@ -1200,9 +1199,7 @@
             if (heatEnvironmentString != null && heatEnvironmentString.contains ("parameters:")) {
                 //LOGGER.debug ("Have an Environment argument with a parameters: section - will bypass checking for valid params - but will still check for aliases");
                 LOGGER.debug("Enhanced environment checking enabled - 1604");
-                StringBuilder sb = new StringBuilder(heatEnvironmentString);
-                //LOGGER.debug("About to create MHEE with " + sb);
-                mhee = new MsoHeatEnvironmentEntry(sb);
+                mhee = MsoHeatEnvironmentEntry.create(heatEnvironmentString);
                 StringBuilder sb2 = new StringBuilder("\nHeat Template Parameters:\n");
                 for (HeatTemplateParam parm : heatTemplate.getParameters()) {
                     sb2.append("\t" + parm.getParamName() + ", required=" + parm.isRequired());
@@ -1211,7 +1208,7 @@
                     sb2.append("Environment says it's not valid! " + mhee.getErrorString());
                 } else {
                     sb2.append("\nEnvironment:");
-                    sb2.append(mhee.toFullString());
+                    sb2.append(mhee);
                 }
                 LOGGER.debug(sb2.toString());
             } else {
@@ -1292,7 +1289,7 @@
             // and it causes problems with json that has arrays
             String newEnvironmentString = null;
             if (mhee != null) {
-                newEnvironmentString = mhee.getRawEntry().toString();
+                newEnvironmentString = mhee.getRawEntry();
             }
 
             // "Fix" the template if it has CR/LF (getting this from Oracle)
@@ -1703,26 +1700,25 @@
                 }
             if (minVersionVnf != null && maxVersionVnf != null) {
                 MavenLikeVersioning aicV = new MavenLikeVersioning();
-                CloudSite cloudSite = null;
                 //String aicVersion = "";
                 if (this.cloudConfig == null) {
                     this.cloudConfig = this.cloudConfigFactory.getCloudConfig();
             }
                 // double check
                 if (this.cloudConfig != null) {
-                    cloudSite = this.cloudConfig.getCloudSite(cloudSiteId);
-                    if (cloudSite != null) {
-                        aicV.setVersion(cloudSite.getAic_version());
+                    Optional<CloudSite> cloudSiteOpt = this.cloudConfig.getCloudSite(cloudSiteId);
+                    if (cloudSiteOpt.isPresent()) {
+                        aicV.setVersion(cloudSiteOpt.get().getAic_version());
                         if ((aicV.isMoreRecentThan(minVersionVnf) || aicV.isTheSameVersion(minVersionVnf)) // aic >= min
                                 && (aicV.isTheSameVersion(maxVersionVnf) || !(aicV.isMoreRecentThan(maxVersionVnf)))) { //aic <= max
-                            LOGGER.debug("VNF Resource " + vnfResource.getModelName() + " VersionMin=" + minVersionVnf + " VersionMax:" + maxVersionVnf + " supported on Cloud: " + cloudSite.getId() + " with AIC_Version:" + cloudSite.getAic_version());
+                            LOGGER.debug("VNF Resource " + vnfResource.getModelName() + " VersionMin=" + minVersionVnf + " VersionMax:" + maxVersionVnf + " supported on Cloud: " + cloudSiteOpt.get().getId() + " with AIC_Version:" + cloudSiteOpt.get().getAic_version());
                         } else {
                             // ERROR
-                            String error = "VNF Resource type: " + vnfResource.getModelName() + " VersionMin=" + minVersionVnf + " VersionMax:" + maxVersionVnf + " NOT supported on Cloud: " + cloudSite.getId() + " with AIC_Version:" + cloudSite.getAic_version();
+                            String error = "VNF Resource type: " + vnfResource.getModelName() + " VersionMin=" + minVersionVnf + " VersionMax:" + maxVersionVnf + " NOT supported on Cloud: " + cloudSiteOpt.get().getId() + " with AIC_Version:" + cloudSiteOpt.get().getAic_version();
                             LOGGER.error(MessageEnum.RA_CONFIG_EXC, error, "OpenStack", "", MsoLogger.ErrorCode.BusinessProcesssError, "Exception - setVersion");
                             LOGGER.debug(error);
                             throw new VnfException(error, MsoExceptionCategory.USERDATA);
-                    }
+                        }
                     } // let this error out downstream to avoid introducing uncertainty at this stage
                 } else {
                     LOGGER.debug("cloudConfig is NULL - cannot check cloud site version");
@@ -1904,10 +1900,7 @@
             MsoHeatEnvironmentEntry mhee = null;
             if (heatEnvironmentString != null && heatEnvironmentString.toLowerCase ().contains ("parameters:")) {
                 LOGGER.debug("Enhanced environment checking enabled - 1604");
-                haveEnvironmentParameters = true;
-                StringBuilder sb = new StringBuilder(heatEnvironmentString);
-                //LOGGER.debug("About to create MHEE with " + sb);
-                mhee = new MsoHeatEnvironmentEntry(sb);
+                mhee = MsoHeatEnvironmentEntry.create(heatEnvironmentString);
                 StringBuilder sb2 = new StringBuilder("\nHeat Template Parameters:\n");
                 for (HeatTemplateParam parm : heatTemplate.getParameters()) {
                     sb2.append("\t" + parm.getParamName() + ", required=" + parm.isRequired());
@@ -1916,7 +1909,7 @@
                     sb2.append("Environment says it's not valid! " + mhee.getErrorString());
                 } else {
                     sb2.append("\nEnvironment:");
-                    sb2.append(mhee.toFullString());
+                    sb2.append(mhee);
                 }
                 LOGGER.debug(sb2.toString());
             } else {
@@ -2041,7 +2034,7 @@
             // Just submit the envt entry as received from the database
             String newEnvironmentString = null;
             if (mhee != null) {
-                newEnvironmentString = mhee.getRawEntry().toString();
+                newEnvironmentString = mhee.getRawEntry();
             }
 
             // Remove any extraneous parameters (don't throw an error)
diff --git a/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduBlueprint.java b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduBlueprint.java
new file mode 100755
index 0000000..6e06eed
--- /dev/null
+++ b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduBlueprint.java
@@ -0,0 +1,90 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.mso.vdu.utils;
+
+import java.util.Map;
+
+/*
+ * This Java bean class describes the template model of a VDU as distributed
+ * by SDC to SO.  It is composed of one or more templates, one of which must be
+ * the main template, 
+ * 
+ * The structure of this class corresponds to the format in which the templates
+ * and associated artifacts are represented in the SO Catalog.
+ * 
+ * The map keys will be the "path" that is used to reference these artifacts within
+ * the other templates.  This may be relevant to how different VDU plugins package
+ * the files for delivery to the sub-orchestrator.
+ * 
+ * In the future, it is possible that pre-packaged blueprints (e.g. complete TOSCA CSARs)
+ * could be stored in the catalog (and added to this structure).
+ * 
+ * This bean is passed as an input to instantiateVdu and updateVdu.
+ */
+
+public class VduBlueprint {
+	String vduModelId;
+	String mainTemplateName;
+	Map<String,byte[]> templateFiles;
+	Map<String,byte[]> attachedFiles;
+
+	public String getVduModelId() {
+		return vduModelId;
+	}
+
+	public void setVduModelId(String vduModelId) {
+		this.vduModelId = vduModelId;
+	}
+
+	public String getMainTemplateName() {
+		return mainTemplateName;
+	}
+
+	public void setMainTemplateName(String mainTemplateName) {
+		this.mainTemplateName = mainTemplateName;
+	}
+
+	public Map<String, byte[]> getTemplateFiles() {
+		return templateFiles;
+	}
+
+	public void setTemplateFiles(Map<String, byte[]> templateFiles) {
+		this.templateFiles = templateFiles;
+	}
+
+	public Map<String, byte[]> getAttachedFiles() {
+		return attachedFiles;
+	}
+
+	public void setAttachedFiles(Map<String, byte[]> attachedFiles) {
+		this.attachedFiles = attachedFiles;
+	}
+
+	@Override
+    public String toString() {
+        return "VduInfo {" +
+                "id='" + vduModelId + '\'' +
+                "mainTemplateName='" + mainTemplateName + '\'' +
+                '}';
+    }
+
+}
+
diff --git a/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduInfo.java b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduInfo.java
new file mode 100755
index 0000000..53300c9
--- /dev/null
+++ b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduInfo.java
@@ -0,0 +1,130 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.mso.vdu.utils;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/*
+ * This Java bean class relays VDU status information in a cloud-agnostic format.
+ * 
+ * This bean is returned by all implementors of the MsoVduUtils interface operations
+ * (instantiate, query, delete).
+ */
+
+public class VduInfo {
+	// Set defaults for everything
+	private String vduInstanceId = "";
+	private String vduInstanceName = "";
+	private VduStatus status = VduStatus.NOTFOUND;
+	private Map<String,Object> outputs = new HashMap<String,Object>();
+	private Map<String,Object> inputs = new HashMap<String,Object>();
+	private String lastAction;
+	private String actionStatus;
+	private String errorMessage;
+	
+	public VduInfo () {
+	}
+
+	// Add more constructors as appropriate
+	//
+	
+	public VduInfo (String id, Map<String,Object> outputs) {
+		this.vduInstanceId = id;
+		if (outputs != null)  this.outputs = outputs;
+	}
+	
+	public VduInfo (String id) {
+		this.vduInstanceId = id;
+	}
+	
+	public VduInfo (String id, VduStatus status) {
+		this.vduInstanceId = id;
+		this.status = status;
+	}
+	
+	public String getVnfInstanceId() {
+		return vduInstanceId;
+	}
+	
+	public void setVnfInstanceId (String id) {
+		this.vduInstanceId = id;
+	}
+	
+	public String getVnfInstanceName() {
+		return vduInstanceName;
+	}
+	
+	public void setVnfInstanceName (String name) {
+		this.vduInstanceName = name;
+	}
+	
+	public VduStatus getStatus() {
+		return status;
+	}
+	
+	public void setStatus (VduStatus status) {
+		this.status = status;
+	}
+	
+	public Map<String,Object> getOutputs () {
+		return outputs;
+	}
+	
+	public void setOutputs (Map<String,Object> outputs) {
+		this.outputs = outputs;
+	}
+	
+	public Map<String,Object> getInputs () {
+		return inputs;
+	}
+	
+	public void setInputs (Map<String,Object> inputs) {
+		this.inputs = inputs;
+	}
+
+	public String getLastAction() {
+		return lastAction;
+	}
+
+	public String getActionStatus() {
+		return actionStatus;
+	}
+
+	public String getErrorMessage() {
+		return errorMessage;
+	}
+
+	@Override
+    public String toString() {
+        return "VduInfo {" +
+                "id='" + vduInstanceId + '\'' +
+                "name='" + vduInstanceName + '\'' +
+                ", inputs='" + inputs + '\'' +
+                ", outputs='" + outputs + '\'' +
+                ", lastAction='" + lastAction + '\'' +
+                ", status='" + status + '\'' +
+                ", errorMessage='" + errorMessage + '\'' +
+                '}';
+    }
+
+}
+
diff --git a/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduPlugin.java b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduPlugin.java
new file mode 100755
index 0000000..3452a10
--- /dev/null
+++ b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduPlugin.java
@@ -0,0 +1,248 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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=========================================================
+ */
+package org.openecomp.mso.vdu.utils;
+
+/**
+ * This interface defines a common API for template-based cloud deployments.
+ * The methods here should be adaptable for Openstack (Heat), Cloudify (TOSCA),
+ * Aria (TOSCA), Multi-VIM (TBD), and others (e.g. Azure Resource Manager).
+ * 
+ * The deployed instances are referred to here as Virtual Deployment Units (VDUs).
+ * The package of templates that define a give VDU is referred to as its blueprint.
+ * 
+ * Template-based orchestrators all follow a similar template/blueprint model.
+ * - One main template that is the top level definition
+ * - Optional nested templates referenced/included by the main template
+ * - Optional files attached to the template package, typically containing
+ *   configuration files, install scripts, orchestration scripts, etc.
+ *   
+ * The main template also defines the required inputs for creating a new instance,
+ * and output values exposed by successfully deployed instances.  Inputs and outputs
+ * may include simple or complex (JSON) data types.
+ *   
+ * Each implementation of this interface is expected to understand the MSO CloudConfig
+ * to obtain the credentials for its sub-orchestrator and the targeted cloud.
+ * The sub-orchestrator may have different credentials from the cloud (e.g. an Aria 
+ * instance in front of an Openstack cloud) or they may be the same (e.g. Heat)
+ */
+import java.util.Map;
+
+import org.openecomp.mso.openstack.exceptions.MsoException;
+
+public interface VduPlugin {
+
+    /**
+     * The instantiateVdu interface deploys a new VDU instance from a blueprint package.
+     * The templates and files in the blueprint may be pre-installed where supported
+     * (e.g. in Cloudify or Aria), or may be passed in directly (e.g. for Heat).  These
+     * files are expressed as byte arrays, though only text files are expected from ASDC.
+     * 
+     * For some VIMs, this may be a single command (e.g. Heat -> create stack) or may
+     * require a series of API calls (e.g. Cloudify -> upload blueprint, create deployment,
+     * execute install workflow).  These details are hidden within the implementation.
+     * The instantiation should be fully completed before returning.  On failures, this
+     * method is expected to back out the attempt, leaving the cloud in its previous state.
+     * 
+     * It is expected that parameters have been validated and contain at minimum the
+     * required parameters for the given template with no extra parameters.
+     *
+     * The VDU name supplied by the caller will be globally unique, and identify the artifact
+     * in A&AI.  Inventory is managed by the higher levels invoking this function.
+     *
+     * @param cloudSiteId The target cloud for the VDU.  Maps to a CloudConfig entry.
+     * @param tenantId The cloud tenant in which to deploy the VDU.  The meaning may differ by
+     * 		cloud provider, but every cloud supports some sort of tenant partitioning.
+     * @param vduInstanceName A unique name for the VDU instance to create
+     * @param vduBlueprint Object containing the collection of templates and files that comprise
+     * 		the blueprint for this VDU.
+     * @param inputs A map of key/value inputs.  Values may be strings, numbers, or JSON objects.
+     * @param environmentFile A file containing default parameter name/value pairs.  This is
+     * 		primarily for Heat, though ASDC may create a similar file for other orchestrators.
+     * @param timeoutMinutes Timeout after which the instantiation attempt will be cancelled
+     * @param suppressBackout Flag to preserve the deployment on install Failure.  Should normally
+     *		be False except in troubleshooting/debug cases
+     * 
+     * @return A VduInfo object
+     * @throws MsoException Thrown if the sub-orchestrator API calls fail or if a timeout occurs.
+     * Various subclasses of MsoException may be thrown.
+     */
+    public VduInfo instantiateVdu (
+    				String cloudSiteId,
+    				String tenantId,
+    				String vduInstanceName,
+    				VduBlueprint vduBlueprint,
+    				Map <String, ? extends Object> inputs,
+    				String environmentFile,
+    				int timeoutMinutes,
+    				boolean suppressBackout)
+			throws MsoException;
+
+    
+    /**
+     * Query a deployed VDU instance.  This call will return a VduInfo object, or null
+     * if the deployment does not exist.
+     * 
+     * Some VIM orchestrators identify deployment instances by string UUIDs, and others 
+     * by integers.  In the latter case, the ID will be passed in as a numeric string.
+     *
+     * The returned VduInfo object contains the input and output parameter maps,
+     * as well as other properties of the deployment (name, status, last action, etc.).
+     * 
+     * @param cloudSiteId The target cloud to query for the VDU.
+     * @param tenantId The cloud tenant in which to query
+     * @param vduInstanceId The ID of the deployment to query
+     * 
+     * @return A VduInfo object
+     * @throws MsoException Thrown if the VIM/sub-orchestrator API calls fail.
+     * Various subclasses of MsoException may be thrown.
+     */
+    public VduInfo queryVdu (
+    				String cloudSiteId,
+    				String tenantId,
+    				String vduInstanceId)
+			throws MsoException;
+
+    
+    /**
+     * Delete a VDU instance by ID.  If the VIM sub-orchestrator supports pre-installation
+     * of blueprints, the blueprint itself may remain installed.  This is recommended, since
+     * other VDU instances may be using it.
+     * 
+     * Some VIM orchestrators identify deployment instances by string UUIDs, and others 
+     * by integers.  In the latter case, the ID will be passed in as a numeric string.
+     * 
+     * For some VIMs, deletion may be a single command (e.g. Heat -> delete stack) or a
+     * series of API calls (e.g. Cloudify -> execute uninstall workflow, delete deployment).
+     * These details are hidden within the implementation.  The deletion should be fully
+     * completed before returning.    
+     *  
+     * The successful return is a VduInfo object which contains the state of the object just prior
+     * to deletion, with a status of DELETED.  If the deployment was not found, the VduInfo object
+     * should be empty (with a status of NOTFOUND).  There is no rollback from a successful deletion.
+     * 
+     * A deletion failure will result in an undefined deployment state - the components may
+     * or may not have been all or partially uninstalled, so the resulting deployment must
+     * be considered invalid.
+     *
+     * @param cloudSiteId The target cloud from which to delete the VDU.
+     * @param tenantId The cloud tenant in which to delete the VDU.
+     * @param vduInstanceId The unique id of the deployment to delete.
+     * @param timeoutMinutes Timeout after which the delete action will be cancelled
+     * @param deleteBlueprint Flag to also delete the blueprint
+     * 
+     * @return A VduInfo object, representing the state of the instance just prior to deletion.
+     * 
+     * @throws MsoException Thrown if the API calls fail or if a timeout occurs.
+     * Various subclasses of MsoException may be thrown.
+     */
+    public VduInfo deleteVdu (
+    				String cloudSiteId,
+    				String tenantId,
+    				String vduInstanceId,
+    				int timeoutMinutes,
+    				boolean keepBlueprintLoaded)
+			throws MsoException;
+
+    
+    /**
+     * The updateVdu interface attempts to update a VDU in-place, using either new inputs or
+     * a new model definition (i.e. updated templates/blueprints).  This depends on the
+     * capabilities of the targeted sub-orchestrator, as not all implementations are expected
+     * to support this ability.  It is primary included initially only for Heat.
+	 *
+     * It is expected that parameters have been validated and contain at minimum the required
+     * parameters for the given template with no extra parameters.  The VDU instance name cannot
+     * be updated. 
+     * 
+   	 * The update should be fully completed before returning. The successful return is a
+	 * VduInfo object containing the updated VDU state.
+     * 
+     * An update failure will result in an undefined deployment state - the components may
+     * or may not have been all or partially modified, deleted, recreated, etc.  So the resulting
+     * VDU must be considered invalid.
+     * 
+     * @param cloudSiteId The target cloud for the VDU.  Maps to a CloudConfig entry.
+     * @param tenantId The cloud tenant in which to deploy the VDU.  The meaning may differ by
+     * 		cloud provider, but every cloud supports some sort of tenant partitioning.
+     * @param vduInstanceId The unique ID for the VDU instance to update.
+     * @param vduBlueprint Object containing the collection of templates and files that comprise
+     * 		the blueprint for this VDU.
+     * @param inputs A map of key/value inputs.  Values may be strings, numbers, or JSON objects.
+     * @param environmentFile A file containing default parameter name/value pairs.  This is
+     * 		primarily for Heat, though ASDC may create a similar file for other orchestrators.
+     * @param timeoutMinutes Timeout after which the instantiation attempt will be cancelled
+     * 
+     * @return A VduInfo object
+     * @throws MsoException Thrown if the sub-orchestrator API calls fail or if a timeout occurs.
+     * Various subclasses of MsoException may be thrown.
+     */
+    public VduInfo updateVdu (
+    				String cloudSiteId,
+    				String tenantId,
+    				String vduInstanceId,
+    				VduBlueprint vduBlueprint,
+    				Map <String, ? extends Object> inputs,
+    				String environmentFile,
+    				int timeoutMinutes)
+			throws MsoException;
+
+    
+    /**
+     * Check if a blueprint package has been installed in the sub-orchestrator and available
+     * for use at a targeted cloud site.  If the specific sub-orchestrator does not support
+     * pre-installation, then those implementations should always return False.
+     * 
+     * @param cloudSiteId The cloud site where the blueprint is needed
+     * @param vduModelId Unique ID of the VDU model to query
+     * 
+     * @throws MsoException Thrown if the API call fails.
+     */
+    public boolean isBlueprintLoaded (String cloudSiteId, String vduModelId)
+			throws MsoException;
+
+    
+    /**
+     * Install a blueprint package to the target sub-orchestrator for a cloud site.
+     * The blueprints currently must be structured as a single directory with all of the
+     * required files.  One of those files is designated the "main file" for the blueprint.
+     * Files are provided as byte arrays, though expect only text files will be distributed
+     * from ASDC and stored by MSO.
+     * 
+     * @param cloudSiteId The cloud site where the blueprint is needed
+     * @param vduBlueprint Object containing the collection of templates and files that comprise
+     * 		the blueprint for this VDU.
+     * @param failIfExists Flag to return an error if blueprint already exists
+     * 
+     * @throws MsoException Thrown if the API call fails.
+     */
+    public void uploadBlueprint (String cloudSiteId,
+    							VduBlueprint vduBlueprint,
+    							boolean failIfExists)
+    	throws MsoException;
+
+    /**
+     * Indicator that this VIM sub-orchestrator implementation supports independent upload
+     * of blueprint packages.  Each implementation should return a constant value.
+     * 
+     * @returns True if the sub-orchestrator supports blueprint pre-installation (upload).
+     */
+    public boolean blueprintUploadSupported ();
+
+}
diff --git a/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduStatus.java b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduStatus.java
new file mode 100755
index 0000000..0f4611a
--- /dev/null
+++ b/adapters/mso-vnf-adapter/src/main/java/org/openecomp/mso/vdu/utils/VduStatus.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.mso.vdu.utils;
+
+
+/*
+ * Enum status values to capture the state of a generic (cloud-agnostic) VDU.
+ */
+public enum VduStatus {
+	NOTFOUND,
+	INSTANTIATING,
+	INSTANTIATED,
+	DELETING,
+	DELETED,		// Note - only returned in success response to deleteVdu call.
+	UPDATING,
+	FAILED,
+	UNKNOWN
+}
+
diff --git a/aria/aria-rest-java-client/pom.xml b/aria/aria-rest-java-client/pom.xml
index 402d3c1..f35403c 100755
--- a/aria/aria-rest-java-client/pom.xml
+++ b/aria/aria-rest-java-client/pom.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
 /*
  * ============LICENSE_START===================================================
@@ -17,7 +18,6 @@
  * ============LICENSE_END====================================================
 */
 -->
-<?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaClient.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaClient.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaClientFactory.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaClientFactory.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaRestClient.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaRestClient.java
old mode 100755
new mode 100644
index a4e4533..5de2203
--- a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaRestClient.java
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaRestClient.java
@@ -1,336 +1,377 @@
-/*

- * ============LICENSE_START===================================================

- * Copyright (c) 2017 Cloudify.co.  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====================================================

-*/

-package com.gigaspaces.aria.rest.client;

-

-import com.gigaspaces.aria.rest.client.exceptions.StorageException;

-import com.gigaspaces.aria.rest.client.exceptions.ValidationException;

-import org.codehaus.jackson.JsonFactory;

-import org.codehaus.jackson.JsonNode;

-import org.codehaus.jackson.jaxrs.JacksonJsonProvider;

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

-import sun.reflect.generics.reflectiveObjects.NotImplementedException;

-

-import javax.ws.rs.client.Client;

-import javax.ws.rs.client.ClientBuilder;

-import javax.ws.rs.client.Entity;

-import javax.ws.rs.client.WebTarget;

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

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

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

-import java.net.URI;

-import java.util.ArrayList;

-import java.util.List;

-

-import static javax.ws.rs.client.Entity.entity;

-

-/**

- * Created by DeWayne on 7/12/2017.

- */

-public class AriaRestClient implements AriaClient {

-    private Client client=null;

-    private WebTarget base_target=null;

-

-    /**

-     * Construct an Aria REST client

-     *

-     * @param protocol either http or https

-     * @param address the IP address or host name

-     * @param port the port of the service

-     * @param version the api version

-     */

-    public AriaRestClient(String protocol, String address, int port, String version){

-        this.client = ClientBuilder.newBuilder().register(JacksonJsonProvider.class).build();

-        base_target = client.target(protocol+"://"+address+":"+port+"/api/"+version);

-    }

-

-    /**

-     * Installs a service template

-     *

-     * @param template the template object

-     * @throws ValidationException

-     * @throws StorageException

-     */

-    public void install_service_template(ServiceTemplate template) throws ValidationException, StorageException, Exception {

-

-        Response response = base_target.path("templates/"+template.getName()).request(MediaType.APPLICATION_JSON).put(Entity.entity(

-                "{\"service-template-path\":\""+template.getURI().toString()+"\""+

-                        ",\"service-template-filename\":\""+template.getFilename()+"\"", MediaType.APPLICATION_JSON));

-

-        if(response.getStatus() == 500){

-            throw new StorageException(response.readEntity(String.class));

-        }

-        else if(response.getStatus() == 400){

-            throw new ValidationException(response.readEntity(String.class));

-        }

-        else if(response.getStatus()>199 && response.getStatus() <300){

-            return;

-        }

-        else{

-            throw new Exception("Error installing template: "+response.getStatus()+" "+ response.readEntity(String.class));

-        }

-    }

-

-    public ValidationResult validate_service_template(ServiceTemplate template)throws Exception{

-        Response response = base_target.path("templates").request(MediaType.APPLICATION_JSON).post(Entity.entity(

-                "{\"service-template-path\":\""+template.getURI().toString()+"\""+

-                ",\"service-template-filename\":\""+template.getFilename()+"\"}", MediaType.APPLICATION_JSON));

-

-        ValidationResultImpl result = new ValidationResultImpl();

-        if(response.getStatus() >= 200 && response.getStatus() < 300){

-            result.setFailed(false);

-        }

-        else if(response.getStatus()==400){

-            result.setFailed(true);

-        }

-        else{

-            throw new Exception("received error response '"+ response.getStatus()+"':"+response.readEntity(String.class));

-        }

-        return result;

-

-    }

-

-    /**

-     *

-     * @return a list of service templates

-     */

-    public List<? extends ServiceTemplate> list_service_templates(){

-        List<? extends ServiceTemplate> templates = base_target.path("templates").request(MediaType.APPLICATION_JSON).get(new GenericType<List<ServiceTemplateImpl>>(){});

-

-        return templates;

-    }

-

-

-    /**

-     * Deletes the specified template.

-     *

-     * TODO: Error handling is a little blunt. Need to describe failures better

-     *

-     * @param template_id the template id to delete

-     * @throws IllegalArgumentException thrown when the template can't be deleted

-     * @throws Exception other server side errors

-     */

-    public void delete_service_template(int template_id) throws IllegalArgumentException, Exception{

-        Response response = base_target.path("templates/"+template_id).request(MediaType.APPLICATION_JSON).delete();

-

-        if(response.getStatus()>=200 && response.getStatus()<300){

-            return;

-        }

-        else if(response.getStatus()==400){

-            throw new IllegalArgumentException("Error deleting template '"+template_id+"'");

-        }

-        else{

-            throw new Exception("Error processing request. Return code = "+response.getStatus());

-        }

-    }

-

-    /**

-     * List the node templates for a given template id

-     *

-     * @param template_id

-     * @return

-     */

-    public List<? extends NodeTemplate> list_nodes(int template_id) {

-        List<? extends NodeTemplate> nodes = base_target.path("templates/"+template_id+"/nodes").request(MediaType.APPLICATION_JSON).get(new GenericType<List<NodeTemplateImpl>>(){});

-        return nodes;

-    }

-

-    /**

-     * Get a specific node by id

-     *

-     * @param node_id the node id

-     * @return

-     * @throws IllegalArgumentException

-     */

-    public NodeTemplate get_node(int node_id) throws IllegalArgumentException {

-        NodeTemplate node = base_target.path("nodes/"+node_id).request(MediaType.APPLICATION_JSON).get(NodeTemplateImpl.class);

-        return node;

-    }

-

-    public List<? extends Service> list_services() {

-        List<? extends Service> services = base_target.path("services").request(MediaType.APPLICATION_JSON).get(new GenericType<List<ServiceImpl>>(){});

-        return services;

-    }

-

-    public Service get_service(int service_id) throws IllegalArgumentException {

-        throw new NotImplementedException();

-    }

-

-    public List<? extends Output> list_service_outputs(int service_id) throws IllegalArgumentException {

-        List<? extends Output> outputs = base_target.path("services").request(MediaType.APPLICATION_JSON).get(new GenericType<List<OutputImpl>>(){});

-        return outputs;

-    }

-

-    public List<? extends Input> list_service_inputs(int service_id) throws IllegalArgumentException {

-        List<? extends Input> inputs = base_target.path("services").request(MediaType.APPLICATION_JSON).get(new GenericType<List<InputImpl>>(){});

-        return inputs;

-    }

-

-    /**

-     * Create a service based on the supplied template

-     *

-     * @param template_id the template to create the service for

-     * @param service_name a name for the service

-     * @param inputs an optional list of inputs for the service (can be null)

-     * @throws Exception

-     */

-    public void create_service(int template_id, String service_name, List<Input> inputs) throws Exception {

-

-        String json="{"+inputsToJson(inputs)+"}";

-

-        Response response = base_target.path("templates/"+template_id+"/services/"+service_name).

-                request(MediaType.APPLICATION_JSON).post(

-                Entity.entity(json, MediaType.APPLICATION_JSON)

-        );

-

-        if( response.getStatus()< 200 || response.getStatus()>299){

-            throw new Exception("create service failed:"+response.getStatus()+" "+ response.readEntity(String.class));

-        }

-    }

-

-    public void delete_service(int service_id) throws Exception {

-        Response response = base_target.path("services/"+service_id).request(MediaType.APPLICATION_JSON).delete();

-        if(!responseOK(response)){

-            throw new Exception("delete service failed: "+response.getStatus()+" "+ response.readEntity(String.class));

-        }

-    }

-

-    /**

-     * List user workflows for supplied service

-     *

-     * @param service_id

-     * @return

-     * @throws IllegalArgumentException

-     */

-    public List<? extends Workflow> list_workflows(int service_id) throws IllegalArgumentException {

-        List<? extends Workflow> workflows = base_target.path("services/"+service_id+"/workflows").request(MediaType.APPLICATION_JSON).get(new GenericType<List<WorkflowImpl>>(){});

-        return workflows;

-    }

-

-    public Workflow get_workflow(int workflow_id) throws IllegalArgumentException {

-        throw new NotImplementedException();

-    }

-

-    /**

-     * List all executions

-     *

-     * @return

-     * @throws Exception

-     */

-    public List<? extends Execution> list_executions() throws Exception {

-        List<? extends Execution> executions = base_target.path("executions").request(MediaType.APPLICATION_JSON).get(new GenericType<List<ExecutionImpl>>(){});

-        return executions;

-    }

-

-    /**

-     * List executions for specified service

-     *

-     * @param service_id

-     * @return

-     * @throws Exception

-     */

-    public List<? extends Execution> list_executions(int service_id) throws Exception {

-        List<? extends Execution> executions = base_target.path("services/"+service_id+"/executions").request(MediaType.APPLICATION_JSON).get(new GenericType<List<ExecutionImpl>>(){});

-        return executions;

-    }

-

-    /**

-     * Get details about a specified execution

-     *

-     * @param execution_id

-     * @return

-     * @throws IllegalArgumentException

-     */

-    public Execution get_execution(int execution_id) throws IllegalArgumentException {

-        Execution execution = base_target.path("executions/"+execution_id).request(MediaType.APPLICATION_JSON).get(ExecutionImpl.class);

-        return execution;

-    }

-

-    /**

-     * Start an execution for the specified service

-     *

-     * @param service_id the service to run the execution for

-     * @param workflow_name the name of the workflow to execute

-     * @param details details controlling execution operation

-     * @return the execution id

-     * @throws Exception

-     */

-    public int start_execution(int service_id, String workflow_name, ExecutionDetails details) throws Exception {

-        StringBuilder json=new StringBuilder("{");

-        if(details.getExecutor().length()>0){

-            json.append("\"executor\":\"").append(details.getExecutor()).append("\",");

-        }

-        if(details.getInputs()!=null){

-            json.append(inputsToJson(details.getInputs()));

-        }

-        json.append("\"task_max_attempts\":").append(details.getTaskMaxAttempts()).append(",");

-        json.append("\"task_retry_interval\":").append(details.getTaskRetryInterval()).append("}");

-

-        System.out.println("JSON="+json.toString());

-

-        Response response = base_target.path("services/"+service_id+"/executions/"+workflow_name).request(MediaType.APPLICATION_JSON).

-                post(Entity.entity(json.toString(), MediaType.APPLICATION_JSON));

-

-        if(!responseOK(response)){

-            throw new Exception("start execution failed: "+response.getStatus()+" "+response.readEntity(String.class));

-        }

-

-        ObjectMapper mapper = new ObjectMapper(new JsonFactory());

-        JsonNode rootNode = mapper.readTree(response.readEntity(String.class));

-        int id=rootNode.get("id").asInt(-1);

-        return id;

-    }

-

-    public void resume_execution(int execution_id, ExecutionDetails details) throws IllegalArgumentException {

-        StringBuilder json=new StringBuilder("{");

-        if(details.getExecutor().length()>0){

-            json.append("\"executor\":\"").append(details.getExecutor()).append("\",");

-        }

-        json.append("\"retry_failed_tasks\":").append(details.isRetry_failed_tasks()).append("}");

-        Response response = base_target.path("executions/"+execution_id).request(MediaType.APPLICATION_JSON).

-                post(Entity.entity(json.toString(), MediaType.APPLICATION_JSON));

-    }

-

-    public void cancel_execution(int execution_id) throws Exception {

-        Response response = base_target.path("executions/"+execution_id).request(MediaType.APPLICATION_JSON).delete();

-        if(!responseOK(response)){

-            throw new Exception("delete service failed: "+response.getStatus()+" "+ response.readEntity(String.class));

-        }

-    }

-

-    /**

-     * -----

-     * ----- PRIVATE METHODS

-     * -----

-     */

-

-    private boolean responseOK(Response response){

-        return response.getStatus()>199 && response.getStatus()<300;

-    }

-

-    private String inputsToJson(List<Input> inputs){

-        if(inputs==null)return null;

-

-        StringBuilder sb=new StringBuilder("\"inputs\":{");

-        for(Input input:inputs){

-            sb.append("\"").append(input.getName()).append("\":\"").append(input.getValue()).append("\",");

-        }

-        if(inputs.size()>0)sb.deleteCharAt(sb.length()-1); //trim comma

-

-        return sb.toString();

-    }

-}

+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  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====================================================
+*/
+package com.gigaspaces.aria.rest.client;
+
+import java.util.List;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.codehaus.jackson.JsonFactory;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
+import org.codehaus.jackson.map.ObjectMapper;
+import com.gigaspaces.aria.rest.client.exceptions.StorageException;
+import com.gigaspaces.aria.rest.client.exceptions.ValidationException;
+
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
+
+/**
+ * Created by DeWayne on 7/12/2017.
+ */
+public class AriaRestClient implements AriaClient {
+	private Client client = null;
+	private WebTarget base_target = null;
+
+	/**
+	 * Construct an Aria REST client
+	 *
+	 * @param protocol
+	 *            either http or https
+	 * @param address
+	 *            the IP address or host name
+	 * @param port
+	 *            the port of the service
+	 * @param version
+	 *            the api version
+	 */
+	public AriaRestClient(String protocol, String address, int port, String version) {
+		this.client = ClientBuilder.newBuilder().register(JacksonJsonProvider.class).build();
+		base_target = client.target(protocol + "://" + address + ":" + port + "/api/" + version);
+	}
+
+	/**
+	 * Installs a service template
+	 *
+	 * @param template
+	 *            the template object
+	 * @throws ValidationException
+	 * @throws StorageException
+	 */
+	public void install_service_template(ServiceTemplate template)
+			throws ValidationException, StorageException, Exception {
+
+		byte[] csarBytes = template.getCSARBytes();
+		Response response = null;
+		if (csarBytes == null) {
+			response = base_target.path("templates/" + template.getName()).request(MediaType.APPLICATION_JSON)
+					.put(Entity.entity(
+							"{\"service-template-path\":\"" + template.getURI().toString() + "\""
+									+ ",\"service-template-filename\":\"" + template.getFilename() + "\"",
+							MediaType.APPLICATION_JSON));
+		}
+		else {
+			
+			response = base_target.path("templates/" + template.getName()).request("application/zip")
+					.put(Entity.entity(csarBytes, "application/zip"));
+		}
+
+		if (response.getStatus() == 500) {
+			throw new StorageException(response.readEntity(String.class));
+		} else if (response.getStatus() == 400) {
+			throw new ValidationException(response.readEntity(String.class));
+		} else if (response.getStatus() > 199 && response.getStatus() < 300) {
+			return;
+		} else {
+			throw new Exception(
+					"Error installing template: " + response.getStatus() + " " + response.readEntity(String.class));
+		}
+	}
+
+	public ValidationResult validate_service_template(ServiceTemplate template) throws Exception {
+		Response response = base_target.path("templates").request(MediaType.APPLICATION_JSON)
+				.post(Entity.entity(
+						"{\"service-template-path\":\"" + template.getURI().toString() + "\""
+								+ ",\"service-template-filename\":\"" + template.getFilename() + "\"}",
+						MediaType.APPLICATION_JSON));
+
+		ValidationResultImpl result = new ValidationResultImpl();
+		if (response.getStatus() >= 200 && response.getStatus() < 300) {
+			result.setFailed(false);
+		} else if (response.getStatus() == 400) {
+			result.setFailed(true);
+		} else {
+			throw new Exception(
+					"received error response '" + response.getStatus() + "':" + response.readEntity(String.class));
+		}
+		return result;
+
+	}
+
+	/**
+	 *
+	 * @return a list of service templates
+	 */
+	public List<? extends ServiceTemplate> list_service_templates() {
+		List<? extends ServiceTemplate> templates = base_target.path("templates").request(MediaType.APPLICATION_JSON)
+				.get(new GenericType<List<ServiceTemplateImpl>>() {
+				});
+
+		return templates;
+	}
+
+	/**
+	 * Deletes the specified template.
+	 *
+	 * TODO: Error handling is a little blunt. Need to describe failures better
+	 *
+	 * @param template_id
+	 *            the template id to delete
+	 * @throws IllegalArgumentException
+	 *             thrown when the template can't be deleted
+	 * @throws Exception
+	 *             other server side errors
+	 */
+	public void delete_service_template(int template_id) throws IllegalArgumentException, Exception {
+		Response response = base_target.path("templates/" + template_id).request(MediaType.APPLICATION_JSON).delete();
+
+		if (response.getStatus() >= 200 && response.getStatus() < 300) {
+			return;
+		} else if (response.getStatus() == 400) {
+			throw new IllegalArgumentException("Error deleting template '" + template_id + "'");
+		} else {
+			throw new Exception("Error processing request. Return code = " + response.getStatus());
+		}
+	}
+
+	/**
+	 * List the node templates for a given template id
+	 *
+	 * @param template_id
+	 * @return
+	 */
+	public List<? extends NodeTemplate> list_nodes(int template_id) {
+		List<? extends NodeTemplate> nodes = base_target.path("templates/" + template_id + "/nodes")
+				.request(MediaType.APPLICATION_JSON).get(new GenericType<List<NodeTemplateImpl>>() {
+				});
+		return nodes;
+	}
+
+	/**
+	 * Get a specific node by id
+	 *
+	 * @param node_id
+	 *            the node id
+	 * @return
+	 * @throws IllegalArgumentException
+	 */
+	public NodeTemplate get_node(int node_id) throws IllegalArgumentException {
+		NodeTemplate node = base_target.path("nodes/" + node_id).request(MediaType.APPLICATION_JSON)
+				.get(NodeTemplateImpl.class);
+		return node;
+	}
+
+	public List<? extends Service> list_services() {
+		List<? extends Service> services = base_target.path("services").request(MediaType.APPLICATION_JSON)
+				.get(new GenericType<List<ServiceImpl>>() {
+				});
+		return services;
+	}
+
+	public Service get_service(int service_id) throws IllegalArgumentException {
+		throw new NotImplementedException();
+	}
+
+	public List<? extends Output> list_service_outputs(int service_id) throws IllegalArgumentException {
+		List<? extends Output> outputs = base_target.path("services").request(MediaType.APPLICATION_JSON)
+				.get(new GenericType<List<OutputImpl>>() {
+				});
+		return outputs;
+	}
+
+	public List<? extends Input> list_service_inputs(int service_id) throws IllegalArgumentException {
+		List<? extends Input> inputs = base_target.path("services").request(MediaType.APPLICATION_JSON)
+				.get(new GenericType<List<InputImpl>>() {
+				});
+		return inputs;
+	}
+
+	/**
+	 * Create a service based on the supplied template
+	 *
+	 * @param template_id
+	 *            the template to create the service for
+	 * @param service_name
+	 *            a name for the service
+	 * @param inputs
+	 *            an optional list of inputs for the service (can be null)
+	 * @throws Exception
+	 */
+	public void create_service(int template_id, String service_name, List<Input> inputs) throws Exception {
+
+		String json = "{" + inputsToJson(inputs) + "}";
+
+		Response response = base_target.path("templates/" + template_id + "/services/" + service_name)
+				.request(MediaType.APPLICATION_JSON).post(Entity.entity(json, MediaType.APPLICATION_JSON));
+
+		if (response.getStatus() < 200 || response.getStatus() > 299) {
+			throw new Exception(
+					"create service failed:" + response.getStatus() + " " + response.readEntity(String.class));
+		}
+	}
+
+	public void delete_service(int service_id) throws Exception {
+		Response response = base_target.path("services/" + service_id).request(MediaType.APPLICATION_JSON).delete();
+		if (!responseOK(response)) {
+			throw new Exception(
+					"delete service failed: " + response.getStatus() + " " + response.readEntity(String.class));
+		}
+	}
+
+	/**
+	 * List user workflows for supplied service
+	 *
+	 * @param service_id
+	 * @return
+	 * @throws IllegalArgumentException
+	 */
+	public List<? extends Workflow> list_workflows(int service_id) throws IllegalArgumentException {
+		List<? extends Workflow> workflows = base_target.path("services/" + service_id + "/workflows")
+				.request(MediaType.APPLICATION_JSON).get(new GenericType<List<WorkflowImpl>>() {
+				});
+		return workflows;
+	}
+
+	public Workflow get_workflow(int workflow_id) throws IllegalArgumentException {
+		throw new NotImplementedException();
+	}
+
+	/**
+	 * List all executions
+	 *
+	 * @return
+	 * @throws Exception
+	 */
+	public List<? extends Execution> list_executions() throws Exception {
+		List<? extends Execution> executions = base_target.path("executions").request(MediaType.APPLICATION_JSON)
+				.get(new GenericType<List<ExecutionImpl>>() {
+				});
+		return executions;
+	}
+
+	/**
+	 * List executions for specified service
+	 *
+	 * @param service_id
+	 * @return
+	 * @throws Exception
+	 */
+	public List<? extends Execution> list_executions(int service_id) throws Exception {
+		List<? extends Execution> executions = base_target.path("services/" + service_id + "/executions")
+				.request(MediaType.APPLICATION_JSON).get(new GenericType<List<ExecutionImpl>>() {
+				});
+		return executions;
+	}
+
+	/**
+	 * Get details about a specified execution
+	 *
+	 * @param execution_id
+	 * @return
+	 * @throws IllegalArgumentException
+	 */
+	public Execution get_execution(int execution_id) throws IllegalArgumentException {
+		Execution execution = base_target.path("executions/" + execution_id).request(MediaType.APPLICATION_JSON)
+				.get(ExecutionImpl.class);
+		return execution;
+	}
+
+	/**
+	 * Start an execution for the specified service
+	 *
+	 * @param service_id
+	 *            the service to run the execution for
+	 * @param workflow_name
+	 *            the name of the workflow to execute
+	 * @param details
+	 *            details controlling execution operation
+	 * @return the execution id
+	 * @throws Exception
+	 */
+	public int start_execution(int service_id, String workflow_name, ExecutionDetails details) throws Exception {
+		StringBuilder json = new StringBuilder("{");
+		if (details.getExecutor().length() > 0) {
+			json.append("\"executor\":\"").append(details.getExecutor()).append("\",");
+		}
+		if (details.getInputs() != null) {
+			json.append(inputsToJson(details.getInputs()));
+		}
+		json.append("\"task_max_attempts\":").append(details.getTaskMaxAttempts()).append(",");
+		json.append("\"task_retry_interval\":").append(details.getTaskRetryInterval()).append("}");
+
+		System.out.println("JSON=" + json.toString());
+
+		Response response = base_target.path("services/" + service_id + "/executions/" + workflow_name)
+				.request(MediaType.APPLICATION_JSON).post(Entity.entity(json.toString(), MediaType.APPLICATION_JSON));
+
+		if (!responseOK(response)) {
+			throw new Exception(
+					"start execution failed: " + response.getStatus() + " " + response.readEntity(String.class));
+		}
+
+		ObjectMapper mapper = new ObjectMapper(new JsonFactory());
+		JsonNode rootNode = mapper.readTree(response.readEntity(String.class));
+		int id = rootNode.get("id").asInt(-1);
+		return id;
+	}
+
+	public void resume_execution(int execution_id, ExecutionDetails details) throws IllegalArgumentException {
+		StringBuilder json = new StringBuilder("{");
+		if (details.getExecutor().length() > 0) {
+			json.append("\"executor\":\"").append(details.getExecutor()).append("\",");
+		}
+		json.append("\"retry_failed_tasks\":").append(details.isRetry_failed_tasks()).append("}");
+		Response response = base_target.path("executions/" + execution_id).request(MediaType.APPLICATION_JSON)
+				.post(Entity.entity(json.toString(), MediaType.APPLICATION_JSON));
+	}
+
+	public void cancel_execution(int execution_id) throws Exception {
+		Response response = base_target.path("executions/" + execution_id).request(MediaType.APPLICATION_JSON).delete();
+		if (!responseOK(response)) {
+			throw new Exception(
+					"delete service failed: " + response.getStatus() + " " + response.readEntity(String.class));
+		}
+	}
+
+	/**
+	 * ----- ----- PRIVATE METHODS -----
+	 */
+
+	private boolean responseOK(Response response) {
+		return response.getStatus() > 199 && response.getStatus() < 300;
+	}
+
+	private String inputsToJson(List<Input> inputs) {
+		if (inputs == null)
+			return null;
+
+		StringBuilder sb = new StringBuilder("\"inputs\":{");
+		for (Input input : inputs) {
+			sb.append("\"").append(input.getName()).append("\":\"").append(input.getValue()).append("\",");
+		}
+		if (inputs.size() > 0)
+			sb.deleteCharAt(sb.length() - 1); // trim comma
+
+		return sb.toString();
+	}
+}
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Execution.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Execution.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ExecutionDetails.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ExecutionDetails.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ExecutionImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ExecutionImpl.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Input.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Input.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/InputImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/InputImpl.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/NodeTemplate.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/NodeTemplate.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/NodeTemplateImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/NodeTemplateImpl.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Output.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Output.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/OutputImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/OutputImpl.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Service.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Service.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceImpl.java
new file mode 100644
index 0000000..456335c
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceImpl.java
@@ -0,0 +1,58 @@
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  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====================================================
+*/
+package com.gigaspaces.aria.rest.client;
+
+import java.net.URI;
+import java.util.Date;
+
+/**
+ * 
+ *
+ * Created by DeWayne on 7/17/2017.
+ */
+public class ServiceImpl implements Service {
+    private int id;
+    private String description, name, template;
+    private Date created, updated;
+
+    public int getId(){
+        return id;
+    }
+
+    public String getDescription(){
+        return description;
+    }
+
+    public String getName(){
+        return name;
+    }
+
+    public String getServiceTemplate(){
+	return template;
+    }
+
+    public Date getCreated(){
+        return created;
+    }
+
+    public Date getUpdated(){
+        return updated;
+    }
+    
+        
+}    
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplate.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplate.java
old mode 100755
new mode 100644
index 0df6d60..a2ca8cf
--- a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplate.java
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplate.java
@@ -1,31 +1,32 @@
-/*

- * ============LICENSE_START===================================================

- * Copyright (c) 2017 Cloudify.co.  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====================================================

-*/

-package com.gigaspaces.aria.rest.client;

-

-import java.net.URI;

-

-/**

- * Created by DeWayne on 7/12/2017.

- */

-public interface ServiceTemplate {

-    String getName();

-    URI getURI();

-    int getId();

-    String getFilename();

-    String getDescription();

-}

+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  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====================================================
+*/
+package com.gigaspaces.aria.rest.client;
+
+import java.net.URI;
+
+/**
+ * Created by DeWayne on 7/12/2017.
+ */
+public interface ServiceTemplate {
+    String getName();
+    URI getURI();
+    int getId();
+    String getFilename();
+    String getDescription();
+    byte[] getCSARBytes();
+}
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplateImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplateImpl.java
old mode 100755
new mode 100644
index 9e158a2..a41d5b7
--- a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplateImpl.java
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplateImpl.java
@@ -31,6 +31,7 @@
     private URI uri;
     private String filename = DEFAULT_TEMPLATE_NAME;
     private String description;
+    private byte[] csar_blob; // for opaque binary
 
     public ServiceTemplateImpl(){}
 
@@ -40,7 +41,7 @@
     }
 
     /**
-     * Construct an instance
+     * Construct an instance based on CSAR
      * @param name a textual name for the template
      * @param uri a URI to a CSAR
      * @param filename the filename in the CSAR representing main yaml template
@@ -51,6 +52,13 @@
         this.filename=filename;
         this.description=description;
     }
+    
+    /**
+     * Construct an instance based on CSAR array
+     */
+    public ServiceTemplateImpl(byte[] csar_bytes) {
+    	this.csar_blob = csar_bytes;
+    }
 
     public int getId(){
         return id;
@@ -76,6 +84,9 @@
     public void setFilename(String filename){
         this.filename=filename;
     }
+    public byte[] getCSARBytes() {
+    	return csar_blob;
+    }
 
     public String getDescription(){ return description;}
 }
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ValidationResult.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ValidationResult.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ValidationResultImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ValidationResultImpl.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Workflow.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Workflow.java
old mode 100755
new mode 100644
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/WorkflowImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/WorkflowImpl.java
old mode 100755
new mode 100644
diff --git a/bpmn/MSOCommonBPMN/pom.xml b/bpmn/MSOCommonBPMN/pom.xml
index 4a7cb59..523ee40 100644
--- a/bpmn/MSOCommonBPMN/pom.xml
+++ b/bpmn/MSOCommonBPMN/pom.xml
@@ -501,5 +501,16 @@
 			<artifactId>guava</artifactId>
 			<version>22.0</version>
 		</dependency>
+		<dependency>
+			<groupId>org.assertj</groupId>
+			<artifactId>assertj-core</artifactId>
+			<version>3.9.0</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>pl.pragmatists</groupId>
+			<artifactId>JUnitParams</artifactId>
+			<version>1.1.1</version>
+		</dependency>
 	</dependencies>
 </project>
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/aai/AAIRestClient.java b/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/aai/AAIRestClient.java
index ca815cf..214be06 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/aai/AAIRestClient.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/aai/AAIRestClient.java
@@ -32,13 +32,9 @@
 
 public interface AAIRestClient {
 	
-	Pservers getPhysicalServers(String hostName, String uuid);
-	
-	List<Pserver> getPhysicalServerByVnfId(String vnfId, String transactionLoggingUuid) throws UnsupportedEncodingException, JsonParseException, JsonMappingException, IOException;
-	
-	void updateMaintenceFlag(String vnfId,boolean inMaint, String transactionLoggingUuid) throws Exception;
-
-	void updateMaintenceFlagVnfId(String vnfId, boolean inMaint, String transactionLoggingUuid) throws Exception;
-	
-	GenericVnf getVnfByName(String vnfId,  String transactionLoggingUuid) throws Exception;
+Pservers getPhysicalServers(String hostName, String uuid);	
+List<Pserver> getPhysicalServerByVnfId(String vnfId, String transactionLoggingUuid) throws UnsupportedEncodingException, JsonParseException, JsonMappingException, IOException;	
+void updateMaintenceFlag(String vnfId,boolean inMaint, String transactionLoggingUuid) throws JsonParseException, JsonMappingException, IOException;
+void updateMaintenceFlagVnfId(String vnfId, boolean inMaint, String transactionLoggingUuid) throws JsonParseException, JsonMappingException , IOException;
+GenericVnf getVnfByName(String vnfId,  String transactionLoggingUuid) throws JsonParseException, JsonMappingException , IOException;
 }
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/aai/AAIRestClientImpl.java b/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/aai/AAIRestClientImpl.java
index ae8638f..af1eddf 100644
--- a/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/aai/AAIRestClientImpl.java
+++ b/bpmn/MSOCommonBPMN/src/main/java/org/openecomp/mso/client/aai/AAIRestClientImpl.java
@@ -139,14 +139,14 @@
 	}
 	
 	@Override
-	public void updateMaintenceFlag(String vnfName, boolean inMaint, String transactionLoggingUuid) throws Exception {
+	public void updateMaintenceFlag(String vnfName, boolean inMaint, String transactionLoggingUuid) throws JsonParseException, JsonMappingException, IOException {
 		GenericVnfs genericVnfs = webTarget.register(AAIResourcesObjectMapperProvider.class).path(ENDPOINT_GET_ALL_VNFS)
 				.queryParam("vnf-name", vnfName).request().header("X-FromAppId", "MSO")
 				.header("X-TransactionId", transactionLoggingUuid).header("Content-Type", "application/json")
 				.accept(MediaType.APPLICATION_JSON_TYPE).get().readEntity(GenericVnfs.class);
 
 		if (genericVnfs.getGenericVnf().size() > 1)
-			throw new Exception("Multiple Generic Vnfs Returned");
+			throw new IndexOutOfBoundsException ("Multiple Generic Vnfs Returned");
 
 		GenericVnf genericVnf = genericVnfs.getGenericVnf().get(0);
 		updateMaintenceFlagVnfId(genericVnf.getVnfId(), inMaint, transactionLoggingUuid);
@@ -154,7 +154,7 @@
 
 	@Override
 	public void updateMaintenceFlagVnfId(String vnfId, boolean inMaint, String transactionLoggingUuid)
-			throws Exception {
+			throws JsonParseException, JsonMappingException, IOException {
 		GenericVnf genericVnf = new GenericVnf();
 		genericVnf.setInMaint(inMaint);
 		webTarget.register(AAIResourcesObjectMapperProvider.class).path(GENERIC_VNF_PATH + "/" + vnfId).request()
@@ -165,7 +165,7 @@
 	}
 
 	@Override
-	public GenericVnf getVnfByName(String vnfId, String transactionLoggingUuid) throws Exception {
+	public GenericVnf getVnfByName(String vnfId, String transactionLoggingUuid) throws JsonParseException, JsonMappingException, IOException {
 		return webTarget.register(AAIResourcesObjectMapperProvider.class).path(GENERIC_VNF_PATH + "/" + vnfId).request()
 				.header("X-FromAppId", "MSO").header("X-TransactionId", transactionLoggingUuid)
 				.header("Content-Type", "application/json").accept(MediaType.APPLICATION_JSON_TYPE).get()
diff --git a/bpmn/MSOCommonBPMN/src/test/groovy/org/openecomp/mso/bpmn/common/scripts/CompleteMsoProcessTest.groovy b/bpmn/MSOCommonBPMN/src/test/groovy/org/openecomp/mso/bpmn/common/scripts/CompleteMsoProcessTest.groovy
index ab7ee7a..5949c3a 100644
--- a/bpmn/MSOCommonBPMN/src/test/groovy/org/openecomp/mso/bpmn/common/scripts/CompleteMsoProcessTest.groovy
+++ b/bpmn/MSOCommonBPMN/src/test/groovy/org/openecomp/mso/bpmn/common/scripts/CompleteMsoProcessTest.groovy
@@ -16,23 +16,24 @@
  * See the License for the specific language governing permissions and 
  * limitations under the License. 
  * ============LICENSE_END========================================================= 
- */ 
+ */
 
 package org.openecomp.mso.bpmn.common.scripts
 
-import org.junit.runner.RunWith;
-import static org.junit.Assert.*
-import static org.mockito.Mockito.*
-
 import org.camunda.bpm.engine.delegate.BpmnError
 import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
 import org.mockito.MockitoAnnotations
 import org.mockito.runners.MockitoJUnitRunner
 import org.openecomp.mso.bpmn.core.WorkflowException
 
+import static org.assertj.core.api.Assertions.assertThat
+import static org.assertj.core.api.Assertions.assertThatThrownBy
+import static org.mockito.Matchers.eq
+import static org.mockito.Mockito.*
 
 @RunWith(MockitoJUnitRunner.class)
 class CompleteMsoProcessTest {
@@ -128,7 +129,7 @@
 		when(mockExecution.getVariable("CMSO_mso-bpel-name")).thenReturn("BPEL")
 		when(mockExecution.getVariable("URN_mso_adapters_db_auth")).thenReturn("757A94191D685FD2092AC1490730A4FC");
 		when(mockExecution.getVariable("URN_mso_msoKey")).thenReturn("07a7159d3bf51a0e53be7a8f89699be7");
-		
+
 		CompleteMsoProcess completeMsoProcess = new CompleteMsoProcess()
 		completeMsoProcess.setUpdateDBstatustoSuccessPayload(mockExecution)
 
@@ -145,29 +146,25 @@
 </sdncadapterworkflow:MsoCompletionResponse>"""
 */
 	@Test
-	public void testbuildDataError(){
+    void testBuildDataError() {
+		// given
+		def message = "Some-Message"
 
-		boolean thrown = false;
-		String msg = "Some-Message";
-		
-		ExecutionEntity mockExecution = mock(ExecutionEntity.class)
-		when(mockExecution.getVariable("CMSO_mso-bpel-name")).thenReturn("BPEL-NAME")
-		when(mockExecution.getVariable("testProcessKey")).thenReturn("CompleteMsoProcess")
-		
-		WorkflowException exception = new WorkflowException("CompleteMsoProcess", 500, msg);
+		def mockExecution = mock ExecutionEntity.class
+		when mockExecution.getVariable("CMSO_mso-bpel-name") thenReturn "BPEL-NAME"
+		when mockExecution.getVariable("testProcessKey") thenReturn "CompleteMsoProcess"
 
-		try{
-		CompleteMsoProcess completeMsoProcess = new CompleteMsoProcess()
-		completeMsoProcess.buildDataError(mockExecution, msg)
-		}
-		catch (BpmnError e){
-			thrown = true;
-		}
+		def completeMsoProcess = new CompleteMsoProcess()
+		// when
+		assertThatThrownBy { completeMsoProcess.buildDataError(mockExecution, message) } isInstanceOf BpmnError
+		// then
+		verify mockExecution setVariable("CompleteMsoProcessResponse", msoCompletionResponse)
+		def argumentCaptor = ArgumentCaptor.forClass WorkflowException.class
+		verify mockExecution setVariable(eq("WorkflowException"), argumentCaptor.capture())
+		def capturedException = argumentCaptor.value
 
-		
-		verify(mockExecution).setVariable("CompleteMsoProcessResponse",msoCompletionResponse)
-		// Can't seem to figure out how to verify the exception and have spent way too much time on fixing this test case!
-		//verify(mockExecution).setVariable("WorkflowException",exception)
-		assertTrue(thrown);
-	}
+		assertThat capturedException.processKey isEqualTo "CompleteMsoProcess"
+		assertThat capturedException.errorCode isEqualTo 500
+		assertThat capturedException.errorMessage isEqualTo message
+    }
 }
\ No newline at end of file
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/ResponseExceptionMapperImplTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/ResponseExceptionMapperImplTest.java
new file mode 100644
index 0000000..8943014
--- /dev/null
+++ b/bpmn/MSOCommonBPMN/src/test/java/org/openecomp/mso/client/ResponseExceptionMapperImplTest.java
@@ -0,0 +1,111 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.mso.client;
+
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import com.google.common.base.Charsets;
+import javax.ws.rs.BadRequestException;
+import javax.ws.rs.ForbiddenException;
+import javax.ws.rs.InternalServerErrorException;
+import javax.ws.rs.NotAcceptableException;
+import javax.ws.rs.NotAllowedException;
+import javax.ws.rs.NotAuthorizedException;
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.NotSupportedException;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.client.ClientResponseContext;
+import javax.ws.rs.core.Response.Status;
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import org.apache.commons.io.IOUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(JUnitParamsRunner.class)
+public class ResponseExceptionMapperImplTest {
+
+    private static final ResponseExceptionMapperImpl mapper = new ResponseExceptionMapperImpl();
+
+    public static Object[][] statusesAndCorrespondingExceptions() {
+        return new Object[][]{
+                {Status.BAD_REQUEST, BadRequestException.class},
+                {Status.UNAUTHORIZED, NotAuthorizedException.class},
+                {Status.FORBIDDEN, ForbiddenException.class},
+                {Status.NOT_FOUND, NotFoundException.class},
+                {Status.METHOD_NOT_ALLOWED, NotAllowedException.class},
+                {Status.NOT_ACCEPTABLE, NotAcceptableException.class},
+                {Status.PRECONDITION_FAILED, PreconditionFailedException.class},
+                {Status.UNSUPPORTED_MEDIA_TYPE, NotSupportedException.class},
+                {Status.INTERNAL_SERVER_ERROR, InternalServerErrorException.class},
+                {Status.SERVICE_UNAVAILABLE, WebApplicationException.class},
+                {Status.BAD_GATEWAY, WebApplicationException.class},
+        };
+    }
+
+    @Test
+    @Parameters(method = "statusesAndCorrespondingExceptions")
+    public void shouldThrowExceptionWhenStatusIsNotOk(Status status, Class<Exception> expectedException) {
+        // given
+        ClientResponseContext responseContext = createMockResponseContext(status);
+        // when, then
+        assertThatThrownBy(() -> mapper.filter(null, responseContext)).isInstanceOf(expectedException);
+    }
+
+    @Test
+    public void shouldNotThrowExceptionWhenStatusIsOk() {
+        // given
+        ClientResponseContext responseContext = createMockResponseContext(Status.OK);
+        // when, then
+        assertThatCode(() -> mapper.filter(null, responseContext)).doesNotThrowAnyException();
+    }
+
+    @Test
+    public void shouldThrowExceptionWithCustomMessageWhenResponseHasEntity() {
+        // given
+        ClientResponseContext responseContext = createMockResponseContext(Status.BAD_REQUEST);
+        when(responseContext.hasEntity()).thenReturn(true);
+        when(responseContext.getEntityStream()).thenReturn(IOUtils.toInputStream("test message", Charsets.UTF_8));
+        // when, then
+        assertThatThrownBy(() -> mapper.filter(null, responseContext)).isInstanceOf(BadRequestException.class)
+                .hasMessage("test message");
+    }
+
+    @Test
+    public void shouldThrowExceptionWithDefaultMessageWhenResponseHasNoEntity() {
+        // given
+        ClientResponseContext responseContext = createMockResponseContext(Status.BAD_REQUEST);
+        when(responseContext.hasEntity()).thenReturn(false);
+        // when, then
+        assertThatThrownBy(() -> mapper.filter(null, responseContext)).isInstanceOf(BadRequestException.class)
+                .hasMessage("empty message");
+    }
+
+    private static ClientResponseContext createMockResponseContext(Status status) {
+        ClientResponseContext responseContext = mock(ClientResponseContext.class);
+        when(responseContext.getStatusInfo()).thenReturn(status);
+        when(responseContext.getStatus()).thenReturn(status.getStatusCode());
+        return responseContext;
+    }
+}
\ No newline at end of file
diff --git a/common/src/main/java/org/openecomp/mso/logger/MsoLogger.java b/common/src/main/java/org/openecomp/mso/logger/MsoLogger.java
index 86aedc1..b8c4aed 100644
--- a/common/src/main/java/org/openecomp/mso/logger/MsoLogger.java
+++ b/common/src/main/java/org/openecomp/mso/logger/MsoLogger.java
@@ -144,15 +144,16 @@
     // For internal logging of the initialization of MSO logs
     private static final Logger LOGGER      = Logger.getLogger(MsoLogger.class.getName());
 
-    private MsoLogger(MsoLogger.Catalog cat) {
-        this.logger = EELFManager.getInstance().getErrorLogger();
-        this.auditLogger = EELFManager.getInstance().getAuditLogger();
-        this.metricsLogger = EELFManager.getInstance().getMetricsLogger();
-        MsoLogger.initialization();
-        setDefaultLogCatalog(cat);
-    }
 
-    private static synchronized void initialization() {
+    // Since four adaptors are using the instance of  MsoLogger which will be referenced everywhere
+    // hence limiting the number of MsoLogger instances to five.
+    private static final MsoLogger generalMsoLogger = new MsoLogger(Catalog.GENERAL);
+    private static final MsoLogger apihLogger = new MsoLogger(Catalog.APIH);
+    private static final MsoLogger asdcLogger = new MsoLogger(Catalog.ASDC);
+    private static final MsoLogger raLogger = new MsoLogger(Catalog.RA);
+    private static final MsoLogger bpelLogger = new MsoLogger(Catalog.BPEL);
+
+    static {
         if (instanceUUID == null || ("").equals(instanceUUID)) {
             instanceUUID = getInstanceUUID();
         }
@@ -170,15 +171,40 @@
         }
     }
 
+    // Singleton instances of the EELFLogger of all types are referenced by MsoLogger
+    private MsoLogger(Catalog cat) {
+        this.logger = EELFManager.getInstance().getErrorLogger();
+        this.auditLogger = EELFManager.getInstance().getAuditLogger();
+        this.metricsLogger = EELFManager.getInstance().getMetricsLogger();
+        this.setDefaultLogCatalog(cat);
+    }
+
+
+
     /**
      * Get the MsoLogger based on the catalog
-     * 
+     * This method is fixed now to resolve the total number of objects that are getting created
+     * everytime this function gets called. Its supposed to have fixed number of instance per java process.
+     *
      * @param cat
      *            Catalog of the logger
      * @return the MsoLogger
      */
     public static synchronized MsoLogger getMsoLogger(MsoLogger.Catalog cat) {
-        return new MsoLogger(cat);
+        switch (cat) {
+            case GENERAL:
+                return generalMsoLogger;
+            case APIH:
+                return apihLogger;
+            case RA:
+                return raLogger;
+            case BPEL:
+                return bpelLogger;
+            case ASDC:
+                return asdcLogger;
+            default:
+                return generalMsoLogger;
+        }
     }
 
     /**
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaClient.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaClient.java
index c8889be..b9c0725 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaClient.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaClient.java
@@ -36,6 +36,7 @@
 
 public class CamundaClient extends RequestClient{
 	private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH);
+	private static final String CAMUNDA_URL_MESAGE = "Camunda url is: ";
 
 	public CamundaClient() {
 		super(CommonConstants.CAMUNDA);
@@ -47,13 +48,13 @@
 			String requestTimeout, String schemaVersion, String serviceInstanceId, String action)
 					throws ClientProtocolException, IOException{
 		HttpPost post = new HttpPost(url);
-		msoLogger.debug("Camunda url is: "+ url);
+		msoLogger.debug(CAMUNDA_URL_MESAGE + url);
 		String jsonReq = wrapRequest(camundaReqXML, requestId, serviceInstanceId, requestTimeout,  schemaVersion);
 
 		StringEntity input = new StringEntity(jsonReq);
 		input.setContentType(CommonConstants.CONTENT_TYPE_JSON);
 
-		String encryptedCredentials = null;
+		String encryptedCredentials;
 		if(props!=null){
 			encryptedCredentials = props.getProperty(CommonConstants.CAMUNDA_AUTH,null);
 			if(encryptedCredentials != null){
@@ -65,22 +66,18 @@
 		}
 
 		post.setEntity(input);
-		HttpResponse response = client.execute(post);
-
-		return response;
+        return client.execute(post);
 	}
 
 	@Override
-	public HttpResponse post(String jsonReq)
-					throws ClientProtocolException, IOException{
+	public HttpResponse post(String jsonReq) throws ClientProtocolException, IOException{
 		HttpPost post = new HttpPost(url);
-		msoLogger.debug("Camunda url is: "+ url);
-		//String jsonReq = wrapRequest(camundaReqXML, requestId, serviceInstanceId, requestTimeout,  schemaVersion);
+		msoLogger.debug(CAMUNDA_URL_MESAGE + url);
 
 		StringEntity input = new StringEntity(jsonReq);
 		input.setContentType(CommonConstants.CONTENT_TYPE_JSON);
 
-		String encryptedCredentials = null;
+		String encryptedCredentials;
 		if(props!=null){
 			encryptedCredentials = props.getProperty(CommonConstants.CAMUNDA_AUTH,null);
 			if(encryptedCredentials != null){
@@ -92,9 +89,8 @@
 		}
 
 		post.setEntity(input);
-		HttpResponse response = client.execute(post);
 
-		return response;
+        return client.execute(post);
 	}
 
 	@Override
@@ -105,7 +101,7 @@
 			String requestDetails)
 					throws ClientProtocolException, IOException{
 		HttpPost post = new HttpPost(url);
-		msoLogger.debug("Camunda url is: "+ url);
+		msoLogger.debug(CAMUNDA_URL_MESAGE + url);
 		String jsonReq = wrapVIDRequest(requestId, isBaseVfModule, recipeTimeout, requestAction,
 				serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId,
 				serviceType, vnfType, vfModuleType, networkType, requestDetails);
@@ -113,7 +109,7 @@
 		StringEntity input = new StringEntity(jsonReq);
 		input.setContentType(CommonConstants.CONTENT_TYPE_JSON);
 
-		String encryptedCredentials = null;
+		String encryptedCredentials;
 		if(props!=null){
 			encryptedCredentials = props.getProperty(CommonConstants.CAMUNDA_AUTH,null);
 			if(encryptedCredentials != null){
@@ -125,9 +121,8 @@
 		}
 
 		post.setEntity(input);
-		HttpResponse response = client.execute(post);
 
-		return response;
+        return client.execute(post);
 	}
 	
 	@Override
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaTaskClient.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaTaskClient.java
index b4e7b7e..64193cf 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaTaskClient.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/CamundaTaskClient.java
@@ -20,19 +20,14 @@
 

 package org.openecomp.mso.apihandler.common;

 

-import org.openecomp.mso.logger.MessageEnum;

 import org.openecomp.mso.logger.MsoLogger;

 import org.apache.http.HttpResponse;

 import org.apache.http.client.ClientProtocolException;

 import org.apache.http.client.methods.HttpGet;

 import org.apache.http.client.methods.HttpPost;

 import org.apache.http.entity.StringEntity;

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

-import org.codehaus.jackson.map.SerializationConfig;

 

 import javax.xml.bind.DatatypeConverter;

-import java.io.BufferedReader;

-import java.io.InputStreamReader;

 import java.io.IOException;

 

 public class CamundaTaskClient extends RequestClient{

@@ -63,9 +58,7 @@
 		}

 

 		post.setEntity(input);

-		HttpResponse response = client.execute(post);

-

-		return response;

+		return client.execute(post);

 	}

 	

 	@Override

@@ -88,8 +81,7 @@
 	}

 	

 	@Override

-	public HttpResponse get()

-			throws ClientProtocolException, IOException{

+	public HttpResponse get() throws ClientProtocolException, IOException{

 		HttpGet get = new HttpGet(url);

 		msoLogger.debug("Camunda Task url is: "+ url);	

 		String encryptedCredentials;

@@ -103,12 +95,7 @@
 			}

 		}

 		

-		HttpResponse getResponse = client.execute(get);	

-

-		return getResponse;

-}

-	

-	

-

+		return client.execute(get);

+	}

 

 }

diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ErrorNumbers.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ErrorNumbers.java
index 72f72c2..2cafef3 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ErrorNumbers.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ErrorNumbers.java
@@ -22,6 +22,9 @@
  
 public final class ErrorNumbers {
 
+    private ErrorNumbers() {
+    }
+
     public static final String REQUEST_FAILED_SCHEMA_VALIDATION = "1000";
     public static final String RECIPE_DOES_NOT_EXIST = "1010";
     public static final String VFMODULE_TYPE_DOES_NOT_EXIST = "1011";
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/LSInputImpl.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/LSInputImpl.java
index 42d77f5..b39b534 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/LSInputImpl.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/LSInputImpl.java
@@ -37,9 +37,6 @@
     protected String fEncoding;
     protected boolean fCertifiedText;
 
-    public LSInputImpl () {
-    }
-
     @Override
     public InputStream getByteStream () {
         return fByteStream;
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClient.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClient.java
index 1324e12..addf4e1 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClient.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClient.java
@@ -22,7 +22,6 @@
 
 import java.io.IOException;
 import java.security.GeneralSecurityException;
-import java.util.Properties;
 
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ClientProtocolException;
@@ -83,16 +82,11 @@
 	
 	protected String getEncryptedPropValue (String prop, String defaultValue, String encryptionKey) {
 		 try {
-			 String result = CryptoUtils.decrypt(prop, encryptionKey);
-			 return result;
+			 return CryptoUtils.decrypt(prop, encryptionKey);
 		 }	
 		 catch (GeneralSecurityException e) {
 			 msoLogger.debug("Security exception", e);
 		 }
 		 return defaultValue;
 	 }
-
-	
-
-
 }
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClientFactory.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClientFactory.java
index 773c5b0..8f91986 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClientFactory.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/RequestClientFactory.java
@@ -21,14 +21,15 @@
 package org.openecomp.mso.apihandler.common;
 
 
-import java.util.Properties;
-
 import org.apache.http.impl.client.DefaultHttpClient;
 
 import org.openecomp.mso.properties.MsoJavaProperties;
 
 public class RequestClientFactory {
-	
+
+    private RequestClientFactory() {
+    }
+
 	//based on URI, returns BPEL, CamundaTask or Camunda client
 	public static RequestClient getRequestClient(String orchestrationURI, MsoJavaProperties props) throws IllegalStateException{
 		RequestClient retClient;
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ResponseHandler.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ResponseHandler.java
index 6722a93..4e7cf4c 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ResponseHandler.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ResponseHandler.java
@@ -41,6 +41,7 @@
 	private HttpResponse httpResponse;
 	private int type;
 	private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH);
+    private static final String RESPONSE_BODY_MSG = "response body is: ";
 
 	public ResponseHandler(HttpResponse httpResponse, int type) {
 		this.httpResponse = httpResponse;
@@ -84,7 +85,7 @@
 			if(response!=null){
 				responseBody = response.getResponse();
 			}
-			msoLogger.debug("response body is: " + responseBody);
+			msoLogger.debug(RESPONSE_BODY_MSG + responseBody);
 			
 		
 		if(status!=HttpStatus.SC_ACCEPTED){
@@ -99,7 +100,7 @@
 		try {
 			if (bpelEntity!=null) {
 				responseBody = EntityUtils.toString(bpelEntity);
-				msoLogger.debug("response body is: " + responseBody);
+				msoLogger.debug(RESPONSE_BODY_MSG + responseBody);
 
 			}
 			if(status!=HttpStatus.SC_ACCEPTED){
@@ -118,7 +119,7 @@
 		try {
 			if (camundataskEntity!=null) {
 				responseBody = EntityUtils.toString(camundataskEntity);
-				msoLogger.debug("response body is: " + responseBody);
+				msoLogger.debug(RESPONSE_BODY_MSG + responseBody);
 
 			}
 			if(status!=HttpStatus.SC_NO_CONTENT && status != HttpStatus.SC_ACCEPTED){
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ValidationException.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ValidationException.java
index bf2088e..73bf020 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ValidationException.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ValidationException.java
@@ -31,17 +31,18 @@
      **/
 
     private static final long serialVersionUID = 1L;
-    private static final String validationFailMessage = "No valid $ELEMENT is specified";
-    private static final String invalidElementMessage = "$ELEMENT is not valid in the $VERSION version";
+    private static final String VALIDATION_FAIL_MESSAGE = "No valid $ELEMENT is specified";
+    private static final String INVALID_ELEMENT_MESSAGE = "$ELEMENT is not valid in the $VERSION version";
+    private static final String ELEMENT_MESSAGE = "\\$ELEMENT";
 
     public ValidationException (String msg) {
-        super (validationFailMessage.replaceAll ("\\$ELEMENT", msg));
+        super (VALIDATION_FAIL_MESSAGE.replaceAll (ELEMENT_MESSAGE, msg));
     }
 
     public ValidationException (String msg, Exception cause) {
-        super (validationFailMessage.replaceAll ("\\$ELEMENT", msg), cause);
+        super (VALIDATION_FAIL_MESSAGE.replaceAll (ELEMENT_MESSAGE, msg), cause);
     }
     public ValidationException(String msg, String version) {
-        super(invalidElementMessage.replaceAll("\\$ELEMENT", msg).replaceAll("\\$VERSION", version));
+        super(INVALID_ELEMENT_MESSAGE.replaceAll(ELEMENT_MESSAGE, msg).replaceAll("\\$VERSION", version));
     }
 }
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/XMLValidator.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/XMLValidator.java
index b498259..ebb1dd2 100644
--- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/XMLValidator.java
+++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/XMLValidator.java
@@ -40,14 +40,14 @@
 
 public class XMLValidator {
 
-    private static String XSDS_PATH;
+    private static String xsdsPath;
 
     static {
         String prefixMsoPropertiesPath = System.getProperty ("mso.config.path");
         if (prefixMsoPropertiesPath == null) {
             prefixMsoPropertiesPath = "";
         }
-        XSDS_PATH = prefixMsoPropertiesPath + "xsds/";
+        xsdsPath = prefixMsoPropertiesPath + "xsds/";
     }
 
     private String stringXsd;
@@ -60,12 +60,12 @@
 
     public XMLValidator (String xsdFile) {
 
-        try (FileInputStream xsdStream = new FileInputStream (XSDS_PATH + xsdFile)) {
+        try (FileInputStream xsdStream = new FileInputStream (xsdsPath + xsdFile)) {
 
             stringXsd = IOUtils.toString (xsdStream);
 
             factory = SchemaFactory.newInstance (XMLConstants.W3C_XML_SCHEMA_NS_URI);
-            factory.setResourceResolver (new PathResourceResolver (XSDS_PATH));
+            factory.setResourceResolver (new PathResourceResolver (xsdsPath));
             factory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, true);
 
             String quotedXsd = stringXsd.replaceAll ("&#34;", "\"");
@@ -73,7 +73,7 @@
             schema = factory.newSchema (src);
 
         } catch (IOException | SAXException e) {
-            msoLogger.debug ("Cannot open file " + XSDS_PATH + xsdFile, e);
+            msoLogger.debug ("Cannot open file " + xsdsPath + xsdFile, e);
             errorMsg = "ErrorDetails: xsd file " + xsdFile + "could not be opened - " + e.getMessage ();
         }
     }
diff --git a/mso-api-handlers/mso-requests-db/pom.xml b/mso-api-handlers/mso-requests-db/pom.xml
index 6a4941e..cdfa0fa 100644
--- a/mso-api-handlers/mso-requests-db/pom.xml
+++ b/mso-api-handlers/mso-requests-db/pom.xml
@@ -55,6 +55,12 @@
 			</exclusions>
 		</dependency>
 		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
 			<groupId>org.hibernate</groupId>
 			<artifactId>hibernate-entitymanager</artifactId>
 			<version>4.3.6.Final</version>
@@ -101,6 +107,12 @@
 			<artifactId>common</artifactId>
 			<version>${project.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>org.jmockit</groupId>
+			<artifactId>jmockit</artifactId>
+			<version>1.19</version>
+			<scope>test</scope>
+		</dependency>
 	</dependencies>
 	<packaging>jar</packaging>
 	<build>
diff --git a/mso-api-handlers/mso-requests-db/src/test/java/org/openecomp/mso/requestsdb/RequestsDatabaseTest.java b/mso-api-handlers/mso-requests-db/src/test/java/org/openecomp/mso/requestsdb/RequestsDatabaseTest.java
new file mode 100644
index 0000000..0bb126f
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/test/java/org/openecomp/mso/requestsdb/RequestsDatabaseTest.java
@@ -0,0 +1,283 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * 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=========================================================
+ */
+package org.openecomp.mso.requestsdb;
+
+
+import mockit.Expectations;
+import mockit.Mocked;
+import mockit.integration.junit4.JMockit;
+import org.hibernate.Criteria;
+import org.hibernate.Query;
+import org.hibernate.SQLQuery;
+import org.hibernate.Session;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openecomp.mso.db.AbstractSessionFactoryManager;
+
+import java.util.Arrays;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(JMockit.class)
+public class RequestsDatabaseTest {
+
+    RequestsDatabase requestsDatabase = RequestsDatabase.getInstance();
+
+    @Test
+    public void getInstanceTest() throws Exception {
+        RequestsDatabase instance = RequestsDatabase.getInstance();
+        assertEquals(RequestsDatabase.class, instance.getClass());
+    }
+
+    @Test
+    public void healthCheckTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                @Mocked Session session,
+                                @Mocked SQLQuery query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createSQLQuery(" show tables "); result = query;
+            query.list(); result = Arrays.asList("table1", "table2");
+        }};
+
+        assertTrue(requestsDatabase.healthCheck());
+    }
+
+    @Test
+    public void updateInfraStatusTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                      @Mocked Session session,
+                                      @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            query.executeUpdate(); result = 1;
+        }};
+        assertEquals(1, requestsDatabase.updateInfraStatus("123", "unknown", "unknown"));
+    }
+
+    @Test
+    public void updateInfraStatus1Test(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                       @Mocked Session session,
+                                       @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            query.executeUpdate(); result = 1;
+        }};
+        assertEquals(1, requestsDatabase.updateInfraStatus("123", "unknown", 0, "unknown"));
+    }
+
+    @Test
+    public void updateInfraFinalStatusTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                           @Mocked Session session,
+                                           @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            query.executeUpdate(); result = 1;
+        }};
+        assertEquals(1, requestsDatabase.updateInfraFinalStatus("123",
+                "unknown",
+                "statusMessage",
+                0,
+                "responsebody",
+                "lastmodifiedby"));
+    }
+
+    @Test
+    public void getRequestFromInfraActiveTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                              @Mocked Session session,
+                                              @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            query.uniqueResult(); result = new InfraActiveRequests("123", "action");
+        }};
+        assertEquals("123",
+                requestsDatabase.getRequestFromInfraActive("123").getRequestId());
+    }
+
+    @Test
+    public void getOrchestrationFiltersFromInfraActiveTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                                           @Mocked Session session,
+                                                           @Mocked Criteria criteria) throws Exception {
+
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createCriteria(InfraActiveRequests.class); result = criteria;
+            criteria.list(); result = Arrays.asList(new InfraActiveRequests("123", "action"));
+        }};
+        assertEquals(1,
+                requestsDatabase.getRequestListFromInfraActive("queryattr",
+                        "queryvalue",
+                        "type").size());
+    }
+
+    @Test
+    public void getRequestListFromInfraActiveTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                                  @Mocked Session session,
+                                                  @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createQuery("from InfraActiveRequests where (requestId = :requestId OR clientRequestId = :requestId) and requestType = :requestType"); result = query;
+            query.uniqueResult(); result = new InfraActiveRequests("123", "action");
+        }};
+        assertEquals("123",
+                requestsDatabase.getRequestFromInfraActive("123", "requestType").getRequestId());
+    }
+
+    @Test
+    public void getRequestFromInfraActive1Test(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                               @Mocked Session session,
+                                               @Mocked Criteria criteria) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createCriteria(InfraActiveRequests.class); result = criteria;
+            criteria.list(); result = Arrays.asList(new InfraActiveRequests());
+        }};
+        assertEquals(1,
+                requestsDatabase.getRequestListFromInfraActive("queryAttr",
+                        "queryvalue",
+                        "type").size());
+    }
+
+    @Test
+    public void checkDuplicateByVnfNameTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                            @Mocked Session session,
+                                            @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createQuery("from InfraActiveRequests where vnfName = :vnfName and action = :action and (requestStatus = 'PENDING' or requestStatus = 'IN_PROGRESS' or requestStatus = 'TIMEOUT') and requestType = :requestType ORDER BY startTime DESC"); result = query;
+            query.list(); result = Arrays.asList(new InfraActiveRequests("123", "action"));
+        }};
+        assertEquals("123",
+                requestsDatabase.checkDuplicateByVnfName("vnfname",
+                        "action",
+                        "requesttype").getRequestId());
+    }
+
+    @Test
+    public void checkDuplicateByVnfIdTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                          @Mocked Session session,
+                                          @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createQuery("from InfraActiveRequests where vnfId = :vnfId and action = :action and (requestStatus = 'PENDING' or requestStatus = 'IN_PROGRESS' or requestStatus = 'TIMEOUT') and requestType = :requestType ORDER BY startTime DESC"); result = query;
+            query.list(); result = Arrays.asList(new InfraActiveRequests("123", "action"));
+        }};
+        assertEquals("123",
+                requestsDatabase.checkDuplicateByVnfId("vnfname",
+                        "action",
+                        "requesttype").getRequestId());
+    }
+
+    @Test
+    public void setMockDBTest() throws Exception {
+        requestsDatabase.setMockDB(null);
+    }
+
+    @Test
+    public void getSiteStatusTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                  @Mocked Session session,
+                                  @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createQuery("FROM SiteStatus WHERE siteName = :site_name"); result = query;
+            query.uniqueResult(); result = new SiteStatus();
+        }};
+        assertEquals(SiteStatus.class,
+                requestsDatabase.getSiteStatus("site").getClass());
+    }
+
+    @Test
+    public void updateSiteStatusTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                     @Mocked Session session,
+                                     @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createQuery("FROM SiteStatus WHERE siteName = :site_name"); result = query;
+            query.uniqueResult(); result = new SiteStatus();
+        }};
+        requestsDatabase.updateSiteStatus("site", true);
+    }
+
+    @Test
+    public void getOperationStatusTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                       @Mocked Session session,
+                                       @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createQuery("FROM OperationStatus WHERE SERVICE_ID = :service_id and OPERATION_ID = :operation_id"); result = query;
+            query.uniqueResult(); result = new OperationStatus();
+        }};
+        assertEquals(OperationStatus.class,
+                requestsDatabase.getOperationStatus("123",
+                        "Unknown").getClass());
+    }
+
+    @Test
+    public void getOperationStatusByServiceIdTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                                  @Mocked Session session,
+                                                  @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createQuery("FROM OperationStatus WHERE SERVICE_ID = :service_id"); result = query;
+            query.uniqueResult(); result = new OperationStatus();
+        }};
+        assertEquals(OperationStatus.class,
+                requestsDatabase.getOperationStatusByServiceId("123").getClass());
+    }
+
+    @Test
+    public void getOperationStatusByServiceNameTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                                    @Mocked Session session,
+                                                    @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createQuery("FROM OperationStatus WHERE SERVICE_NAME = :service_name"); result = query;
+            query.uniqueResult(); result = new OperationStatus();
+        }};
+        assertEquals(OperationStatus.class,
+                requestsDatabase.getOperationStatusByServiceName("servicename").getClass());
+    }
+
+    @Test
+    public void updateOperationStatusTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                          @Mocked Session session,
+                                          @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createQuery("FROM OperationStatus WHERE SERVICE_ID = :service_id and OPERATION_ID = :operation_id"); result = query;
+            query.uniqueResult(); result = new OperationStatus();
+        }};
+        requestsDatabase.updateOperationStatus(new OperationStatus());
+    }
+
+    @Test
+    public void getResourceOperationStatusTest(@Mocked AbstractSessionFactoryManager sessionFactoryManager,
+                                               @Mocked Session session,
+                                               @Mocked Query query) throws Exception {
+        new Expectations() {{
+            sessionFactoryManager.getSessionFactory().openSession(); result = session;
+            session.createQuery("FROM ResourceOperationStatus WHERE serviceId = :service_id and operationId = :operation_id and resourceTemplateUUID= :uuid"); result = query;
+            query.uniqueResult(); result = new ResourceOperationStatus();
+        }};
+        assertEquals(ResourceOperationStatus.class,
+                requestsDatabase.getResourceOperationStatus("serviceId",
+                        "operationid",
+                        "123-uuid").getClass());
+    }
+}