diff --git a/mso-api-handlers/mso-api-handler-infra/pom.xml b/mso-api-handlers/mso-api-handler-infra/pom.xml
index 2b2bec9..1d64927 100644
--- a/mso-api-handlers/mso-api-handler-infra/pom.xml
+++ b/mso-api-handlers/mso-api-handler-infra/pom.xml
@@ -18,6 +18,8 @@
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 		<swagger-version>1.3.0</swagger-version>
 		<jax-rs-version>1.1.1</jax-rs-version>
+		<json4s-jackson-version>3.6.0</json4s-jackson-version>
+		<json4s-core-version>3.6.0</json4s-core-version>
 		<reflections-version>0.9.9-RC1</reflections-version>
 		<paranamer-version>2.5.2</paranamer-version>
 		<scannotation-version>1.0.3</scannotation-version>
@@ -63,27 +65,13 @@
 		</dependency>
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-data-jpa</artifactId>
-			<exclusions>
-				<exclusion>
-					<groupId>org.apache.tomcat</groupId>
-					<artifactId>tomcat-jdbc</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-dbcp2</artifactId>
-		</dependency>
+			<artifactId>spring-boot-starter-data-jpa</artifactId>			
+		</dependency>		
 		<dependency>
 			<groupId>commons-lang</groupId>
 			<artifactId>commons-lang</artifactId>
 			<version>2.6</version>
-		</dependency>
-		<dependency>
-			<groupId>antlr</groupId>
-			<artifactId>antlr</artifactId>
-		</dependency>
+		</dependency>		
 		<dependency>
 			<groupId>javax.activation</groupId>
 			<artifactId>activation</artifactId>
@@ -97,23 +85,21 @@
 		<dependency>
 			<groupId>org.json4s</groupId>
 			<artifactId>json4s-jackson_2.12</artifactId>
+			<version>${json4s-jackson-version}</version>
 		</dependency>
 		<dependency>
 			<groupId>org.json4s</groupId>
 			<artifactId>json4s-core_2.12</artifactId>
+			<version>${json4s-core-version}</version>
 		</dependency>
 		<dependency>
 			<groupId>javax.servlet</groupId>
 			<artifactId>servlet-api</artifactId>
 			<version>2.5</version>
-		</dependency>
+		</dependency>	
 		<dependency>
-			<groupId>org.javassist</groupId>
-			<artifactId>javassist</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.json</groupId>
-			<artifactId>json</artifactId>
+			<groupId>javax.interceptor</groupId>
+			<artifactId>javax.interceptor-api</artifactId>
 		</dependency>
 
 		<!-- Dependencies on other MSO Projects -->
@@ -175,12 +161,7 @@
 			<groupId>com.github.java-json-tools</groupId>
 			<artifactId>json-schema-validator</artifactId>
 			<version>2.2.8</version>
-		</dependency>
-		<dependency>
-			<groupId>janino</groupId>
-			<artifactId>janino</artifactId>
-			<version>2.5.15</version>
-		</dependency>
+		</dependency>		
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>
@@ -219,13 +200,11 @@
 		</dependency>
 		<dependency>
 			<groupId>io.micrometer</groupId>
-			<artifactId>micrometer-spring-legacy</artifactId>
-			<version>1.0.5</version>
+			<artifactId>micrometer-core</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>io.micrometer</groupId>
 			<artifactId>micrometer-registry-prometheus</artifactId>
-			<version>1.0.5</version>
 		</dependency>
 	</dependencies>
 
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/GlobalHealthcheckHandler.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/GlobalHealthcheckHandler.java
index 7a8035a..70603e5 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/GlobalHealthcheckHandler.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/GlobalHealthcheckHandler.java
@@ -20,6 +20,13 @@
 
 package org.onap.so.apihandlerinfra;
 
+
+import java.net.URI;
+import java.util.Collections;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+
+import javax.annotation.PostConstruct;
 import javax.transaction.Transactional;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
@@ -29,42 +36,190 @@
 import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriBuilder;
 
+import java.util.UUID;
 import org.apache.http.HttpStatus;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.logger.MsoLogger;
-import org.onap.so.utils.UUIDChecker;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Component;
-
+import org.springframework.web.client.RestTemplate;
+import org.springframework.http.HttpMethod;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
 
-
 @Component
 @Path("/globalhealthcheck")
 @Api(value="/globalhealthcheck",description="APIH Infra Global Health Check")
 public class GlobalHealthcheckHandler {
+    private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH, GlobalHealthcheckHandler.class);
+    private static final String CONTEXTPATH_PROPERTY = "management.context-path";    
+    private static final String PROPERTY_DOMAIN	 = "mso.health.endpoints";    
+    private static final String CATALOGDB_PROPERTY = PROPERTY_DOMAIN+".catalogdb";
+	private static final String REQUESTDB_PROPERTY = PROPERTY_DOMAIN+".requestdb";
+	private static final String SDNC_PROPERTY = PROPERTY_DOMAIN+".sdnc";
+	private static final String OPENSTACK_PROPERTY = PROPERTY_DOMAIN+".openstack";
+	private static final String BPMN_PROPERTY = PROPERTY_DOMAIN+".bpmn";
+	private static final String ASDC_PROPERTY = PROPERTY_DOMAIN+".asdc";
+	private static final String REQUESTDBATTSVC_PROPERTY = PROPERTY_DOMAIN+".requestdbattsvc";
+	private static final String DEFAULT_PROPERTY_VALUE = "";
+	
+    // e.g. /manage
+    private String actuatorContextPath;
+	private String endpointCatalogdb;
+	private String endpointRequestdb;
+	private String endpointSdnc;
+	private String endpointOpenstack;
+	private String endpointBpmn;
+	private String endpointAsdc;
+	private String endpointRequestdbAttsvc;
+	
+	@Autowired
+	private Environment env;
 
-    private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,GlobalHealthcheckHandler.class);
-    private static final String CHECK_HTML = "<!DOCTYPE html><html><head><meta charset=\"ISO-8859-1\"><title>Health Check</title></head><body>Application ready</body></html>";
+	@Autowired
+	private RestTemplate restTemplate;
+	private final String health = "/health";
 
-	public static final Response HEALTH_CHECK_RESPONSE = Response.status (HttpStatus.SC_OK)
-            .entity (CHECK_HTML)
-            .build ();
+	
+	@PostConstruct
+	protected void init() {
+		actuatorContextPath  = env.getProperty(CONTEXTPATH_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);
+		endpointCatalogdb  = env.getProperty(CATALOGDB_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);
+		endpointRequestdb  = env.getProperty(REQUESTDB_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);
+		endpointSdnc  = env.getProperty(SDNC_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);		
+		endpointOpenstack  = env.getProperty(OPENSTACK_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);		
+		endpointBpmn  = env.getProperty(BPMN_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);		
+		endpointAsdc  = env.getProperty(ASDC_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);		
+		endpointRequestdbAttsvc  = env.getProperty(REQUESTDBATTSVC_PROPERTY, String.class, DEFAULT_PROPERTY_VALUE);		
+	}
 	
     @GET
-    @Produces("text/html")
+    @Produces("application/json")
 	@ApiOperation(value="Performing global health check",response=Response.class)
     @Transactional
     public Response globalHealthcheck (@DefaultValue("true") @QueryParam("enableBpmn") boolean enableBpmn, 
     									@Context ContainerRequestContext requestContext) {
-        long startTime = System.currentTimeMillis ();
-        MsoLogger.setServiceName ("GlobalHealthcheck");
-        // Generated RequestId
-        String requestId = requestContext.getProperty("requestId").toString();
-        MsoLogger.setLogContext(requestId, null);
-        msoLogger.info(MessageEnum.APIH_GENERATED_REQUEST_ID, requestId, "", "");
+    	Response HEALTH_CHECK_RESPONSE = null;
+        // Build internal response object
+        HealthcheckResponse rsp = new HealthcheckResponse();
+    	
+    	try{
+            long startTime = System.currentTimeMillis ();
+            MsoLogger.setServiceName ("GlobalHealthcheck");
+            // Generated RequestId
+            String requestId = requestContext.getProperty("requestId").toString();
+            MsoLogger.setLogContext(requestId, null);
+            msoLogger.info(MessageEnum.APIH_GENERATED_REQUEST_ID, requestId, "", "");
+            
+            // set APIH status, this is the main entry point
+            rsp.setApih(HealthcheckStatus.UP.toString());
+            // set BPMN
+            rsp.setBpmn(querySubsystemHealth(MsoSubsystems.BPMN));
+            // set SDNCAdapter
+            rsp.setSdncAdapter(querySubsystemHealth(MsoSubsystems.SDNC));        
+            // set ASDCController
+            rsp.setAsdcController(querySubsystemHealth(MsoSubsystems.ASDC));        
+            // set CatalogDbAdapter
+            rsp.setCatalogdbAdapter(querySubsystemHealth(MsoSubsystems.CATALOGDB));    
+            // set RequestDbAdapter
+            rsp.setRequestdbAdapter(querySubsystemHealth(MsoSubsystems.REQUESTDB));        
+            // set OpenStackAdapter
+            rsp.setOpenstackAdapter(querySubsystemHealth(MsoSubsystems.OPENSTACK));        
+            // set RequestDbAdapterAttSvc
+            rsp.setRequestdbAdapterAttsvc(querySubsystemHealth(MsoSubsystems.REQUESTDBATT));
+            // set Message
+            rsp.setMessage(String.format("HttpStatus: %s", HttpStatus.SC_OK));
+            msoLogger.info(rsp.toString(), "", "");
+
+            HEALTH_CHECK_RESPONSE = Response.status (HttpStatus.SC_OK)
+                    .entity (rsp)
+                    .build ();
+            
+    	}catch (Exception ex){
+    		msoLogger.error(ex);
+    		rsp.setMessage(ex.getMessage());
+            HEALTH_CHECK_RESPONSE = Response.status (HttpStatus.SC_INTERNAL_SERVER_ERROR)
+                    .entity (rsp)
+                    .build ();
+    	}
+        
         return HEALTH_CHECK_RESPONSE;
-    } 
+    }
+    
+    protected HttpEntity<String> buildHttpEntityForRequest(){
+        HttpHeaders headers = new HttpHeaders();
+        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); 
+        headers.set("Content-Type", "application/json");
+        HttpEntity<String> entity = new HttpEntity<>("parameters", headers);       
+        return entity;
+    }
+    
+    protected String querySubsystemHealth(MsoSubsystems subsystem){
+    	try{
+            // get port number for the subsystem
+    		String ept = getEndpointUrlForSubsystemEnum(subsystem);
+    		
+        	// build final endpoint url
+			UriBuilder builder = UriBuilder.fromPath(ept).path(actuatorContextPath).path(health);
+			URI uri = builder.build();
+        	msoLogger.info("Calculated URL: "+uri.toString(), "", "");        	
+            
+            ResponseEntity<SubsystemHealthcheckResponse> result = 
+            		restTemplate.exchange(uri, HttpMethod.GET, buildHttpEntityForRequest(), SubsystemHealthcheckResponse.class);
+            
+    		return processResponseFromSubsystem(result,subsystem);
+    		
+    	}catch(Exception ex){
+    		msoLogger.error(ex.getMessage());
+    		return HealthcheckStatus.DOWN.toString();
+    	}
+    }
+	protected String processResponseFromSubsystem(ResponseEntity<SubsystemHealthcheckResponse> result, MsoSubsystems subsystem){
+        if(result == null || result.getStatusCodeValue() != HttpStatus.SC_OK){
+        	msoLogger.error(String.format("Globalhealthcheck: checking subsystem: %s failed ! result object is: %s", 
+        			subsystem,
+        			result == null? "NULL": result));
+        	return HealthcheckStatus.DOWN.toString();
+        }
+        
+        SubsystemHealthcheckResponse body = result.getBody();
+
+		String status = body.getStatus();
+		if("UP".equalsIgnoreCase(status)){
+			return HealthcheckStatus.UP.toString();
+		}else{
+			msoLogger.error(subsystem + ", query health endpoint did not return UP status!");
+			return HealthcheckStatus.DOWN.toString();
+		}
+	}
+    
+    
+    protected String getEndpointUrlForSubsystemEnum(MsoSubsystems subsystem){
+    	switch (subsystem){
+    	case SDNC:
+    		return this.endpointSdnc;
+    	case ASDC:
+    		return this.endpointAsdc;
+    	case BPMN:
+    		return this.endpointBpmn;
+    	case CATALOGDB:
+    		return this.endpointCatalogdb;
+    	case OPENSTACK:
+    		return this.endpointOpenstack;
+    	case REQUESTDB:
+    		return this.endpointRequestdb;
+    	case REQUESTDBATT:
+    		return this.endpointRequestdbAttsvc;
+    	default:
+    		return "";
+    	}     	
+    }
 }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/HealthcheckResponse.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/HealthcheckResponse.java
new file mode 100644
index 0000000..8f0bbc4
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/HealthcheckResponse.java
@@ -0,0 +1,121 @@
+/*-
+ * ============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.onap.so.apihandlerinfra;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+public class HealthcheckResponse {
+	private String apih;
+	private String bpmn;
+	private String sdncAdapter;
+	private String asdcController;
+	private String catalogdbAdapter;
+	private String requestdbAdapter;
+	private String openstackAdapter;
+	private String requestdbAdapterAttsvc;
+	private String message = "";
+
+	public String getApih() {
+		return apih;
+	}
+
+	public void setApih(String apih) {
+		this.apih = apih;
+	}
+
+	public String getBpmn() {
+		return bpmn;
+	}
+
+	public void setBpmn(String bpmn) {
+		this.bpmn = bpmn;
+	}
+
+	public String getSdncAdapter() {
+		return sdncAdapter;
+	}
+
+	public void setSdncAdapter(String sdncAdapter) {
+		this.sdncAdapter = sdncAdapter;
+	}
+
+	public String getAsdcController() {
+		return asdcController;
+	}
+
+	public void setAsdcController(String asdcController) {
+		this.asdcController = asdcController;
+	}
+
+	public String getCatalogdbAdapter() {
+		return catalogdbAdapter;
+	}
+
+	public void setCatalogdbAdapter(String catalogdbAdapter) {
+		this.catalogdbAdapter = catalogdbAdapter;
+	}
+
+	public String getRequestdbAdapter() {
+		return requestdbAdapter;
+	}
+
+	public void setRequestdbAdapter(String requestdbAdapter) {
+		this.requestdbAdapter = requestdbAdapter;
+	}
+
+	public String getOpenstackAdapter() {
+		return openstackAdapter;
+	}
+
+	public void setOpenstackAdapter(String openstackAdapter) {
+		this.openstackAdapter = openstackAdapter;
+	}
+
+	public String getRequestdbAdapterAttsvc() {
+		return requestdbAdapterAttsvc;
+	}
+
+	public void setRequestdbAdapterAttsvc(String requestdbAdapterAttsvc) {
+		this.requestdbAdapterAttsvc = requestdbAdapterAttsvc;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+	
+	@Override
+	public String toString() {
+     return new ToStringBuilder(this).
+    	       append("apih", this.apih).
+    	       append("pbmn", this.bpmn).
+    	       append("sdncAdapter", this.sdncAdapter).
+    	       append("asdcController", this.asdcController).
+    	       append("catalogdbAdapter", this.catalogdbAdapter).
+    	       append("requestdbAdapter", this.requestdbAdapter).
+    	       append("openstackAdapter", this.openstackAdapter).
+    	       append("requestdbAdapterAttsvc", this.requestdbAdapterAttsvc).
+    	       append("message", this.message).
+    	       toString();		
+	}
+}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/HealthcheckStatus.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/HealthcheckStatus.java
new file mode 100644
index 0000000..89c4e0e
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/HealthcheckStatus.java
@@ -0,0 +1,34 @@
+/*-
+ * ============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.onap.so.apihandlerinfra;
+
+public enum HealthcheckStatus {
+    UP("UP"), DOWN("DOWN"); 
+	
+    private String status; 
+    private HealthcheckStatus(String status) { 
+        this.status = status; 
+    } 
+    
+    @Override 
+    public String toString(){ 
+        return status; 
+    } 
+}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoSubsystems.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoSubsystems.java
new file mode 100644
index 0000000..cfdce47
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoSubsystems.java
@@ -0,0 +1,42 @@
+/*-
+ * ============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.onap.so.apihandlerinfra;
+
+public enum MsoSubsystems {
+	APIH ("API Handler"), 
+	ASDC ("ASDC Controller"), 
+	BPMN ("BPMN Infra"), 
+	CATALOGDB ("CatalogDb Adapter"), 
+	OPENSTACK ("Openstack Adapter"), 
+	REQUESTDB ("RequestDB Adapter"), 
+	REQUESTDBATT ("RequestDB Adapter ATT Svc"), 
+	SDNC ("SDNC Adapter");
+	private String subsystem;
+	private MsoSubsystems(String subsystem){
+		this.subsystem = subsystem;
+	}
+	
+    @Override 
+    public String toString(){ 
+        return subsystem; 
+    } 	
+	
+}
+
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java
index 8047893..e2b1234 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java
@@ -111,7 +111,7 @@
 	private static String NAME = "name";
 	private static String VALUE = "value";
 	private static final String SAVE_TO_DB = "save instance to db";
-
+	
 	@Autowired
 	private Environment env;
 	
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/SubsystemHealthcheckResponse.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/SubsystemHealthcheckResponse.java
new file mode 100644
index 0000000..625df66
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/SubsystemHealthcheckResponse.java
@@ -0,0 +1,36 @@
+/*-
+ * ============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.onap.so.apihandlerinfra;
+
+import java.io.Serializable;
+
+public class SubsystemHealthcheckResponse implements Serializable {
+	private static final long serialVersionUID = 1L;
+	private String status;
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/configuration/CatalogDBConfig.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/configuration/CatalogDBConfig.java
index f7d7190..3aa54bd 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/configuration/CatalogDBConfig.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/configuration/CatalogDBConfig.java
@@ -25,7 +25,7 @@
 import javax.sql.DataSource;
 
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
+import org.springframework.boot.jdbc.DataSourceBuilder;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
 import org.springframework.context.annotation.Bean;
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/configuration/RequestDBConfig.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/configuration/RequestDBConfig.java
index 2298ccd..908b864 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/configuration/RequestDBConfig.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/configuration/RequestDBConfig.java
@@ -25,7 +25,7 @@
 import javax.sql.DataSource;
 
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
+import org.springframework.boot.jdbc.DataSourceBuilder;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
 import org.springframework.context.annotation.Bean;
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/resources/application-local.yaml b/mso-api-handlers/mso-api-handler-infra/src/main/resources/application-local.yaml
index acc0406..cabee8e 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/resources/application-local.yaml
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/resources/application-local.yaml
@@ -17,6 +17,16 @@
 
 
 mso:
+  health:
+    endpoints:
+      catalogdb: http://localhost:8800
+      sdnc: http://localhost:8400
+      openstack: http://localhost:8300
+      requestdb: http://localhost:8700
+      bpmn: http://localhost:8200
+      asdc: http://localhost:8400
+      requestdbattsvc: http://localhost:8600
+      
   adapters:
     requestDb:
       auth: Basic YnBlbDptc28tZGItMTUwNyE=
@@ -45,16 +55,16 @@
     homing:
       sdna:
         url: http://localhost:8089/
-        password: 4112B789E942B161228F7D5AFC654C0F  
+        password: 4E0BDC08EE8EDC0572ABBE9FD2D59B62DB725A00B8469E39393D6C86D64284C5D34A57D56F7B58C375316F
   camundaURL: http://localhost:8089/
-  camundaAuth: F8E9452B55DDE4CCE77547B0E748105C54CF5EF1351B4E2CBAABF2981EFE776D
+  camundaAuth: E8E19DD16CC90D2E458E8FF9A884CC0452F8F3EB8E321F96038DE38D5C1B0B02DFAE00B88E2CF6E2A4101AB2C011FC161212EE
   async:
     core-pool-size: 50
     max-pool-size: 50
     queue-capacity: 500
   sdc:
     client:
-      auth: F3473596C526938329DF877495B494DC374D1C4198ED3AD305EA3ADCBBDA1862
+      auth: 97FF88AB352DA16E00DDD81E3876431DEF8744465DACA489EB3B3BE1F10F63EDA1715E626D0A4827A3E19CD88421BF
     activate:
       instanceid: test
       userid: cs0008
@@ -66,7 +76,7 @@
         count: 3
   aai:
     endpoint: http://localhost:28090
-    auth: 26AFB797A6A57960D5D718491925C50F77CDC22AC394B3DBA09950D8FD1C0764
+    auth: 5E12ACACBD552A415E081E29F2C4772F9835792A51C766CCFDD7433DB5220B59969CB2798C
   grm:
     endpoint: http://localhost:28090
     username: gmruser
@@ -108,7 +118,7 @@
 # H2
 spring:
   datasource:
-    url: jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
+    jdbc-url: jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
     username: sa
     password: sa
     driver-class-name: org.h2.Driver
@@ -151,7 +161,7 @@
       role: ACTUATOR      
 request:
   datasource:
-    url: jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
+    jdbc-url: jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
     username: sa
     password: sa
     driver-class-name: org.h2.Driver
@@ -159,4 +169,11 @@
 
 #Actuator
 management: 
-  context-path: /manage
\ No newline at end of file
+  context-path: /manage
+
+org:
+  onap:
+    so:
+      adapters:
+        network:
+          encryptionKey: aa3871669d893c7fb8abbcda31b88b4f
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml b/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml
index 52bf3ff..9387d08 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/resources/application.yaml
@@ -27,7 +27,7 @@
                 
 spring:
   datasource:
-    url: jdbc:mariadb://${DB_HOST}:${DB_PORT}/catalogdb
+    jdbc-url: jdbc:mariadb://${DB_HOST}:${DB_PORT}/catalogdb
     username: ${DB_USERNAME}
     password: ${DB_PASSWORD}
     driver-class-name: org.mariadb.jdbc.Driver
@@ -49,7 +49,7 @@
                        
 request:
   datasource:
-    url: jdbc:mariadb://${DB_HOST}:${DB_PORT}/requestdb
+    jdbc-url: jdbc:mariadb://${DB_HOST}:${DB_PORT}/requestdb
     username: ${DB_USERNAME}
     password: ${DB_PASSWORD}
     driver-class-name: org.mariadb.jdbc.Driver  
@@ -60,11 +60,24 @@
       test-on-borrow: true
 
 #Actuator
-management: 
-  context-path: /manage
+management:
+  endpoints:
+    web:
+      base-path: /manage
+  server:
+    servlet:
+      context-path: /manage
   metrics:
     se-global-registry: false
     export:
       prometheus:
         enabled: true # Whether exporting of metrics to Prometheus is enabled.
         step: 1m # Step size (i.e. reporting frequency) to use.  
+ 
+
+org:
+  onap:
+    so:
+      adapters:
+        network:
+          encryptionKey: aa3871669d893c7fb8abbcda31b88b4f
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/BaseTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/BaseTest.java
index 4072613..508277f 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/BaseTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/BaseTest.java
@@ -31,7 +31,7 @@
 import org.onap.so.logger.MsoLogger;
 import org.onap.so.logger.MsoLogger.Catalog;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.embedded.LocalServerPort;
+import org.springframework.boot.web.server.LocalServerPort;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.web.client.TestRestTemplate;
 import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock;
@@ -53,7 +53,6 @@
 @ActiveProfiles("test")
 @ContextConfiguration
 @Transactional
-//@Sql(executionPhase=ExecutionPhase.AFTER_TEST_METHOD,scripts="classpath:InfraActiveRequestsReset.sql")
 @AutoConfigureWireMock(port = 0)
 public abstract class BaseTest {
 	protected MsoLogger logger = MsoLogger.getMsoLogger(Catalog.GENERAL, BaseTest.class);
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/E2EServiceInstancesTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/E2EServiceInstancesTest.java
index a3d388a..8d5539c 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/E2EServiceInstancesTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/E2EServiceInstancesTest.java
@@ -271,4 +271,4 @@
 		RequestError realResponse = mapper.readValue(response.getBody(), RequestError.class);
 		assertTrue(realResponse.getServiceException().getText().contains("Request Failed due to BPEL error with HTTP Status"));
 	}
-}
+}
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/EmbeddedCatalogDbConfig.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/EmbeddedCatalogDbConfig.java
index f504d88..1e4b99d 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/EmbeddedCatalogDbConfig.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/EmbeddedCatalogDbConfig.java
@@ -25,7 +25,7 @@
 
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
+import org.springframework.boot.jdbc.DataSourceBuilder;
 import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/EmbeddedRequestDbConfig.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/EmbeddedRequestDbConfig.java
index d150fd7..00efb6b 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/EmbeddedRequestDbConfig.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/EmbeddedRequestDbConfig.java
@@ -25,7 +25,7 @@
 
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
+import org.springframework.boot.jdbc.DataSourceBuilder;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
 import org.springframework.context.annotation.Bean;
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/GlobalHealthcheckHandlerTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/GlobalHealthcheckHandlerTest.java
new file mode 100644
index 0000000..f7e605b
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/GlobalHealthcheckHandlerTest.java
@@ -0,0 +1,236 @@
+/*-
+ * ============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.onap.so.apihandlerinfra;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.anyString;
+import java.net.URI;
+import java.util.Collections;
+import java.util.List;
+
+import org.springframework.test.util.ReflectionTestUtils;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriBuilder;
+
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.json.JSONException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+
+public class GlobalHealthcheckHandlerTest {
+    @Mock
+    RestTemplate restTemplate;
+
+    @Mock
+    ContainerRequestContext requestContext;
+    
+    @InjectMocks
+    @Spy
+	GlobalHealthcheckHandler globalhealth;
+	
+    @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); 
+    
+    @Test
+    public void testQuerySubsystemHealthNullResult(){
+    	ReflectionTestUtils.setField(globalhealth, "actuatorContextPath", "/manage");
+    	ReflectionTestUtils.setField(globalhealth, "endpointBpmn", "http://localhost:8080");
+    	
+		Mockito.when(restTemplate.exchange(Matchers.any(URI.class), 
+				Matchers.any(HttpMethod.class), 
+				Matchers.<HttpEntity<?>> any(), 
+				Matchers.<Class<Object>> any())).thenReturn(null);
+		
+		String result = globalhealth.querySubsystemHealth(MsoSubsystems.BPMN);
+		System.out.println(result);
+		assertEquals(HealthcheckStatus.DOWN.toString(),result);		
+    }
+    
+    @Test
+    public void testQuerySubsystemHealthNotNullResult(){
+    	ReflectionTestUtils.setField(globalhealth, "actuatorContextPath", "/manage");
+    	ReflectionTestUtils.setField(globalhealth, "endpointAsdc", "http://localhost:8080");
+    	
+		SubsystemHealthcheckResponse subSystemResponse = new SubsystemHealthcheckResponse();
+		subSystemResponse.setStatus("UP");
+		ResponseEntity<Object> r = new ResponseEntity<>(subSystemResponse,HttpStatus.OK);
+		
+		Mockito.when(restTemplate.exchange(Matchers.any(URI.class), 
+				Matchers.any(HttpMethod.class), 
+				Matchers.<HttpEntity<?>> any(), 
+				Matchers.<Class<Object>> any())).thenReturn(r);
+		
+		String result = globalhealth.querySubsystemHealth(MsoSubsystems.ASDC);
+		System.out.println(result);
+		assertEquals(HealthcheckStatus.UP.toString(),result);	    	
+    }
+    
+    private Response globalHealthcheck (String status){
+    	ReflectionTestUtils.setField(globalhealth, "actuatorContextPath", "/manage");
+    	ReflectionTestUtils.setField(globalhealth, "endpointAsdc", "http://localhost:8080");
+    	ReflectionTestUtils.setField(globalhealth, "endpointSdnc", "http://localhost:8081");
+    	ReflectionTestUtils.setField(globalhealth, "endpointBpmn", "http://localhost:8082");
+    	ReflectionTestUtils.setField(globalhealth, "endpointCatalogdb", "http://localhost:8083");
+    	ReflectionTestUtils.setField(globalhealth, "endpointOpenstack", "http://localhost:8084");
+    	ReflectionTestUtils.setField(globalhealth, "endpointRequestdb", "http://localhost:8085");
+    	ReflectionTestUtils.setField(globalhealth, "endpointRequestdbAttsvc", "http://localhost:8086");
+
+		SubsystemHealthcheckResponse subSystemResponse = new SubsystemHealthcheckResponse();
+
+		subSystemResponse.setStatus(status);
+		ResponseEntity<Object> r = new ResponseEntity<>(subSystemResponse,HttpStatus.OK);		
+		Mockito.when(restTemplate.exchange(Matchers.any(URI.class), 
+				Matchers.any(HttpMethod.class), 
+				Matchers.<HttpEntity<?>> any(), 
+				Matchers.<Class<Object>> any())).thenReturn(r);
+		
+		Mockito.when(requestContext.getProperty(anyString())).thenReturn("1234567890");
+		Response response = globalhealth.globalHealthcheck(true, requestContext);
+		
+		return response;
+    }
+    
+	@Test
+	public void globalHealthcheckAllUPTest() throws JSONException {
+		Response response = globalHealthcheck("UP");
+		assertEquals(Response.Status.OK.getStatusCode(),response.getStatus());
+		HealthcheckResponse root;
+		root = (HealthcheckResponse) response.getEntity();		
+		String apistatus = root.getApih();
+		assertTrue(apistatus.equalsIgnoreCase(HealthcheckStatus.UP.toString()));
+		
+		String bpmnstatus = root.getBpmn();
+		assertTrue(bpmnstatus.equalsIgnoreCase(HealthcheckStatus.UP.toString()));
+		
+		String sdncstatus = root.getSdncAdapter();
+		assertTrue(sdncstatus.equalsIgnoreCase(HealthcheckStatus.UP.toString()));
+		
+		String asdcstatus = root.getAsdcController();
+		assertTrue(asdcstatus.equalsIgnoreCase(HealthcheckStatus.UP.toString()));
+		
+		String catastatus = root.getCatalogdbAdapter();
+		assertTrue(catastatus.equalsIgnoreCase(HealthcheckStatus.UP.toString()));			
+		
+		String reqdbstatus = root.getRequestdbAdapter();
+		assertTrue(reqdbstatus.equalsIgnoreCase(HealthcheckStatus.UP.toString()));			
+		
+		String openstatus = root.getOpenstackAdapter();
+		assertTrue(openstatus.equalsIgnoreCase(HealthcheckStatus.UP.toString()));			
+
+		String reqdbattstatus = root.getRequestdbAdapterAttsvc();
+		assertTrue(reqdbattstatus.equalsIgnoreCase(HealthcheckStatus.UP.toString()));			
+	}
+	
+	@Test
+	public void globalHealthcheckAllDOWNTest() throws JSONException {
+		Response response = globalHealthcheck("DOWN");
+		assertEquals(Response.Status.OK.getStatusCode(),response.getStatus());
+		HealthcheckResponse root;
+		root = (HealthcheckResponse) response.getEntity();		
+		String apistatus = root.getApih();
+		assertTrue(apistatus.equalsIgnoreCase(HealthcheckStatus.UP.toString()));
+		
+		String bpmnstatus = root.getBpmn();
+		assertTrue(bpmnstatus.equalsIgnoreCase(HealthcheckStatus.DOWN.toString()));
+		
+		String sdncstatus = root.getSdncAdapter();
+		assertTrue(sdncstatus.equalsIgnoreCase(HealthcheckStatus.DOWN.toString()));
+		
+		String asdcstatus = root.getAsdcController();
+		assertTrue(asdcstatus.equalsIgnoreCase(HealthcheckStatus.DOWN.toString()));
+		
+		String catastatus = root.getCatalogdbAdapter();
+		assertTrue(catastatus.equalsIgnoreCase(HealthcheckStatus.DOWN.toString()));			
+		
+		String reqdbstatus = root.getRequestdbAdapter();
+		assertTrue(reqdbstatus.equalsIgnoreCase(HealthcheckStatus.DOWN.toString()));			
+		
+		String openstatus = root.getOpenstackAdapter();
+		assertTrue(openstatus.equalsIgnoreCase(HealthcheckStatus.DOWN.toString()));			
+
+		String reqdbattstatus = root.getRequestdbAdapterAttsvc();
+		assertTrue(reqdbattstatus.equalsIgnoreCase(HealthcheckStatus.DOWN.toString()));			
+	}
+
+	@Test
+	public void buildHttpEntityForRequestTest(){
+		HttpEntity<String> he = globalhealth.buildHttpEntityForRequest();
+		assertEquals (MediaType.APPLICATION_JSON,he.getHeaders().getAccept().get(0));
+		assertEquals (MediaType.APPLICATION_JSON,he.getHeaders().getContentType());
+	}
+	
+	@Test
+	public void getEndpointUrlForSubsystemEnumTest(){
+    	ReflectionTestUtils.setField(globalhealth, "actuatorContextPath", "/manage");
+    	ReflectionTestUtils.setField(globalhealth, "endpointAsdc", "http://localhost:8080");
+    	ReflectionTestUtils.setField(globalhealth, "endpointSdnc", "http://localhost:8081");
+    	ReflectionTestUtils.setField(globalhealth, "endpointBpmn", "http://localhost:8082");
+    	ReflectionTestUtils.setField(globalhealth, "endpointCatalogdb", "http://localhost:8083");
+    	ReflectionTestUtils.setField(globalhealth, "endpointOpenstack", "http://localhost:8084");
+    	ReflectionTestUtils.setField(globalhealth, "endpointRequestdb", "http://localhost:8085");
+    	ReflectionTestUtils.setField(globalhealth, "endpointRequestdbAttsvc", "http://localhost:8086");
+    	
+		String result = globalhealth.getEndpointUrlForSubsystemEnum(MsoSubsystems.ASDC);
+		assertEquals("http://localhost:8080", result);
+		result = globalhealth.getEndpointUrlForSubsystemEnum(MsoSubsystems.SDNC);
+		assertEquals("http://localhost:8081", result);
+		result = globalhealth.getEndpointUrlForSubsystemEnum(MsoSubsystems.BPMN);
+		assertEquals("http://localhost:8082", result);
+		result = globalhealth.getEndpointUrlForSubsystemEnum(MsoSubsystems.CATALOGDB);
+		assertEquals("http://localhost:8083", result);
+		result = globalhealth.getEndpointUrlForSubsystemEnum(MsoSubsystems.OPENSTACK);
+		assertEquals("http://localhost:8084", result);
+		result = globalhealth.getEndpointUrlForSubsystemEnum(MsoSubsystems.REQUESTDB);
+		assertEquals("http://localhost:8085", result);
+		result = globalhealth.getEndpointUrlForSubsystemEnum(MsoSubsystems.REQUESTDBATT);
+		assertEquals("http://localhost:8086", result);
+	}
+	
+	@Test
+	public void processResponseFromSubsystemTest(){
+		SubsystemHealthcheckResponse subSystemResponse = new SubsystemHealthcheckResponse();
+		subSystemResponse.setStatus("UP");
+		ResponseEntity<SubsystemHealthcheckResponse> r = new ResponseEntity<>(subSystemResponse,HttpStatus.OK);
+		String result = globalhealth.processResponseFromSubsystem(r,MsoSubsystems.BPMN);
+		assertEquals("UP",result);
+	}
+	
+}
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/HealthCheckHandlerTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/HealthCheckHandlerTest.java
deleted file mode 100644
index 8b4d353..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/HealthCheckHandlerTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*-
- * ============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.onap.so.apihandlerinfra;
-
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
-import javax.ws.rs.core.Response;
-
-import org.json.JSONException;
-import org.junit.Test;
-import org.springframework.boot.test.web.client.TestRestTemplate;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.ResponseEntity;
-
-
-public class HealthCheckHandlerTest extends BaseTest{
-		
-	@Test
-	public void testHealthcheckGet() throws JSONException {
-		HttpHeaders headers = new HttpHeaders();
-		HttpEntity<String> entity = new HttpEntity<String>(null, headers);
-
-		ResponseEntity<String> response = restTemplate.exchange(
-				createURLWithPort("/manage/health"),
-				HttpMethod.GET, entity, String.class);
-		
-		assertEquals(Response.Status.OK.getStatusCode(),response.getStatusCode().value());
-		assertThat(response.getBody(), containsString("UP"));
-	
-	}
-
-
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ManualTasksTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ManualTasksTest.java
index f4fede1..bb78c82 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ManualTasksTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ManualTasksTest.java
@@ -27,7 +27,8 @@
 import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
+
+import static com.shazam.shazamcrest.MatcherAssert.assertThat;
 
 import java.io.IOException;
 import java.util.Map;
@@ -44,6 +45,8 @@
 import org.onap.so.apihandlerinfra.tasksbeans.TasksRequest;
 import org.onap.so.apihandlerinfra.tasksbeans.ValidResponses;
 import org.onap.so.logger.MsoLogger;
+import org.onap.so.serviceinstancebeans.RequestError;
+import org.onap.so.serviceinstancebeans.ServiceException;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
@@ -52,6 +55,7 @@
 
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.tomakehurst.wiremock.http.Fault;
 
 import ch.qos.logback.classic.spi.ILoggingEvent;
 
@@ -134,4 +138,111 @@
                 assertEquals("1.0.0", response.getHeaders().get("X-LatestVersion").get(0));
             }
     }
+    @Test
+    public void completeTaskMappingError() throws IOException {
+        String invalidRequest = "test";
+        RequestError expectedResponse = new RequestError();
+        ServiceException se = new ServiceException();
+        se.setMessageId("SVC0002");
+        se.setText("Mapping of request to JSON object failed: Unrecognized token \'test\': "
+        		+ "was expecting \'null\', \'true\', \'false\' or NaN\n at [Source: (String)\"test\"; line: 1, column: 9]");
+        expectedResponse.setServiceException(se);
+	
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Accept", MediaType.APPLICATION_JSON);
+        headers.set("Content-Type", MediaType.APPLICATION_JSON);
+        headers.set(MsoLogger.ECOMP_REQUEST_ID, "987654321");
+        headers.set(MsoLogger.CLIENT_ID, "VID");
+        HttpEntity<String> entity = new HttpEntity<String>(invalidRequest, headers);
+
+        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(createURLWithPort(basePath) + "55" + "/complete");	       
+        ResponseEntity<String> response = restTemplate.exchange(
+                builder.toUriString(),
+                HttpMethod.POST, entity, String.class);
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        
+        RequestError realResponse = mapper.readValue(response.getBody(), RequestError.class);
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatusCode().value());	
+        assertThat(realResponse, sameBeanAs(expectedResponse));
+    }
+    @Test
+    public void completeTaskValidationError() throws IOException {
+        String taskId = "55";
+        TasksRequest taskReq = new TasksRequest();
+        RequestDetails reqDetail = new RequestDetails();
+        RequestInfo reqInfo = new RequestInfo();
+        reqInfo.setSource("testSource");	
+        reqInfo.setResponseValue(ValidResponses.skip);
+        reqDetail.setRequestInfo(reqInfo);
+        taskReq.setRequestDetails(reqDetail);
+
+        RequestError expectedResponse = new RequestError();
+        ServiceException se = new ServiceException();
+        se.setMessageId("SVC0002");
+        se.setText("Mapping of request to JSON Object failed. No valid requestorId is specified");
+        expectedResponse.setServiceException(se);
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Accept", MediaType.APPLICATION_JSON);
+        headers.set("Content-Type", MediaType.APPLICATION_JSON);
+        headers.set(MsoLogger.ECOMP_REQUEST_ID, "987654321");
+        headers.set(MsoLogger.CLIENT_ID, "VID");
+        HttpEntity<TasksRequest> entity = new HttpEntity<TasksRequest>(taskReq, headers);
+
+        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(createURLWithPort(basePath) + taskId + "/complete");	       
+        ResponseEntity<String> response = restTemplate.exchange(
+                builder.toUriString(),
+                HttpMethod.POST, entity, String.class);
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+        RequestError realResponse = mapper.readValue(response.getBody(), RequestError.class);
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatusCode().value());	
+        assertThat(realResponse, sameBeanAs(expectedResponse));
+    }
+    @Test
+    public void completeTaskBpelResponseError() throws IOException {
+        stubFor(post(urlPathEqualTo("/sobpmnengine/task/55/complete"))
+                .willReturn(aResponse().withHeader("Content-Type", "application/json").withFault(Fault.EMPTY_RESPONSE)));
+
+        String taskId = "55";
+        TasksRequest taskReq = new TasksRequest();
+        RequestDetails reqDetail = new RequestDetails();
+        RequestInfo reqInfo = new RequestInfo();
+        reqInfo.setRequestorId("testId");
+        reqInfo.setSource("testSource");	
+        reqInfo.setResponseValue(ValidResponses.skip);
+        reqDetail.setRequestInfo(reqInfo);
+        taskReq.setRequestDetails(reqDetail);
+
+        RequestError expectedResponse = new RequestError();
+        ServiceException se = new ServiceException();
+        se.setMessageId("SVC1000");
+        se.setText("Request Failed due to BPEL error with HTTP Status = 502");
+        expectedResponse.setServiceException(se);
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Accept", MediaType.APPLICATION_JSON);
+        headers.set("Content-Type", MediaType.APPLICATION_JSON);
+        headers.set(MsoLogger.ECOMP_REQUEST_ID, "987654321");
+        headers.set(MsoLogger.CLIENT_ID, "VID");
+        HttpEntity<TasksRequest> entity = new HttpEntity<TasksRequest>(taskReq, headers);
+
+        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(createURLWithPort(basePath) + taskId + "/complete");	       
+        ResponseEntity<String> response = restTemplate.exchange(
+                builder.toUriString(),
+                HttpMethod.POST, entity, String.class);
+
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+        RequestError realResponse = mapper.readValue(response.getBody(), RequestError.class);
+        assertEquals(Response.Status.BAD_GATEWAY.getStatusCode(), response.getStatusCode().value());	
+        assertThat(realResponse, sameBeanAs(expectedResponse));
+    }
 }
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java
index ea2261a..58d6b7f 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/OrchestrationRequestsTest.java
@@ -439,4 +439,4 @@
                 .withBody(new String(Files.readAllBytes(Paths.get("src/test/resources/OrchestrationRequest/getRequestDetailsFilter.json"))))
                 .withStatus(HttpStatus.SC_OK)));
     }
-}
+}
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/TasksHandlerTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/TasksHandlerTest.java
index fa323a1..c7b4cc0 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/TasksHandlerTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/TasksHandlerTest.java
@@ -120,4 +120,4 @@
         assertEquals("1.0.0", response.getHeaders().get("X-LatestVersion").get(0));
 	}
 
-}
+}
\ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/RequestDetailsTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/RequestDetailsTest.java
deleted file mode 100644
index 80cd0fa..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/RequestDetailsTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.onap.so.apihandlerinfra.tasksbeans;
-
-import org.junit.After;
-import static org.junit.Assert.assertTrue;
-import org.junit.Before;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-
-public class RequestDetailsTest {
-
-	RequestDetails _requestDetails;
-	RequestInfo _requestInfo;
-
-	public RequestDetailsTest() {
-	}
-
-	@Before
-	public void setUp() {
-		_requestDetails = mock(RequestDetails.class);
-		_requestInfo = new RequestInfo();
-		when(_requestDetails.getRequestInfo()).thenReturn(_requestInfo);
-	}
-
-	@After
-	public void tearDown() {
-		_requestDetails = null;
-		_requestInfo = null;
-	}
-
-	/**
-	 * Test of getRequestInfo method
-	 */
-	@Test
-	public void testGetRequestInfo() {
-		_requestDetails.setRequestInfo(_requestInfo);
-		assertTrue(_requestDetails.getRequestInfo().equals(_requestInfo));
-
-	}
-
-	/**
-	 * Test setRequestInfo
-	 */
-	@Test
-	public void testSetRequestInfo() {
-		_requestDetails.setRequestInfo(_requestInfo);
-		verify(_requestDetails).setRequestInfo(_requestInfo);
-	}
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/RequestInfoTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/RequestInfoTest.java
deleted file mode 100644
index 852376e..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/RequestInfoTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.onap.so.apihandlerinfra.tasksbeans;
-
-import org.junit.After;
-
-import static org.junit.Assert.assertEquals;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-public class RequestInfoTest {
-
-	RequestInfo _requestInfo;
-	String _source;
-	ValidResponses _responseValue;
-	String _requestorId;
-
-	public RequestInfoTest() {
-	}
-
-	@Before
-	public void setUp() {
-		_requestInfo = mock(RequestInfo.class);
-		_responseValue = ValidResponses.abort;
-		_requestorId = "xxxxxx";
-		_source = "VID";
-		when(_requestInfo.getRequestorId()).thenReturn(_requestorId);
-		when(_requestInfo.getSource()).thenReturn(_source);
-		when(_requestInfo.getResponseValue()).thenReturn(_responseValue);
-
-	}
-
-	@After
-	public void tearDown() {
-		_requestInfo = null;
-		_responseValue = null;
-	}
-
-	/**
-	 * Test of getSource method
-	 */
-	@Test
-	public void testGetSource() {
-	        String result = _requestInfo.getSource();
-	        assertEquals(_source, result);
-
-	}
-
-	/**
-	 * Test setSource
-	 */
-	@Test
-	public void testSetSource() {
-		_requestInfo.setSource("VID");
-		verify(_requestInfo).setSource(_source);
-	}
-	
-	/**
-	 * Test of getRequestorId method
-	 */
-	@Test
-	public void testGetRequestorId() {
-	        String result = _requestInfo.getRequestorId();
-	        assertEquals(_requestorId, result);
-
-	}
-
-	/**
-	 * Test setRequestInfo
-	 */
-	@Test
-	public void testSetRequestorId() {
-		_requestInfo.setRequestorId(_requestorId);
-		verify(_requestInfo).setRequestorId(_requestorId);
-	}
-	
-
-	/**
-	 * Test of getResponseValue method
-	 */
-	@Test
-	public void testGetResponseValue() {
-		ValidResponses result = _requestInfo.getResponseValue();
-	        assertEquals(_responseValue, result);
-
-	}
-
-	/**
-	 * Test setResponseValues method
-	 */
-	@Test
-	public void testSetResponseValue() {
-		_requestInfo.setResponseValue(ValidResponses.abort);
-		verify(_requestInfo).setResponseValue(_responseValue);
-	}
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskListTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskListTest.java
deleted file mode 100644
index 62bfee9..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskListTest.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.onap.so.apihandlerinfra.tasksbeans;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class TaskListTest {
-
-	TaskList _taskList;
-	protected String _taskId;
-	protected String _type;
-	protected String _nfRole;
-	protected String _subscriptionServiceType;
-	protected String _originalRequestId;
-	protected String _originalRequestorId;
-	protected String _errorSource;
-	protected String _errorCode;
-	protected String _errorMessage;
-	protected String _buildingBlockName;
-	protected String _buildingBlockStep;
-	protected List<String> _validResponses;
-
-	public TaskListTest() {
-	}
-
-	@Before
-	public void setUp() {
-		_taskList = mock(TaskList.class);
-		_taskId = "_taskid";
-		_type = "type";
-		_nfRole = "nfrole";
-		_subscriptionServiceType = "subscriptionservicetype";
-		_originalRequestId = "originalrequestid";
-		_originalRequestorId = "originalrequestorid";
-		_errorSource = "errorsource";
-		_errorCode = "errorcode";
-		_errorMessage = "errormessage";
-		_buildingBlockName = "buildingblockname";
-		_buildingBlockStep = "buildingblockstep";
-		_validResponses = mock(List.class);
-
-		when(_taskList.getTaskId()).thenReturn(_taskId);
-		when(_taskList.getType()).thenReturn(_type);
-		when(_taskList.getNfRole()).thenReturn(_nfRole);
-		when(_taskList.getSubscriptionServiceType()).thenReturn(_subscriptionServiceType);
-		when(_taskList.getOriginalRequestId()).thenReturn(_originalRequestId);
-		when(_taskList.getOriginalRequestorId()).thenReturn(_originalRequestorId);
-		when(_taskList.getErrorSource()).thenReturn(_errorSource);
-		when(_taskList.getErrorCode()).thenReturn(_errorCode);
-		when(_taskList.getErrorMessage()).thenReturn(_errorMessage);
-		when(_taskList.getBuildingBlockName()).thenReturn(_buildingBlockName);
-		when(_taskList.getBuildingBlockStep()).thenReturn(_buildingBlockStep);
-		when(_taskList.getValidResponses()).thenReturn(_validResponses);
-	}
-
-	@After
-	public void tearDown() {
-		_taskList = null;
-		_validResponses = null;
-	}
-
-	@Test
-	public void testGetTaskId() {
-		String result = _taskList.getTaskId();
-		assertEquals(_taskId, result);
-
-	}
-
-	@Test
-	public void testSetTaskId() {
-		_taskList.setTaskId("_taskid");
-		verify(_taskList).setTaskId(_taskId);
-	}
-
-	@Test
-	public void testGetType() {
-		String result = _taskList.getType();
-		assertEquals(_type, result);
-
-	}
-
-	@Test
-	public void testSetType() {
-		_taskList.setType(_type);
-		verify(_taskList).setType(_type);
-	}
-
-	@Test
-	public void testGetNfRole() {
-		String result = _taskList.getNfRole();
-		assertEquals(_nfRole, result);
-
-	}
-
-	@Test
-	public void testSetNfRole() {
-		_taskList.setType(_nfRole);
-		verify(_taskList).setType(_nfRole);
-	}
-
-	@Test
-	public void testGetSubscriptionServiceType() {
-		String result = _taskList.getSubscriptionServiceType();
-		assertEquals(_subscriptionServiceType, result);
-
-	}
-
-	@Test
-	public void testSetSubscriptionServiceType() {
-		_taskList.setSubscriptionServiceType(_subscriptionServiceType);
-		verify(_taskList).setSubscriptionServiceType(_subscriptionServiceType);
-	}
-
-	@Test
-	public void testGetOriginalRequestId() {
-		String result = _taskList.getOriginalRequestId();
-		assertEquals(_originalRequestId, result);
-
-	}
-
-	@Test
-	public void testSetOriginalRequestId() {
-		_taskList.setOriginalRequestId(_originalRequestId);
-		verify(_taskList).setOriginalRequestId(_originalRequestId);
-	}
-
-	@Test
-	public void testGetOriginalRequestorId() {
-		String result = _taskList.getOriginalRequestorId();
-		assertEquals(_originalRequestorId, result);
-
-	}
-
-	@Test
-	public void testSetOriginalRequestorId() {
-		_taskList.setOriginalRequestorId(_originalRequestorId);
-		verify(_taskList).setOriginalRequestorId(_originalRequestorId);
-	}
-
-	@Test
-	public void testGetErrorSource() {
-		String result = _taskList.getErrorSource();
-		assertEquals(_errorSource, result);
-
-	}
-
-	@Test
-	public void testSetErrorSource() {
-		_taskList.setErrorSource(_errorSource);
-		verify(_taskList).setErrorSource(_errorSource);
-	}
-
-	@Test
-	public void testGetErrorCode() {
-		String result = _taskList.getErrorCode();
-		assertEquals(_errorCode, result);
-
-	}
-
-	@Test
-	public void testSetErrorCode() {
-		_taskList.setErrorCode(_errorCode);
-		verify(_taskList).setErrorCode(_errorCode);
-	}
-
-	@Test
-	public void testGetErrorMessage() {
-		String result = _taskList.getErrorMessage();
-		assertEquals(_errorMessage, result);
-
-	}
-
-	@Test
-	public void testSetErrorMessage() {
-		_taskList.setErrorMessage(_errorMessage);
-		verify(_taskList).setErrorMessage(_errorMessage);
-	}
-
-	@Test
-	public void testGetBuildingBlockName() {
-		String result = _taskList.getBuildingBlockName();
-		assertEquals(_buildingBlockName, result);
-
-	}
-
-	@Test
-	public void testSetBuildingBlockName() {
-		_taskList.setBuildingBlockName(_buildingBlockName);
-		verify(_taskList).setBuildingBlockName(_buildingBlockName);
-	}
-
-	@Test
-	public void testGetBuildingBlockStep() {
-		String result = _taskList.getBuildingBlockStep();
-		assertEquals(_buildingBlockStep, result);
-
-	}
-
-	@Test
-	public void testSetBuildingBlockStep() {
-		_taskList.setBuildingBlockStep(_buildingBlockStep);
-		verify(_taskList).setBuildingBlockStep(_buildingBlockStep);
-	}
-
-	@Test
-	public void testGetValidResponses() {
-
-		List<String> result = _taskList.getValidResponses();
-		assertEquals(_validResponses, result);
-
-	}
-	
-	@Test
-	public void testSetValidResponses() {
-		_taskList.setValidResponses(_validResponses);
-		verify(_taskList).setValidResponses(_validResponses);
-	}
-
-
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskRequestReferenceTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskRequestReferenceTest.java
deleted file mode 100644
index 043f4ea..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskRequestReferenceTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.onap.so.apihandlerinfra.tasksbeans;
-
-import org.junit.After;
-
-import static org.junit.Assert.assertEquals;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-public class TaskRequestReferenceTest {
-
-	TaskRequestReference _taskRequestReference;
-
-    protected String _taskId;
-	public TaskRequestReferenceTest() {
-	}
-	
-	@Before
-	public void setUp() {
-		_taskRequestReference = mock(TaskRequestReference.class);
-		_taskId = "taskid";
-	
-		when(_taskRequestReference.getTaskId()).thenReturn(_taskId);
-	}
-
-	@After
-	public void tearDown() {
-		_taskRequestReference = null;
-	}
-
-	/**
-	 * Test getTaskRequestReference 
-	 */
-	@Test
-	public void taskGetRequestReference() {
-		String result = _taskRequestReference.getTaskId();
-        assertEquals(_taskId, result);
-	}
-
-	/**
-	 * Test setTaskRequestReference
-	 */
-	@Test
-	public void testSetRequestInfo() {
-		_taskRequestReference.setTaskId(_taskId);
-		verify(_taskRequestReference).setTaskId(_taskId);
-	}
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskVariableValueTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskVariableValueTest.java
deleted file mode 100644
index bc6a5ab..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskVariableValueTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.onap.so.apihandlerinfra.tasksbeans;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-public class TaskVariableValueTest {
-	TaskVariableValue _taskVariableValue;
-	protected String _name;
-	protected String _value;
-	protected String _operator;
-
-	public TaskVariableValueTest() {
-	}
-
-	@Before
-	public void setUp() {
-		_taskVariableValue = mock(TaskVariableValue.class);
-		_name = "name";
-		_value = "value";
-		_operator = "operator";
-		when(_taskVariableValue.getName()).thenReturn(_name);
-		when(_taskVariableValue.getValue()).thenReturn(_value);
-		when(_taskVariableValue.getOperator()).thenReturn(_operator);
-	}
-
-	@After
-	public void tearDown() {
-		_taskVariableValue = null;
-	}
-
-	/**
-	 * Test of getName method
-	 */
-	@Test
-	public void testGetName() {
-		_taskVariableValue.setName(_name);
-		assertEquals(_taskVariableValue.getName(),_name);
-
-	}
-
-	/**
-	 * Test setName
-	 */
-	@Test
-	public void testSetName() {
-		_taskVariableValue.setName(_name);
-		verify(_taskVariableValue).setName(_name);
-	}
-	
-	/**
-	 * Test of getName method
-	 */
-	@Test
-	public void testGetValue() {
-		_taskVariableValue.setValue(_value);
-		assertEquals(_taskVariableValue.getValue(),_value);
-
-	}
-
-	/**
-	 * Test setName
-	 */
-	@Test
-	public void testSetValue() {
-		_taskVariableValue.setValue(_value);
-		verify(_taskVariableValue).setValue(_value);
-	}
-	
-	/**
-	 * Test of getName method
-	 */
-	@Test
-	public void testGetOperator() {
-		_taskVariableValue.setOperator(_operator);
-		assertEquals(_taskVariableValue.getOperator(),_operator);
-
-	}
-
-	/**
-	 * Test setName
-	 */
-	@Test
-	public void testSetRequestDetails() {
-		_taskVariableValue.setOperator(_operator);
-		verify(_taskVariableValue).setOperator(_operator);
-	}
-
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskVariablesTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskVariablesTest.java
deleted file mode 100644
index 8e2c3ae..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TaskVariablesTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.onap.so.apihandlerinfra.tasksbeans;
-
-import org.junit.After;
-
-import static org.junit.Assert.assertEquals;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.List;
-
-public class TaskVariablesTest {
-
-	TaskVariables _taskVariables;
-	private List<TaskVariableValue> _taskVariableValueList;
-
-	public TaskVariablesTest() {
-	}
-
-	@SuppressWarnings("unchecked")
-	@Before
-	public void setUp() {
-		_taskVariables = mock(TaskVariables.class);
-		_taskVariableValueList  = mock(List.class);
-		when(_taskVariables.getTaskVariables()).thenReturn(_taskVariableValueList);
-	}
-
-	@After
-	public void tearDown() {
-		_taskVariables = null;
-	}
-
-	@Test
-	public void testGetTaskVariables() {
-		List<TaskVariableValue> result = _taskVariables.getTaskVariables();
-		assertEquals(_taskVariableValueList, result);
-
-	}
-
-	@Test
-	public void testSetTaskVariables() {
-		_taskVariables.setTaskVariables(_taskVariableValueList);
-		verify(_taskVariables).setTaskVariables(_taskVariableValueList);
-
-	}
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TasksBeansTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TasksBeansTest.java
new file mode 100644
index 0000000..cbdfe6b
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TasksBeansTest.java
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 - 2018 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.onap.so.apihandlerinfra.tasksbeans;
+
+import org.junit.Test;
+import org.onap.so.apihandlerinfra.BaseTest;
+
+import com.openpojo.reflection.filters.FilterPackageInfo;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+
+public class TasksBeansTest extends BaseTest{
+	@Test
+	public void validateGettersAndSetters() {
+		Validator validator = ValidatorBuilder.create().with(new SetterMustExistRule(), new GetterMustExistRule())
+                            .with(new SetterTester(), new GetterTester()).build();
+		validator.validate("org.onap.so.apihandlerinfra.tasksbeans", new FilterPackageInfo());
+	}
+}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TasksGetResponseTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TasksGetResponseTest.java
deleted file mode 100644
index f4ec27e..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TasksGetResponseTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.onap.so.apihandlerinfra.tasksbeans;
-
-import org.junit.After;
-
-import static org.junit.Assert.assertEquals;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.List;
-
-public class TasksGetResponseTest {
-
-	TasksGetResponse _tasksGetResponse;
-	private List<TaskList> _taskList;
-
-	public TasksGetResponseTest() {
-	}
-
-	@SuppressWarnings("unchecked")
-	@Before
-	public void setUp() {
-		_tasksGetResponse = mock(TasksGetResponse.class);
-		_taskList = mock(List.class);
-		when(_tasksGetResponse.getTaskList()).thenReturn(_taskList);
-	}
-
-	@After
-	public void tearDown() {
-		_tasksGetResponse = null;
-	}
-
-	@Test
-	public void testGetTaskList() {
-		List<TaskList> result = _tasksGetResponse.getTaskList();
-		assertEquals(_taskList, result);
-
-	}
-
-	@Test
-	public void testSetTaskList() {
-		_tasksGetResponse.setTaskList(_taskList);
-		verify(_tasksGetResponse).setTaskList(_taskList);
-
-	}
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TasksRequestTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TasksRequestTest.java
deleted file mode 100644
index 09af2b0..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/TasksRequestTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.onap.so.apihandlerinfra.tasksbeans;
-
-import org.junit.After;
-import static org.junit.Assert.assertTrue;
-import org.junit.Before;
-import org.junit.Test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-
-public class TasksRequestTest {
-	TasksRequest _tasksRequest;
-	private RequestDetails _requestDetails;
-
-	public TasksRequestTest() {
-	}
-
-	@Before
-	public void setUp() {
-		_tasksRequest = mock(TasksRequest.class);
-		_requestDetails = new RequestDetails();
-		when(_tasksRequest.getRequestDetails()).thenReturn(_requestDetails);
-	}
-
-	@After
-	public void tearDown() {
-		_tasksRequest = null;
-	}
-
-	/**
-	 * Test of getRequestDetails method
-	 */
-	@Test
-	public void testGetRequestDetails() {
-		_tasksRequest.setRequestDetails(_requestDetails);
-		assertTrue(_tasksRequest.getRequestDetails().equals(_requestDetails));
-
-	}
-
-	/**
-	 * Test setRequestDetails
-	 */
-	@Test
-	public void testSetRequestDetails() {
-		_tasksRequest.setRequestDetails(_requestDetails);
-		verify(_tasksRequest).setRequestDetails(_requestDetails);
-	}
-
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/ValueTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/ValueTest.java
deleted file mode 100644
index dc5cf8e..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/ValueTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.onap.so.apihandlerinfra.tasksbeans;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-public class ValueTest {
-	Value _valueInstance;
-	protected String _value;
-
-	public ValueTest() {
-	}
-
-	@Before
-	public void setUp() {
-		_valueInstance = mock(Value.class);
-		_value = "_value";
-		when(_valueInstance.getValue()).thenReturn(_value);
-	}
-
-	@After
-	public void tearDown() {
-		_valueInstance = null;
-	}
-
-	/**
-	 * Test of getValue method
-	 */
-	@Test
-	public void testGetValue() {
-		_valueInstance.setValue(_value);
-		assertEquals(_valueInstance.getValue(),_value);
-
-	}
-
-	/**
-	 * Test setValue
-	 */
-	@Test
-	public void testSetValue() {
-		_valueInstance.setValue(_value);
-		verify(_valueInstance).setValue(_value);
-	}
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/VariablesTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/VariablesTest.java
deleted file mode 100644
index d79e5f6..0000000
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tasksbeans/VariablesTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.onap.so.apihandlerinfra.tasksbeans;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-public class VariablesTest {
-
-	Variables _variables;
-	protected Value _source;
-	protected Value _responseValue;
-    protected Value _requestorId;
-   
-    @Before
-	public void setUp() {
-    	_variables = mock(Variables.class);
-        _source = mock(Value.class);
-        _responseValue = mock(Value.class);
-        _requestorId = mock(Value.class);
-        
-		when(_variables.getSource()).thenReturn(_source);
-		when(_variables.getRequestorId()).thenReturn(_requestorId);
-		when(_variables.getResponseValue()).thenReturn(_responseValue);
-		
-	}
-
-	@After
-	public void tearDown() {
-		_variables = null;
-		_source = null;
-		_responseValue = null;
-		_requestorId = null;
-	}
-	
-	@Test
-    public void testGetSource() {
-		_variables.setSource(_source);
-		assertTrue(_variables.getSource().equals(_source));
-    }
-
-	@Test
-	public void testSetSource(){
-		_variables.setSource(_source);
-		verify(_variables).setSource(_source);
-		}	
-	
-	@Test
-    public void testGetResponseValue() {
-		_variables.setResponseValue(_responseValue);
-		assertTrue(_variables.getResponseValue().equals(_responseValue));
-    }
-
-	@Test
-	public void testSetResponseValue(){
-		_variables.setResponseValue(_responseValue);
-		verify(_variables).setResponseValue(_responseValue);
-		}	
-	
-	@Test
-    public void testGetRequestorId() {
-		_variables.setRequestorId(_requestorId);
-		assertTrue(_variables.getRequestorId().equals(_requestorId));
-    }
-
-	@Test
-	public void testSetRequestorId(){
-		_variables.setRequestorId(_requestorId);
-		verify(_variables).setRequestorId(_requestorId);
-		}	
-	
-}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tenantisolation/ModelDistributionRequestTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tenantisolation/ModelDistributionRequestTest.java
index 37ec14a..afcf0f5 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tenantisolation/ModelDistributionRequestTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tenantisolation/ModelDistributionRequestTest.java
@@ -25,7 +25,7 @@
 import static org.hamcrest.Matchers.startsWith;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.contains;
 import static org.mockito.Mockito.doNothing;
@@ -43,7 +43,7 @@
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.Spy;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.so.apihandler.common.ErrorNumbers;
 import org.onap.so.apihandlerinfra.ApiHandlerApplication;
 import org.onap.so.apihandlerinfra.BaseTest;
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tenantisolation/helpers/AAIClientHelperTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tenantisolation/helpers/AAIClientHelperTest.java
index 9aa961c..f9e3ec6 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tenantisolation/helpers/AAIClientHelperTest.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/tenantisolation/helpers/AAIClientHelperTest.java
@@ -28,7 +28,7 @@
 import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/application-test.yaml b/mso-api-handlers/mso-api-handler-infra/src/test/resources/application-test.yaml
index b7b6a8c..6e1d6f3 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/test/resources/application-test.yaml
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/application-test.yaml
@@ -6,17 +6,17 @@
         max-threads: 50
 ssl-enable: false
 
-apih-healthcheck-urn: /ecomp/mso/healthcheck,/ecomp/mso/homing/healthcheck,/ecomp/mso/infra/healthcheck,/asdc/healthcheck,/dbadapters/healthcheck,/ecomp/mso/catalog/v2/healthcheck
-jra-healthcheck-urn: /networks/rest/healthcheck,/adapters/rest/healthcheck,/vnfs/rest/healthcheck,/tenants/rest/healthcheck,/appc/rest/healthcheck,/workflows/messages/healthcheck
-camunda-healthcheck-urn: /mso/healthcheck
-
-apih-nodehealthcheck-urn: /ecomp/mso/infra/nodehealthcheck
-jra-nodehealthcheck-urn: /adapters/rest/nodehealthcheck
-camunda-nodehealthcheck-urn: /mso/nodehealthcheck
-
-
-
 mso:
+  health:
+    endpoints:
+      catalogdb: http://localhost:${wiremock.server.port}
+      requestdb: http://localhost:${wiremock.server.port}
+      sdnc: http://localhost:${wiremock.server.port}
+      openstack: http://localhost:${wiremock.server.port}
+      bpmn: http://localhost:${wiremock.server.port}
+      asdc: http://localhost:${wiremock.server.port}
+      requestdbattsvc: http://localhost:${wiremock.server.port}
+      
   infra-requests:
     archived:
       period: 180
@@ -48,14 +48,14 @@
         apiMinorVersion: 0
         apiPatchVersion: 0
   camundaURL: http://localhost:${wiremock.server.port}/
-  camundaAuth: F8E9452B55DDE4CCE77547B0E748105C54CF5EF1351B4E2CBAABF2981EFE776D
+  camundaAuth: E8E19DD16CC90D2E458E8FF9A884CC0452F8F3EB8E321F96038DE38D5C1B0B02DFAE00B88E2CF6E2A4101AB2C011FC161212EE
   async:
     core-pool-size: 50
     max-pool-size: 50
     queue-capacity: 500
   sdc:
     client:
-      auth: F3473596C526938329DF877495B494DC374D1C4198ED3AD305EA3ADCBBDA1862
+      auth: 97FF88AB352DA16E00DDD81E3876431DEF8744465DACA489EB3B3BE1F10F63EDA1715E626D0A4827A3E19CD88421BF
     activate:
       instanceid: test
       userid: cs0008
@@ -67,7 +67,7 @@
         count: 3
   aai:
     endpoint: http://localhost:${wiremock.server.port}
-    auth: 26AFB797A6A57960D5D718491925C50F77CDC22AC394B3DBA09950D8FD1C0764
+    auth: 5E12ACACBD552A415E081E29F2C4772F9835792A51C766CCFDD7433DB5220B59969CB2798C
   grm:
     endpoint: http://localhost:${wiremock.server.port}
     username: gmruser
@@ -84,12 +84,11 @@
 
 spring:
   datasource:
-    url: jdbc:mariadb://localhost:3307/catalogdb
+    jdbc-url: jdbc:mariadb://localhost:3307/catalogdb
     username: root
     password: password
     driver-class-name: org.mariadb.jdbc.Driver    
-    initialize: true
-    initialization-mode: never
+    initialization-mode: always
   jpa:   
     generate-ddl: false
     show-sql: false
@@ -108,24 +107,21 @@
       role: InfraPortal-Client
 request:
   datasource:
-    url: jdbc:mariadb://localhost:3307/requestdb
+    jdbc-url: jdbc:mariadb://localhost:3307/requestdb
     username: root
     password: password
     driver-class-name: org.mariadb.jdbc.Driver
-    intialize: false 
     
 mariaDB4j:
   dataDir: 
   port: 3307
   databaseName: catalogdb
   databaseName2: requestdb
-#Actuator
-management: 
-  context-path: /manage
-  endpoints:
-    enabled-by-default: false
-  endpoint:
-    info:
-      enabled: true
-    health:
-      enabled: true
\ No newline at end of file
+
+
+org:
+  onap:
+    so:
+      adapters:
+        network:
+          encryptionKey: aa3871669d893c7fb8abbcda31b88b4f
