diff --git a/test-apis-ci/pom.xml b/test-apis-ci/pom.xml
index 59dc3fd..ef0eff4 100644
--- a/test-apis-ci/pom.xml
+++ b/test-apis-ci/pom.xml
@@ -1,359 +1,450 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
-	<modelVersion>4.0.0</modelVersion>
+    <modelVersion>4.0.0</modelVersion>
 
-	<artifactId>test-apis-ci</artifactId>
+    <artifactId>test-apis-ci</artifactId>
 
-	<parent>
-		<groupId>org.openecomp.sdc</groupId>
-		<artifactId>sdc-main</artifactId>
-		<version>1.2.0-SNAPSHOT</version>
-	</parent>
+    <parent>
+        <groupId>org.openecomp.sdc</groupId>
+        <artifactId>sdc-main</artifactId>
+        <version>1.2.0-SNAPSHOT</version>
+    </parent>
 
-	<properties>
-		<sonar.skip>true</sonar.skip>
-	</properties>
+    <dependencies>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${guava.version}</version>
+            <scope>compile</scope>
+        </dependency>
 
-	<dependencies>
-		<dependency>
-			<groupId>com.google.guava</groupId>
-			<artifactId>guava</artifactId>
-			<version>${guava.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <!--<dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-core</artifactId>
+            <version>1.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-library</artifactId>
+            <version>1.3</version>
+            <scope>test</scope>
+        </dependency>-->
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-all</artifactId>
+            <version>1.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <version>${testng.version}</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>${junit.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>com.aventstack</groupId>
+            <artifactId>extentreports</artifactId>
+            <version>3.0.6</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>org.testng</groupId>
-			<artifactId>testng</artifactId>
-			<version>${testng.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
 
-		<dependency>
-  			<groupId>com.aventstack</groupId>
-  			<artifactId>extentreports</artifactId>
-  			<version>3.0.6</version>
-  			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>com.typesafe</groupId>
+            <artifactId>config</artifactId>
+            <version>1.0.2</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>${mockito.version}</version>
-			<scope>test</scope>
-		</dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>com.typesafe</groupId>
-			<artifactId>config</artifactId>
-			<version>1.0.2</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>com.jcraft.jsch</groupId>
+            <artifactId>com.springsource.com.jcraft.jsch</artifactId>
+            <version>0.1.41</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-			<version>1.2.17</version>
-			<scope>compile</scope>
-		</dependency>
+        <!--	<dependency>
+                <groupId>org.openecomp.sdc</groupId>
+                <artifactId>dmaap-publisher</artifactId>
+                <version>1.0.0</version>
+                <scope>provided</scope>
+            </dependency>-->
 
-		<dependency>
-			<groupId>com.jcraft.jsch</groupId>
-			<artifactId>com.springsource.com.jcraft.jsch</artifactId>
-			<version>0.1.41</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>org.openecomp.sdc</groupId>
+            <artifactId>common-app-api</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>org.openecomp.sdc</groupId>
-			<artifactId>common-app-api</artifactId>
-			<version>${project.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>org.openecomp.sdc.be</groupId>
+            <artifactId>common-be</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>org.openecomp.sdc.be</groupId>
-			<artifactId>common-be</artifactId>
-			<version>${project.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <!-- CHECK CATLOG MODEL -->
+        <dependency>
+            <groupId>org.openecomp.sdc.be</groupId>
+            <artifactId>catalog-model</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<!-- CHECK CATLOG MODEL -->
-		<dependency>
-			<groupId>org.openecomp.sdc.be</groupId>
-			<artifactId>catalog-model</artifactId>
-			<version>${project.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <!-- catalog dao -->
+        <dependency>
+            <groupId>org.openecomp.sdc.be</groupId>
+            <artifactId>catalog-dao</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <!-- functional java -->
+        <dependency>
+            <groupId>org.functionaljava</groupId>
+            <artifactId>functionaljava</artifactId>
+            <version>${functionaljava.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <!-- CASSANDRA -->
+        <dependency>
+            <groupId>com.datastax.cassandra</groupId>
+            <artifactId>cassandra-driver-core</artifactId>
+            <version>${cassandra.driver.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <!-- CASSANDRA END -->
 
-		<!-- catalog dao -->
-		<dependency>
-			<groupId>org.openecomp.sdc.be</groupId>
-			<artifactId>catalog-dao</artifactId>
-			<version>${project.version}</version>
-			<scope>compile</scope>
-		</dependency>
-		<!-- functional java -->
-		<dependency>
-			<groupId>org.functionaljava</groupId>
-			<artifactId>functionaljava</artifactId>
-			<version>${functionaljava.version}</version>
-			<scope>compile</scope>
-		</dependency>
-		<!-- CASSANDRA -->
-		<dependency>
-			<groupId>com.datastax.cassandra</groupId>
-			<artifactId>cassandra-driver-core</artifactId>
-			<version>${cassandra.driver.version}</version>
-			<scope>compile</scope>
-		</dependency>
-		<!-- CASSANDRA END -->
-
-		<!-- slf4j + logback -->
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
+        <!-- slf4j + logback -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
             <version>${slf4j-api.version}</version>
-			<scope>compile</scope>
-		</dependency>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>ch.qos.logback</groupId>
-			<artifactId>logback-classic</artifactId>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
             <version>${logback.version}</version>
-			<scope>compile</scope>
-		</dependency>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>ch.qos.logback</groupId>
-			<artifactId>logback-core</artifactId>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
             <version>${logback.version}</version>
-			<scope>compile</scope>
-		</dependency>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>com.googlecode.json-simple</groupId>
-			<artifactId>json-simple</artifactId>
-			<version>${json-simple.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>com.googlecode.json-simple</groupId>
+            <artifactId>json-simple</artifactId>
+            <version>${json-simple.version}</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<!-- File changes listener -->
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-jci-core</artifactId>
-			<version>${commons-jci-core.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <!-- File changes listener -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-jci-core</artifactId>
+            <version>${commons-jci-core.version}</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>commons-codec</groupId>
-			<artifactId>commons-codec</artifactId>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
             <version>${commons-codec}</version>
-			<scope>compile</scope>
-		</dependency>
+            <scope>compile</scope>
+        </dependency>
 
-		<!-- Gson -->
-		<dependency>
-			<groupId>com.google.code.gson</groupId>
-			<artifactId>gson</artifactId>
-			<version>${gson.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <!-- Gson -->
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>${gson.version}</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<!-- Snake Yaml -->
-		<dependency>
-			<groupId>org.yaml</groupId>
-			<artifactId>snakeyaml</artifactId>
-			<version>${snakeyaml.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <!-- Snake Yaml -->
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+            <version>${snakeyaml.version}</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<!-- http client -->
-		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpclient</artifactId>
+        <!-- http client -->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
             <version>${httpclient.version}</version>
-			<scope>compile</scope>
-		</dependency>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpmime</artifactId>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
             <version>${httpclient.version}</version>
-			<scope>compile</scope>
-		</dependency>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-			<version>2.5</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.5</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
             <version>${commons-logging}</version>
-			<scope>compile</scope>
-		</dependency>
+            <scope>compile</scope>
+        </dependency>
 
-		<!-- http core -->
-		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpcore</artifactId>
-			<version>${httpcore.version}</version>
-			<scope>compile</scope>
-		</dependency>
+        <!-- http core -->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+            <version>${httpcore.version}</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<!-- TITAN -->
-		<dependency>
-			<groupId>com.thinkaurelius.titan</groupId>
-			<artifactId>titan-core</artifactId>
-			<version>${titan.version}</version>
-			<scope>compile</scope>
-			<exclusions>
-				<exclusion>
-					<artifactId>slf4j-log4j12</artifactId>
-					<groupId>org.slf4j</groupId>
-				</exclusion>
-			</exclusions>
-		</dependency>
+        <!-- TITAN -->
+        <dependency>
+            <groupId>com.thinkaurelius.titan</groupId>
+            <artifactId>titan-core</artifactId>
+            <version>${titan.version}</version>
+            <scope>compile</scope>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-log4j12</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
 
-		<dependency>
-			<groupId>org.openecomp.sdc.sdc-titan-cassandra</groupId>
-  			<artifactId>sdc-titan-cassandra</artifactId>
-			<version>${titan.version}</version>
-			<scope>compile</scope>
-			<exclusions>
-				<exclusion>
-					<artifactId>slf4j-log4j12</artifactId>
-					<groupId>org.slf4j</groupId>
-				</exclusion>
-			</exclusions>
-		</dependency>
+        <dependency>
+            <groupId>com.thinkaurelius.titan</groupId>
+            <artifactId>titan-cassandra</artifactId>
+            <version>${titan.version}</version>
+            <scope>compile</scope>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-log4j12</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
 
-		<dependency>
-			<groupId>org.codehaus.jackson</groupId>
-			<artifactId>jackson-mapper-asl</artifactId>
-			<version>1.9.2</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-mapper-asl</artifactId>
+            <version>1.9.2</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>com.fasterxml.jackson.core</groupId>
-			<artifactId>jackson-databind</artifactId>
-			<version>2.3.1</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.3.1</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>com.fasterxml.jackson.core</groupId>
-			<artifactId>jackson-core</artifactId>
-			<version>2.3.1</version>
-			<scope>compile</scope>
-		</dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>2.3.1</version>
+            <scope>compile</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>org.openecomp.ecompsdkos</groupId>
-			<artifactId>epsdk-fw</artifactId>
-			<version>${ecomp.version}</version>
-			<scope>compile</scope>
-			<exclusions>
-				<exclusion>
-					<artifactId>slf4j-log4j12</artifactId>
-					<groupId>org.slf4j</groupId>
-				</exclusion>
-			</exclusions>
-		</dependency>
+        <dependency>
+            <groupId>org.openecomp.ecompsdkos</groupId>
+            <artifactId>epsdk-fw</artifactId>
+            <version>${ecomp.version}</version>
+            <scope>compile</scope>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-log4j12</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
 
-		<dependency>
-			<groupId>org.json</groupId>
-			<artifactId>json</artifactId>
-			<version>20090211</version>
-		</dependency>
-		 <dependency>
-		    <groupId>org.openecomp.sdc.sdc-tosca</groupId>
-		    <artifactId>sdc-tosca</artifactId>
-	<version>${sdc-tosca-parser.version}</version>
-		    <scope>compile</scope>
-		</dependency>
-	</dependencies>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20131018</version>
+        </dependency>
 
-	<build>
-		<plugins>
+        <dependency>
+            <groupId>org.openecomp.sdc.sdc-tosca</groupId>
+            <artifactId>sdc-tosca</artifactId>
+            <version>1.2.1-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
 
-			<!-- ============================================= -->
-			<!-- Get the next build number -->
-			<!-- ============================================= -->
-			<!--<plugin>-->
-				<!--<groupId>org.codehaus.mojo</groupId>-->
-				<!--<artifactId>properties-maven-plugin</artifactId>-->
-				<!--<version>1.0-alpha-1</version>-->
-				<!--<inherited>false</inherited>-->
+        <dependency>
+            <groupId>info.cukes</groupId>
+            <artifactId>cucumber-junit</artifactId>
+            <version>1.2.4</version>
+            <scope>test</scope>
+        </dependency>
 
-				<!--<executions>-->
-					<!--<execution>-->
-						<!--<id>tests</id>-->
-						<!--<phase>initialize</phase>-->
-						<!--<goals>-->
-							<!--<goal>read-project-properties</goal>-->
-						<!--</goals>-->
+        <dependency>
+            <groupId>info.cukes</groupId>
+            <artifactId>cucumber-core</artifactId>
+            <version>1.2.4</version>
+            <scope>test</scope>
+        </dependency>
+        
+        <dependency>
+            <groupId>info.cukes</groupId>
+            <artifactId>gherkin</artifactId>
+            <version>2.12.2</version>
+        </dependency>
+        <dependency>
+            <groupId>info.cukes</groupId>
+            <artifactId>cucumber-java</artifactId>
+            <version>1.2.5</version>
+            <scope>test</scope>
+        </dependency>
 
-						<!--<configuration>-->
-							<!--<files>-->
-								<!--<file>../target/FullReleaseVersion.properties</file>-->
-							<!--</files>-->
-						<!--</configuration>-->
-					<!--</execution>-->
-				<!--</executions>-->
-			<!--</plugin>-->
+        <dependency>
+            <groupId>info.cukes</groupId>
+            <artifactId>cucumber-jvm-deps</artifactId>
+            <version>1.0.5</version>
+        </dependency>
 
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-deploy-plugin</artifactId>
-				<version>2.7</version>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-			</plugin>
+        <dependency>
+            <groupId>org.mock-server</groupId>
+            <artifactId>mockserver-netty</artifactId>
+            <version>3.10.4</version>
+            <scope>test</scope>
+        </dependency>
 
-			<!-- ============================================= -->
-			<!-- Create the JAR file with its dependencies -->
-			<!-- ============================================= -->
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-assembly-plugin</artifactId>
-				<executions>
-					<execution>
-						<id>create.jar.with.dependencies</id>
-						<phase>package</phase>
-						<goals>
-							<goal>single</goal>
-						</goals>
-						<configuration>
-							<archive>
-								<manifest>
-									<mainClass>org.openecomp.sdc.ci.tests.run.StartTest</mainClass>
-								</manifest>
-							</archive>
-							<descriptorRefs>
-								<descriptorRef>jar-with-dependencies</descriptorRef>
-							</descriptorRefs>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
+        <dependency>
+            <groupId>org.openecomp.sdc.sdc-distribution-client</groupId>
+            <artifactId>sdc-distribution-client</artifactId>
+            <version>1.2.2 </version>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- With TestNG -->
+        <dependency>
+            <groupId>info.cukes</groupId>
+            <artifactId>cucumber-testng</artifactId>
+            <version>1.2.5</version>
+        </dependency>
+
+        <!-- spring -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>${spring.version}</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- CASSANDRA -->
+        <dependency>
+            <groupId>com.datastax.cassandra</groupId>
+            <artifactId>cassandra-driver-mapping</artifactId>
+            <version>${cassandra.driver.version}</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- CASSANDRA END -->
+    </dependencies>
+
+    <build>
+        <plugins>
+
+            <!-- ============================================= -->
+            <!-- Get the next build number -->
+            <!-- ============================================= -->
+            <!--<plugin> -->
+            <!--<groupId>org.codehaus.mojo</groupId> -->
+            <!--<artifactId>properties-maven-plugin</artifactId> -->
+            <!--<version>1.0-alpha-1</version> -->
+            <!--<inherited>false</inherited> -->
+
+            <!--<executions> -->
+            <!--<execution> -->
+            <!--<id>tests</id> -->
+            <!--<phase>initialize</phase> -->
+            <!--<goals> -->
+            <!--<goal>read-project-properties</goal> -->
+            <!--</goals> -->
+
+            <!--<configuration> -->
+            <!--<files> -->
+            <!--<file>../target/FullReleaseVersion.properties</file> -->
+            <!--</files> -->
+            <!--</configuration> -->
+            <!--</execution> -->
+            <!--</executions> -->
+            <!--</plugin> -->
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.7</version>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+
+            <!-- ============================================= -->
+            <!-- Create the JAR file with its dependencies -->
+            <!-- ============================================= -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>create.jar.with.dependencies</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <archive>
+                                <manifest>
+                                    <mainClass>org.openecomp.sdc.ci.tests.run.StartTest</mainClass>
+                                </manifest>
+                            </archive>
+                            <descriptorRefs>
+                                <descriptorRef>jar-with-dependencies</descriptorRef>
+                            </descriptorRefs>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 
 
 </project>
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ComponentBaseTest.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ComponentBaseTest.java
index a49d5c6..1d0b404 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ComponentBaseTest.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ComponentBaseTest.java
@@ -37,6 +37,7 @@
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.ImmutableTriple;
+import org.apache.log4j.Logger;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.rules.TestName;
@@ -66,15 +67,10 @@
 import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
 import org.openecomp.sdc.ci.tests.utils.rest.ServiceRestUtils;
-import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.ITestContext;
 import org.testng.ITestResult;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.AfterSuite;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.*;
 
 import com.aventstack.extentreports.ExtentTest;
 import com.aventstack.extentreports.Status;
@@ -85,11 +81,17 @@
 import ch.qos.logback.classic.Level;
 import ch.qos.logback.classic.LoggerContext;
 
-
 public abstract class ComponentBaseTest {
 
+//	private static Logger logger = LoggerFactory.getLogger(ComponentBaseTest.class.getName());
+	
+	protected static Logger logger= Logger.getLogger(ComponentBaseTest.class);	
+	
 
-	protected static Logger logger= LoggerFactory.getLogger(ComponentBaseTest.class);
+//	 public ComponentBaseTest(TestName testName, String className) {
+//	 super(testName, className);
+//	 }
+
 	protected static final String REPORT_FOLDER = "." + File.separator + "ExtentReport" + File.separator;
 	private static final String VERSIONS_INFO_FILE_NAME = "versions.info";
 	private static final String REPORT_FILE_NAME = "SDC_CI_Extent_Report.html";
@@ -127,16 +129,16 @@
 		myContext=context;
 		ExtentManager.initReporter(getReportFolder(), REPORT_FILE_NAME, context);	
 		AtomicOperationUtils.createDefaultConsumer(true);
-		openTitanLogic();
+//		openTitanLogic();
 		performClean();
-
-
+		
+		
 
 	}
 	
 	@BeforeMethod(alwaysRun = true)
 	public void setupBeforeTest(java.lang.reflect.Method method, ITestContext context) throws Exception {
-
+		
 		System.out.println(" method.getName() " + method.getName());
 		if (!method.getName().equals("onboardVNFShotFlow"))  {
 //			System.out.println("ExtentReport instance started from BeforeMethod...");
@@ -182,7 +184,7 @@
 		
 	}
 
-	@AfterClass(alwaysRun = true)
+/*	@AfterClass(alwaysRun = true)
 	public synchronized static void cleanAfterClass() throws Exception{
 
 //		System.out.println("<<<<<<<<class name>>>>>"+method.getDeclaringClass());
@@ -190,19 +192,23 @@
 
 
 		System.out.println("delete components AfterClass");
-		deleteCreatedComponents(getCatalogAsMap());
+		if(!config.getSystemUnderDebug()){
+			deleteCreatedComponents(getCatalogAsMap());
+//			CassandraUtils.truncateAllKeyspaces();
+		}else{
+			System.out.println("Accordindig to configuration components will not be deleted, in case to unable option to delete, please change systemUnderDebug parameter value to false ...");
+		}
 //		extentReport.flush();
 
-	}
+	}*/
 	
 	@AfterSuite(alwaysRun = true)
 	public static void shutdownTitan() throws Exception {
 		
 		performClean();
-		shutdownTitanLogic();
+//		shutdownTitanLogic();
 
 	}
-
 	protected static void openTitanLogic() throws Exception {
 	
 		logger.trace(config.toString());
@@ -234,9 +240,8 @@
 //		cleanComponents();
 		if(!config.getSystemUnderDebug()){
 			deleteCreatedComponents(getCatalogAsMap());
-			CassandraUtils.truncateAllKeyspaces();
+//			CassandraUtils.truncateAllKeyspaces();
 			FileHandling.overWriteExistindDir("outputCsar");
-
 		}else{
 			System.out.println("Accordindig to configuration components will not be deleted, in case to unable option to delete, please change systemUnderDebug parameter value to false ...");
 		}
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentManager.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentManager.java
index 26edee9..b320f42 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentManager.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentManager.java
@@ -20,19 +20,23 @@
 
 package org.openecomp.sdc.ci.tests.api;
 
-import java.io.File;
-
 import org.openecomp.sdc.ci.tests.config.Config;
 import org.openecomp.sdc.ci.tests.utils.Utils;
 import org.openecomp.sdc.ci.tests.utils.general.FileHandling;
-import org.openecomp.sdc.ci.tests.utils.rest.AutomationUtils;
 import org.testng.ITestContext;
-
 import com.aventstack.extentreports.ExtentReports;
 import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
 import com.aventstack.extentreports.reporter.ExtentXReporter;
 import com.aventstack.extentreports.reporter.configuration.Protocol;
 import com.aventstack.extentreports.reporter.configuration.Theme;
+import org.openecomp.sdc.ci.tests.config.Config;
+
+import org.openecomp.sdc.ci.tests.utils.Utils;
+import org.openecomp.sdc.ci.tests.utils.general.FileHandling;
+import org.openecomp.sdc.ci.tests.utils.rest.AutomationUtils;
+import org.testng.ITestContext;
+
+import java.io.File;
 
 public class ExtentManager {
 	
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentTestActions.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentTestActions.java
index 045d565..2c242d0 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentTestActions.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentTestActions.java
@@ -20,14 +20,16 @@
 
 package org.openecomp.sdc.ci.tests.api;
 
-import java.io.File;
-
 import com.aventstack.extentreports.ExtentTest;
+import com.aventstack.extentreports.MediaEntityBuilder;
 import com.aventstack.extentreports.Status;
 import com.aventstack.extentreports.markuputils.ExtentColor;
 import com.aventstack.extentreports.markuputils.Markup;
 import com.aventstack.extentreports.markuputils.MarkupHelper;
 
+import java.io.File;
+import org.openecomp.sdc.ci.tests.api.ExtentTestManager;
+
 
 public class ExtentTestActions {
 	
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentTestManager.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentTestManager.java
index b525150..810f6a6 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentTestManager.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/ExtentTestManager.java
@@ -20,12 +20,12 @@
 
 package org.openecomp.sdc.ci.tests.api;
 
-import java.util.HashMap;
-
 import com.aventstack.extentreports.ExtentReports;
 import com.aventstack.extentreports.ExtentTest;
 
+import java.util.HashMap;
 public class ExtentTestManager implements SomeInterface{
+
 		private static HashMap<Long, ExtentTest> extentTestMap = new HashMap<Long, ExtentTest>();
 		private static ExtentReports extent = ExtentManager.getReporter();
 		
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/Urls.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/Urls.java
index fd6e9ee..b908ddd 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/Urls.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/api/Urls.java
@@ -20,220 +20,224 @@
 
 package org.openecomp.sdc.ci.tests.api;
 
+
+import org.openecomp.sdc.ci.tests.utils.Utils;
+
+import java.io.FileNotFoundException;
+
 public interface Urls {
 
-	final String UPLOAD_ZIP_URL = "http://%s:%s/sdc1/rest/v1/catalog/resources";
-	final String GET_IMAGE_DATA_FROM_ES = "http://%s:%s/resources/imagedata/_search?q=resourceName:%s&pretty=true&size=1000";
-	final String GET_SCRIPT_DATA_FROM_ES = "http://%s:%s/resources/artifactdata/_search?q=resourceName:%s&pretty=true&size=1000";
-	final String GET_ID_LIST_BY_INDEX_FROM_ES = "http://%s:%s/%s/%s/_search?fields=_id&size=1000";
 
-	final String ES_URL = "http://%s:%s";
-	final String GET_SERVICE_CSAR_API1 = "http://%s:%s/sdc2/rest/services/%s/%s";
-	final String GET_SERVICE_CSAR_API2 = "http://%s:%s/sdc2/rest/services/%s/%s/csar";
+	final static String SDC_HTTP_METHOD = Utils.getConfigHandleException() == null ? "http" : Utils.getConfigHandleException().getSdcHttpMethod();
+	final String AMDOCS_HTTP_METHOD = SDC_HTTP_METHOD;
 
-	final String GET_SERVICE_CSAR_FE_PROXY_API1 = "http://%s:%s/sdc1/portal/rest/services/%s/%s";
-	final String GET_CSAR_USING_SIMULATOR = "http://%s:%s/onboardingci/onbrest/onboarding-api/v1.0/vendor-software-products/packages/%s";
-	final String COPY_CSAR_USING_SIMULATOR = "http://%s:%s/onboardingci/onbrest/onboarding-api/v1.0/vendor-software-products/packages/%s/%s";
 
-	final String GET_HEALTH_CHECK_VIA_PROXY = "http://%s:%s/sdc1/rest/healthCheck";
+	final String UPLOAD_ZIP_URL = SDC_HTTP_METHOD + "://%s:%s/sdc1/rest/v1/catalog/resources";
+	final String GET_IMAGE_DATA_FROM_ES = SDC_HTTP_METHOD + "://%s:%s/resources/imagedata/_search?q=resourceName:%s&pretty=true&size=1000";
+	final String GET_SCRIPT_DATA_FROM_ES = SDC_HTTP_METHOD + "://%s:%s/resources/artifactdata/_search?q=resourceName:%s&pretty=true&size=1000";
+	final String GET_ID_LIST_BY_INDEX_FROM_ES = SDC_HTTP_METHOD + "://%s:%s/%s/%s/_search?fields=_id&size=1000";
+
+	final String ES_URL = SDC_HTTP_METHOD + "://%s:%s";
+	final String GET_SERVICE_CSAR_API1 = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/services/%s/%s";
+	final String GET_SERVICE_CSAR_API2 = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/services/%s/%s/csar";
+
+	final String GET_SERVICE_CSAR_FE_PROXY_API1 = SDC_HTTP_METHOD + "://%s:%s/sdc1/portal/rest/services/%s/%s";
+	final String GET_CSAR_USING_SIMULATOR = SDC_HTTP_METHOD + "://%s:%s/onboardingci/onbrest/onboarding-api/v1.0/vendor-software-products/packages/%s";
+	final String COPY_CSAR_USING_SIMULATOR = SDC_HTTP_METHOD + "://%s:%s/onboardingci/onbrest/onboarding-api/v1.0/vendor-software-products/packages/%s/%s";
+
+	final String GET_HEALTH_CHECK_VIA_PROXY = SDC_HTTP_METHOD + "://%s:%s/sdc1/rest/healthCheck";
 
 	// Get back-end config http://172.20.43.132:8080/sdc2/rest/configmgr/get
-	final String GET_CONFIG_MANAGER = "http://%s:%s/sdc2/rest/configmgr/get";
+	final String GET_CONFIG_MANAGER = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/configmgr/get";
 
 	// Get latest version of all non-abstract resources
-	final String GET_RESOURCE_lATEST_VERSION = "http://%s:%s/sdc2/rest/v1/catalog/resources/latestversion/notabstract";
+	final String GET_RESOURCE_lATEST_VERSION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/latestversion/notabstract";
 
-	final String GET_SERVICE_lATEST_VERSION = "http://%s:%s/sdc2/rest/v1/catalog/services/latestversion/notabstract";
+	final String GET_SERVICE_lATEST_VERSION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/latestversion/notabstract";
 
 	// Get resource artifact list:
 	// http://172.20.43.124:8080/sdc2/rest/v1/catalog/resources/alien.nodes.Apache/2.0.0-SNAPSHOT/artifacts
-	final String GET_RESOURCE_ARTIFACTS_LIST = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/artifacts";
+	final String GET_RESOURCE_ARTIFACTS_LIST = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/artifacts";
 
 	// get resource artifact metadata (creation, MD5, etc):
 	// http://172.20.43.124:8080/sdc2/rest/v1/catalog/resources/alien.nodes.Apache/2.0.0-SNAPSHOT/artifacts/install_apache.sh/metadata
-	final String GET_RESOURCE_ARTIFACT_METADATA = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/artifacts/%s/metadata";
+	final String GET_RESOURCE_ARTIFACT_METADATA = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/artifacts/%s/metadata";
 
 	// resource artifact payload:
 	// http://172.20.43.124:8080/sdc2/rest/v1/catalog/resources/alien.nodes.Apache/2.0.0-SNAPSHOT/artifacts/install_apache.sh
-	final String GET_RESOURCE_ARTIFACT_PAYLOAD = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/artifacts/%s";
+	final String GET_RESOURCE_ARTIFACT_PAYLOAD = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/artifacts/%s";
 
-	final String GET_RESOURCE_ARTIFACT_PAYLOAD_FE_PROXY = "http://%s:%s/sdc1/portal/rest/v1/catalog/resources/%s/%s/artifacts/%s";
-
-	// Get service list: http://172.20.43.124:8080/sdc2/rest/v1/catalog/services
-	final String GET_SERVICE_LIST = "http://%s:%s/sdc2/rest/v1/catalog/services";
-
-	// Get service versions:
-	// http://172.20.43.124:8080/sdc2/rest/v1/catalog/services/MyService
-	final String GET_SERVICE_VERSIONS = "http://%s:%s/sdc2/rest/v1/catalog/services/%s";
+	final String GET_RESOURCE_ARTIFACT_PAYLOAD_FE_PROXY = SDC_HTTP_METHOD + "://%s:%s/sdc1/portal/rest/v1/catalog/resources/%s/%s/artifacts/%s";
 
 	// Get service artifact list:
 	// http://172.20.43.124:8080/sdc2/rest/v1/catalog/services/alien.nodes.Apache/0.0.1/artifacts
-	final String GET_SERVICE_ARTIFACTS_LIST = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/%s/artifacts";
+	final String GET_SERVICE_ARTIFACTS_LIST = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/%s/artifacts";
 
 	// get service artifact metadata (creation, MD5, etc):
 	// http://172.20.43.124:8080/sdc2/rest/v1/catalog/services/alien.nodes.Apache/0.0.1/artifacts/install_apache.sh/metadata
-	final String GET_SERVICE_METADATA = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/%s/artifacts/%s/metadata";
+	final String GET_SERVICE_METADATA = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/%s/artifacts/%s/metadata";
 
 	// service artifact payload:
 	// http://172.20.43.124:8080/sdc2/rest/v1/catalog/services/alien.nodes.Apache/0.0.1/artifacts/install_apache.sh
-	final String GET_SERVICE_ARTIFACT_PAYLOAD = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/artifacts/%s";
+	final String GET_SERVICE_ARTIFACT_PAYLOAD = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/%s/artifacts/%s";
 
-	final String GET_SEARCH_DATA_FROM_ES = "http://%s:%s/%s";
+	final String GET_SEARCH_DATA_FROM_ES = SDC_HTTP_METHOD + "://%s:%s/%s";
 
 	// ****************************************************USER
 	// URLs********************************************************
-	final String GET_USER = "http://%s:%s/sdc2/rest/v1/user/%s";
+	final String GET_USER = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/%s";
 
-	final String GET_USER_ROLE = "http://%s:%s/sdc2/rest/v1/user/%s/role";
+	final String GET_USER_ROLE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/%s/role";
 
-	final String CREATE_USER = "http://%s:%s/sdc2/rest/v1/user";
+	final String CREATE_USER = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user";
 
-	final String UPDATE_USER = "http://%s:%s/sdc2/rest/v1/user/%s";
+	final String UPDATE_USER = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/%s";
 
-	final String UPDATE_USER_ROLE = "http://%s:%s/sdc2/rest/v1/user/%s/role";
+	final String UPDATE_USER_ROLE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/%s/role";
 
-	final String DELETE_USER = "http://%s:%s/sdc2/rest/v1/user/%s";
+	String DELETE_USER = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/%s";
 
-	final String GET_ALL_ADMIN_USERS = "http://%s:%s/sdc2/rest/v1/user/admins";
+	String GET_ALL_ADMIN_USERS = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/admins";
 
-	final String AUTHORIZE_USER = "http://%s:%s/sdc2/rest/v1/user/authorize";
+	final String AUTHORIZE_USER = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/authorize";
 
-	final String GET_ALL_TAGS = "http://%s:%s/sdc2/rest/v1/tags";
+	final String GET_ALL_TAGS = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/tags";
 
-	final String AUTH_USER = "http://%s:%s/sdc2/rest/v1/user/authorize";
+	final String AUTH_USER = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/authorize";
 
-	final String GET_ALL_NOT_ABSTRACT_RESOURCES = "http://%s:%s/sdc2/rest/v1/catalog/resources/certified/notabstract";
+	final String GET_ALL_NOT_ABSTRACT_RESOURCES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/certified/notabstract";
 
-	final String GET_ALL_ABSTRACT_RESOURCES = "http://%s:%s/sdc2/rest/v1/catalog/resources/certified/abstract";
+	final String GET_ALL_ABSTRACT_RESOURCES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/certified/abstract";
 
-	final String QUERY_NEO4J = "http://%s:%s/db/data/transaction";
-	final String CHANGE_IN_NEO4J = "http://%s:%s/db/data/transaction/commit";
+	final String QUERY_NEO4J = SDC_HTTP_METHOD + "://%s:%s/db/data/transaction";
+	final String CHANGE_IN_NEO4J = SDC_HTTP_METHOD + "://%s:%s/db/data/transaction/commit";
 
-	final String GET_ALL_ADMINS = "http://%s:%s/sdc2/rest/v1/user/admins";
+	final String GET_ALL_ADMINS = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/admins";
 
-	final String GET_USERS_BY_ROLES = "http://%s:%s/sdc2/rest/v1/user/users?roles=%s";
+	final String GET_USERS_BY_ROLES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/users?roles=%s";
 
-	final String GET_ALL_USERS = "http://%s:%s/sdc2/rest/v1/user/users?roles/";
+	final String GET_ALL_USERS = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/user/users?roles/";
 
 	// *****************************************ECOMP User
 	// URL's*****************************************************
-	final String ECOMP_PUSH_USER = "http://%s:%s/api/v2/user";
+	final String ECOMP_PUSH_USER = SDC_HTTP_METHOD + "://%s:%s/api/v2/user";
 
-	final String ECOMP_EDIT_USER = "http://%s:%s/api/v2/user/%s";
+	final String ECOMP_EDIT_USER = SDC_HTTP_METHOD + "://%s:%s/api/v2/user/%s";
 
-	final String ECOMP_GET_USER = "http://%s:%s/api/v2/user/%s";
+	final String ECOMP_GET_USER = SDC_HTTP_METHOD + "://%s:%s/api/v2/user/%s";
 
-	final String ECOMP_GET_ALL_USERS = "http://%s:%s/api/v2/users";
+	final String ECOMP_GET_ALL_USERS = SDC_HTTP_METHOD + "://%s:%s/api/v2/users";
 
-	final String ECOMP_GET_ALL_AVAILABLE_ROLES = "http://%s:%s/api/v2/roles";
+	final String ECOMP_GET_ALL_AVAILABLE_ROLES = SDC_HTTP_METHOD + "://%s:%s/api/v2/roles";
 
-	final String ECOMP_PUSH_USER_ROLES = "http://%s:%s/api/v2/user/%s/roles";
+	final String ECOMP_PUSH_USER_ROLES = SDC_HTTP_METHOD + "://%s:%s/api/v2/user/%s/roles";
 
-	final String ECOMP_GET_USER_ROLES = "http://%s:%s/api/v2/user/%s/roles";
+	final String ECOMP_GET_USER_ROLES = SDC_HTTP_METHOD + "://%s:%s/api/v2/user/%s/roles";
 
 	// *****************************************Elements*************************************************************
-	final String GET_TAGS_LIST = "http://%s:%s/sdc2/rest/v1/tags";
+	final String GET_TAGS_LIST = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/tags";
 
-	final String GET_PROPERTY_SCOPES_LIST = "http://%s:%s/sdc2/rest/v1/propertyScopes";
+	final String GET_PROPERTY_SCOPES_LIST = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/propertyScopes";
 
-	final String GET_CONFIGURATION = "http://%s:%s/sdc2/rest/v1/configuration/ui";
+	final String GET_CONFIGURATION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/configuration/ui";
 
-	final String GET_ALL_ARTIFACTS = "http://%s:%s/sdc2/rest/v1/artifactTypes";
+	final String GET_ALL_ARTIFACTS = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/artifactTypes";
 
-	final String GET_FOLLWED_LIST = "http://%s:%s/sdc2/rest/v1/followed";
+	final String GET_FOLLWED_LIST = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/followed";
 
-	final String GET_CATALOG_DATA = "http://%s:%s/sdc2/rest/v1/screen/?excludeTypes=VFCMT&excludeTypes=Configuration";
+	final String GET_CATALOG_DATA = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/screen/?excludeTypes=VFCMT&excludeTypes=Configuration";
 
 	// *****************************************Resources
 	// **********************************************************************
-	final String GET_LIST_CERTIFIED_RESOURCE_TEMPLATES = "http://%s:%s/sdc2/rest/v1/resoourceTemplates";
+	final String GET_LIST_CERTIFIED_RESOURCE_TEMPLATES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/resoourceTemplates";
 
-	final String CREATE_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources";
-	final String UPDATE_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s";
+	final String CREATE_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources";
+	final String UPDATE_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s";
 
-	final String IMPORT_RESOURCE_NORMATIVE = "http://%s:%s/sdc2/rest/v1/catalog/upload/multipart";
+	final String IMPORT_RESOURCE_NORMATIVE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/upload/multipart";
 
-	final String IMPORT_USER_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/upload/user-resource";
+	final String IMPORT_USER_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/upload/user-resource";
 
-	final String IMPORT_CAPABILITY_TYPE = "http://%s:%s/sdc2/rest/v1/catalog/uploadType/capability";
-	final String IMPORT_CATEGORIES = "http://%s:%s/sdc2/rest/v1/catalog/uploadType/categories";
-	final String IMPORT_GROUP_TYPE = "http://%s:%s/sdc2/rest/v1/catalog/uploadType/grouptypes";
+	final String IMPORT_CAPABILITY_TYPE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/uploadType/capability";
+	final String IMPORT_CATEGORIES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/uploadType/categories";
+	final String IMPORT_GROUP_TYPE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/uploadType/grouptypes";
 
 	// last %s is resourceId, resourceId = resourceName.resourceVersion
-	final String GET_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s";
-	final String GET_RESOURCE_BY_NAME_AND_VERSION = "http://%s:%s/sdc2/rest/v1/catalog/resources/resourceName/%s/resourceVersion/%s";
-	final String GET_RESOURCE_BY_CSAR_UUID = "http://%s:%s/sdc2/rest/v1/catalog/resources/csar/%s";
-	final String GET_COMPONENT_REQUIRMENTS_CAPABILITIES = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/requirmentsCapabilities";
+	final String GET_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s";
+	final String GET_RESOURCE_BY_NAME_AND_VERSION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/resourceName/%s/resourceVersion/%s";
+	final String GET_RESOURCE_BY_CSAR_UUID = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/csar/%s";
+	final String GET_COMPONENT_REQUIRMENTS_CAPABILITIES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/requirmentsCapabilities";
 
-	final String DELETE_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s";
-	final String DELETE_RESOURCE_BY_NAME_AND_VERSION = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s";
-	final String DELETE_SERVICE_BY_NAME_AND_VERSION = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/%s";
+	final String DELETE_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s";
+	final String DELETE_RESOURCE_BY_NAME_AND_VERSION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s";
+	final String DELETE_SERVICE_BY_NAME_AND_VERSION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/%s";
 
-	final String DELETE_MARKED_RESOURCES = "http://%s:%s/sdc2/rest/v1/inactiveComponents/resource";
-	final String DELETE_MARKED_SERVICES = "http://%s:%s/sdc2/rest/v1/inactiveComponents/service";
+	final String DELETE_MARKED_RESOURCES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/inactiveComponents/resource";
+	final String DELETE_MARKED_SERVICES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/inactiveComponents/service";
 
-	final String GET_FOLLOWED_RESOURCES = "http://%s:%s/sdc2/rest/v1/followed/resources/%s";
-	final String CHANGE_RESOURCE_LIFECYCLE_STATE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/lifecycleState/%s";
-	final String CHANGE_SERVICE_LIFECYCLE_STATE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/lifecycleState/%s";
-	final String CHANGE_PRODUCT_LIFECYCLE_STATE = "http://%s:%s/sdc2/rest/v1/catalog/products/%s/lifecycleState/%s";
-	final String CHANGE_COMPONENT_LIFECYCLE_STATE = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/lifecycleState/%s";
+	final String GET_FOLLOWED_RESOURCES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/followed/resources/%s";
+	final String CHANGE_RESOURCE_LIFECYCLE_STATE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/lifecycleState/%s";
+	final String CHANGE_SERVICE_LIFECYCLE_STATE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/lifecycleState/%s";
+	final String CHANGE_PRODUCT_LIFECYCLE_STATE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/products/%s/lifecycleState/%s";
+	final String CHANGE_COMPONENT_LIFECYCLE_STATE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/lifecycleState/%s";
 
-	final String CREATE_PROPERTY = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/properties";
-	final String DECLARE_PROPERTIES  = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/create/inputs";
+	final String CREATE_PROPERTY = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/properties";
+	final String DECLARE_PROPERTIES  = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/create/inputs";
+	final String UPDATE_INPUT  = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/update/inputs";
 
-	final String UPDATE_RESOURCE_METADATA = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/metadata";
+	final String UPDATE_RESOURCE_METADATA = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/metadata";
 
 	// ***********************************External API's
 	// (AssetData)****************************************
-	
-	final String DELETE_EXTRNAL_API_DELETE_ARTIFACT_OF_ASSET = "http://%s:%s/sdc/v1/catalog/%s/%s/artifacts/%s";
-	final String DELETE_EXTRNAL_API_DELETE_ARTIFACT_OF_COMPONENTINSTANCE_ON_ASSET = "http://%s:%s/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts/%s";
 
-	final String POST_EXTERNAL_API_UPDATE_ARTIFACT_OF_ASSET = "http://%s:%s/sdc/v1/catalog/%s/%s/artifacts/%s";
-	final String POST_EXTERNAL_API_UPDATE_ARTIFACT_OF_COMPONENTINSTANCE_ON_ASSET = "http://%s:%s/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts/%s";
-	
-	final String POST_EXTERNAL_API_UPLOAD_ARTIFACT_OF_ASSET = "http://%s:%s/sdc/v1/catalog/%s/%s/artifacts";
-	final String POST_EXTERNAL_API_UPLOAD_ARTIFACT_OF_COMPONENTINSTANCE_ON_ASSET  = "http://%s:%s/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts";
+	final String DELETE_EXTRNAL_API_DELETE_ARTIFACT_OF_ASSET = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s/%s/artifacts/%s";
+	final String DELETE_EXTRNAL_API_DELETE_ARTIFACT_OF_COMPONENTINSTANCE_ON_ASSET = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts/%s";
 
-	final String GET_DOWNLOAD_RESOURCE_ARTIFACT_OF_ASSET = "http://%s:%s/sdc/v1/catalog/resources/%s/artifacts/%s";
-	final String GET_DOWNLOAD_SERVICE_ARTIFACT_OF_ASSET = "http://%s:%s/sdc/v1/catalog/services/%s/artifacts/%s";
+	final String POST_EXTERNAL_API_UPDATE_ARTIFACT_OF_ASSET = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s/%s/artifacts/%s";
+	final String POST_EXTERNAL_API_UPDATE_ARTIFACT_OF_COMPONENTINSTANCE_ON_ASSET = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts/%s";
 
-	final String GET_DOWNLOAD_RESOURCE_ARTIFACT_OF_COMPONENT_INSTANCE = "http://%s:%s/sdc/v1/catalog/resources/%s/resourceInstances/%s/artifacts/%s";
-	final String GET_DOWNLOAD_SERVICE_ARTIFACT_OF_COMPONENT_INSTANCE = "http://%s:%s/sdc/v1/catalog/services/%s/resourceInstances/%s/artifacts/%s";
+	final String POST_EXTERNAL_API_UPLOAD_ARTIFACT_OF_ASSET = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s/%s/artifacts";
+	final String POST_EXTERNAL_API_UPLOAD_ARTIFACT_OF_COMPONENTINSTANCE_ON_ASSET  = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s/%s/resourceInstances/%s/artifacts";
 
-	final String GET_ASSET_LIST = "http://%s:%s/sdc/v1/catalog/%s";
-	final String GET_FILTERED_ASSET_LIST = "http://%s:%s/sdc/v1/catalog/%s?%s";
-	final String GET_TOSCA_MODEL = "http://%s:%s/sdc/v1/catalog/%s/%s/toscaModel";
+	final String GET_DOWNLOAD_RESOURCE_ARTIFACT_OF_ASSET = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/resources/%s/artifacts/%s";
+	final String GET_DOWNLOAD_SERVICE_ARTIFACT_OF_ASSET = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/services/%s/artifacts/%s";
+
+	final String GET_DOWNLOAD_RESOURCE_ARTIFACT_OF_COMPONENT_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/resources/%s/resourceInstances/%s/artifacts/%s";
+	final String GET_DOWNLOAD_SERVICE_ARTIFACT_OF_COMPONENT_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/services/%s/resourceInstances/%s/artifacts/%s";
+
+	final String GET_ASSET_LIST = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s";
+	final String GET_FILTERED_ASSET_LIST = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s?%s";
+	final String GET_TOSCA_MODEL = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s/%s/toscaModel";
 	// https://{serverRoot}/sdc/v1/catalog/{assetType}/{uuid}/metadata, where
 	// assetType in {resources, services}
-	final String GET_ASSET_METADATA = "http://%s:%s/sdc/v1/catalog/%s/%s/metadata";
-	final String POST_AUTHORIZATION = "http://%s:%s/sdc2/rest/v1/consumers";
-	final String GET_DOWNLOAD_SERVICE_RI_ARTIFACT = "http://%s:%s/sdc/v1/catalog/services/%s/resourceInstances/%s/artifacts/%s";
-	final String GET_DOWNLOAD_SERVICE_ARTIFACT = "http://%s:%s/sdc/v1/catalog/services/%s/artifacts/%s";
-	
-	final String POST_EXTERNAL_API_CREATE_RESOURCE = "http://%s:%s/sdc/v1/catalog/resources";
-	
+	final String GET_ASSET_METADATA = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s/%s/metadata";
+	final String POST_AUTHORIZATION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/consumers";
+	final String GET_DOWNLOAD_SERVICE_RI_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/services/%s/resourceInstances/%s/artifacts/%s";
+	final String GET_DOWNLOAD_SERVICE_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/services/%s/artifacts/%s";
+
+	final String POST_EXTERNAL_API_CREATE_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/resources";
+
 	// Change LifeCycle of Resource
 	// https://{serverRoot}:{port}/sdc/v1/catalog/{resources|services}/{uuid}/lifecycleState/{lifecycle state}
-	final String POST_EXTERNAL_API_CHANGE_LIFE_CYCLE_OF_ASSET = "http://%s:%s/sdc/v1/catalog/%s/%s/lifecycleState/%s";
-	
+	final String POST_EXTERNAL_API_CHANGE_LIFE_CYCLE_OF_ASSET = SDC_HTTP_METHOD + "://%s:%s/sdc/v1/catalog/%s/%s/lifecycleState/%s";
+
 
 	// *****************************************************************************************************
 
-	final String ADD_ARTIFACT_TO_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/artifacts";
-	final String UPDATE_OR_DELETE_ARTIFACT_OF_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/artifacts/%s";
-	final String ADD_ARTIFACT_TO_SERVICE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/artifacts";
-	final String UPDATE_OR_DELETE_ARTIFACT_OF_SERVICE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/artifacts/%s";
+	final String ADD_ARTIFACT_TO_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/artifacts";
+	final String UPDATE_OR_DELETE_ARTIFACT_OF_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/artifacts/%s";
+	final String ADD_ARTIFACT_TO_SERVICE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/artifacts";
+	final String UPDATE_OR_DELETE_ARTIFACT_OF_SERVICE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/artifacts/%s";
 
-	final String UPLOAD_DELETE_ARTIFACT_OF_COMPONENT = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/artifacts";
-	final String UPDATE_ARTIFACT_OF_COMPONENT = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/artifacts/%s";
-	final String UPLOAD_HEAT_ENV_ARTIFACT = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s/artifacts/%s";
+	final String UPLOAD_DELETE_ARTIFACT_OF_COMPONENT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/artifacts";
+	final String UPDATE_ARTIFACT_OF_COMPONENT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/artifacts/%s";
+	final String UPLOAD_HEAT_ENV_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s/artifacts/%s";
 	// *****************************************************************************************************
-	final String UPLOAD_ARTIFACT_BY_INTERFACE_TO_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/%s/artifacts/";
-	final String UPDATE_OR_DELETE_ARTIFACT_BY_INTERFACE_TO_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/%s/artifacts/%s";
+	final String UPLOAD_ARTIFACT_BY_INTERFACE_TO_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/%s/artifacts/";
+	final String UPDATE_OR_DELETE_ARTIFACT_BY_INTERFACE_TO_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/%s/artifacts/%s";
 
-	final String UPLOAD_ARTIFACT_BY_INTERFACE_TO_COMPONENT = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/%s/artifacts/";
-	final String UPDATE_OR_DELETE_ARTIFACT_BY_INTERFACE_TO_COMPONENT = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/%s/artifacts/%s";
+	final String UPLOAD_ARTIFACT_BY_INTERFACE_TO_COMPONENT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/%s/artifacts/";
+	final String UPDATE_OR_DELETE_ARTIFACT_BY_INTERFACE_TO_COMPONENT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/%s/%s/artifacts/%s";
 
 	// *****************************************************************************************************
 	// "/sdc2/v1/services/<serviceName>/<0.1>/artifacts/aaa.hh"
@@ -242,148 +246,150 @@
 	final String DISTRIB_DOWNLOAD_RESOURCE_ARTIFACT = "/sdc2/rest/v1/catalog/services/%s/%s/resources/%s/%s/artifacts/%s";
 	final String DISTRIB_DOWNLOAD_SERVICE_ARTIFACT_RELATIVE_URL = "/sdc/v1/catalog/services/%s/%s/artifacts/%s";
 	final String DISTRIB_DOWNLOAD_RESOURCE_ARTIFACT_RELATIVE_URL = "/sdc/v1/catalog/services/%s/%s/resources/%s/%s/artifacts/%s";
-	final String DOWNLOAD_SERVICE_ARTIFACT_FULL_URL = "http://%s:%s%s";
-	final String DOWNLOAD_RESOURCE_ARTIFACT_FULL_URL = "http://%s:%s%s";
+	final String DOWNLOAD_SERVICE_ARTIFACT_FULL_URL = SDC_HTTP_METHOD + "://%s:%s%s";
+	final String DOWNLOAD_RESOURCE_ARTIFACT_FULL_URL = SDC_HTTP_METHOD + "://%s:%s%s";
 	// **********************************************************************************
-	final String UI_DOWNLOAD_RESOURCE_ARTIFACT = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/artifacts/%s";
-	final String UI_DOWNLOAD_SERVICE_ARTIFACT = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/artifacts/%s";
+	final String UI_DOWNLOAD_RESOURCE_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/artifacts/%s";
+	final String UI_DOWNLOAD_SERVICE_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/artifacts/%s";
 
 	// **********************************************************************************************************
-	final String UPDATE_PROPERTY = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/properties/%s";
+	final String UPDATE_PROPERTY = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/properties/%s";
 
-	final String DELETE_PROPERTY = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/properties/%s";
+	final String DELETE_PROPERTY = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/properties/%s";
 
-	final String GET_PROPERTY = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/properties/%s";
+	final String GET_PROPERTY = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/properties/%s";
 
 	// *****************************************************************************************************
 
-	final String VALIDATE_RESOURCE_NAME = "http://%s:%s/sdc2/rest/v1/catalog/resources/validate-name/%s";
+	final String VALIDATE_RESOURCE_NAME = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/validate-name/%s";
 
-	final String CREATE_SERVICE = "http://%s:%s/sdc2/rest/v1/catalog/services";
-	final String DELETE_SERVICE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s";
-	final String GET_SERVICE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s";
-	final String GET_SERVICE_BY_NAME_AND_VERSION = "http://%s:%s/sdc2/rest/v1/catalog/services/serviceName/%s/serviceVersion/%s";
+	final String CREATE_SERVICE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services";
+	final String DELETE_SERVICE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s";
+	final String GET_SERVICE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s";
+	final String GET_SERVICE_BY_NAME_AND_VERSION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/serviceName/%s/serviceVersion/%s";
 
-	final String GET_SERVICES_REQUIRMENTS_CAPABILITIES = "http://%s:%s/sdc2/rest/v1/catalog/requirmentsCapabilities/services/%s";
+	final String GET_SERVICES_REQUIRMENTS_CAPABILITIES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/requirmentsCapabilities/services/%s";
 
-	final String CREATE_COMPONENT_INSTANCE = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance";
-	final String DELETE_COMPONENT_INSTANCE = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s";
-	final String UPDATE_COMPONENT_INSTANCE = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s";
-	final String GET_COMPONENT_INSTANCES = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/componentInstances";
+	final String CREATE_COMPONENT_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance";
+	final String DELETE_COMPONENT_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s";
+	final String UPDATE_COMPONENT_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s";
+	final String GET_COMPONENT_INSTANCES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/componentInstances";
 	// Tal New API
-	final String UPDATE_MULTIPLE_COMPONENT_INSTANCE = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/multipleComponentInstance";
+	final String UPDATE_MULTIPLE_COMPONENT_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/multipleComponentInstance";
 
-	final String CHANGE__RESOURCE_INSTANCE_VERSION = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s/changeVersion";
+	final String CHANGE__RESOURCE_INSTANCE_VERSION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s/changeVersion";
 
-	final String CREATE_AND_ASSOCIATE_RESOURCE_INSTANCE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/createAndAssociate";
-	final String ASSOCIATE__RESOURCE_INSTANCE = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/associate";
-	final String DISSOCIATE__RESOURCE_INSTANCE = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/dissociate";
+	final String CREATE_AND_ASSOCIATE_RESOURCE_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/createAndAssociate";
+	final String ASSOCIATE__RESOURCE_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/associate";
+	final String DISSOCIATE__RESOURCE_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/dissociate";
 
-	final String DISTRIBUTION_INIT = "http://%s:%s/init";
-	final String DISTRIBUTION_INIT_RESET = "http://%s:%s/initReset";
-	final String APPROVE_DISTRIBUTION = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/distribution-state/approve";
-	final String REJECT_DISTRIBUTION = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/distribution-state/reject";
-	final String DISTRIBUTION_DOWNLOAD_ARTIFACT = "http://%s:%s/download";
-	final String ACTIVATE_DISTRIBUTION = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/distribution/%s/activate";
-	final String DISTRIBUTION_SERVICE_LIST = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/distribution";
-	final String DISTRIBUTION_SERVICE_MONITOR = "http://%s:%s/sdc2/rest/v1/catalog/services/distribution/%s";
+	final String DISTRIBUTION_INIT = SDC_HTTP_METHOD + "://%s:%s/init";
+	final String DISTRIBUTION_INIT_RESET = SDC_HTTP_METHOD + "://%s:%s/initReset";
+	final String APPROVE_DISTRIBUTION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/distribution-state/approve";
+	final String REJECT_DISTRIBUTION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/distribution-state/reject";
+	final String DISTRIBUTION_DOWNLOAD_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/download";
+	final String ACTIVATE_DISTRIBUTION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/distribution/%s/activate";
+	final String DISTRIBUTION_SERVICE_LIST = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/distribution";
+	final String DISTRIBUTION_SERVICE_MONITOR = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/distribution/%s";
 
-	final String DEPLOY_SERVICE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/distribution/%s/markDeployed";
-	final String UPDATE_SERVICE_METADATA = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/metadata";
+	final String DEPLOY_SERVICE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/distribution/%s/markDeployed";
+	final String UPDATE_SERVICE_METADATA = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/metadata";
 
 	// Andrey changed name from ADD_PROPERTY_TO_RESOURCE_INSTANCE to
 	// UPDATE_PROPERTY_TO_RESOURCE_INSTANCE
-	final String UPDATE_PROPERTY_TO_RESOURCE_INSTANCE = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s/property";
-	final String DELETE_PROPERTY_FROM_RESOURCE_INSTANCE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/%s/property/%s";
-	final String UPDATE_RESOURCE_INSTANCE_HEAT_ENV_PARAMS = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/%s/artifacts/%s/heatParams";
+	final String UPDATE_PROPERTY_TO_RESOURCE_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s/property";
+	final String DELETE_PROPERTY_FROM_RESOURCE_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/%s/property/%s";
+	final String UPDATE_RESOURCE_INSTANCE_HEAT_ENV_PARAMS = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/%s/artifacts/%s/heatParams";
 
 	// Actions on artifact in resource instance
-	final String ADD_RESOURCE_INSTANCE_ARTIFACT = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/%s/artifacts";
-	final String UPDATE_RESOURCE_INSTANCE_ARTIFACT = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/%s/artifacts/%s";
-	final String DELETE_RESOURCE_INSTANCE_ARTIFACT = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/%s/artifacts/%s";
+	final String ADD_RESOURCE_INSTANCE_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/%s/artifacts";
+	final String UPDATE_RESOURCE_INSTANCE_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/%s/artifacts/%s";
+	final String DELETE_RESOURCE_INSTANCE_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstance/%s/artifacts/%s";
 
 	// Attributes On Resource instance
-	public static final String UPDATE_ATTRIBUTE_ON_RESOURCE_INSTANCE = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s/attribute";
+	public static final String UPDATE_ATTRIBUTE_ON_RESOURCE_INSTANCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/resourceInstance/%s/attribute";
 
 	// ("/services/{serviceId}/resourceInstances/{resourceInstanceId}/artifacts/{artifactId}")
-	final String DOWNLOAD_COMPONENT_INSTANCE_ARTIFACT = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstances/%s/artifacts/%s";
+	final String DOWNLOAD_COMPONENT_INSTANCE_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/resourceInstances/%s/artifacts/%s";
 
 	// -------------------------------service api
 	// artifact-----------------------------------------------------
-	final String UPDATE_DELETE_SERVICE_API_ARTIFACT = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/artifacts/api/%s";
+	final String UPDATE_DELETE_SERVICE_API_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/artifacts/api/%s";
 
-	final String CREATE_ADDITIONAL_INFORMATION_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/additionalinfo";
-	final String UPDATE_ADDITIONAL_INFORMATION_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/additionalinfo/%s";
+	final String CREATE_ADDITIONAL_INFORMATION_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/additionalinfo";
+	final String UPDATE_ADDITIONAL_INFORMATION_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/additionalinfo/%s";
 	final String DELETE_ADDITIONAL_INFORMATION_RESOURCE = UPDATE_ADDITIONAL_INFORMATION_RESOURCE;
-	final String GET_ADDITIONAL_INFORMATION_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/additionalinfo/%s";
-	final String GET_ALL_ADDITIONAL_INFORMATION_RESOURCE = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/additionalinfo";
+	final String GET_ADDITIONAL_INFORMATION_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/additionalinfo/%s";
+	final String GET_ALL_ADDITIONAL_INFORMATION_RESOURCE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/additionalinfo";
 
-	final String CREATE_ADDITIONAL_INFORMATION_SERVICE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/additionalinfo";
-	final String UPDATE_ADDITIONAL_INFORMATION_SERVICE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/additionalinfo/%s";
+	final String CREATE_ADDITIONAL_INFORMATION_SERVICE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/additionalinfo";
+	final String UPDATE_ADDITIONAL_INFORMATION_SERVICE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/additionalinfo/%s";
 	final String DELETE_ADDITIONAL_INFORMATION_SERVICE = UPDATE_ADDITIONAL_INFORMATION_SERVICE;
-	final String GET_ADDITIONAL_INFORMATION_SERVICE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/additionalinfo/%s";
-	final String GET_ALL_ADDITIONAL_INFORMATION_SERVICE = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/additionalinfo";
+	final String GET_ADDITIONAL_INFORMATION_SERVICE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/additionalinfo/%s";
+	final String GET_ALL_ADDITIONAL_INFORMATION_SERVICE = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/additionalinfo";
 
-	final String GET_COMPONENT_AUDIT_RECORDS = "http://%s:%s/sdc2/rest/v1/catalog/audit-records/%s/%s";
+	final String GET_COMPONENT_AUDIT_RECORDS = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/audit-records/%s/%s";
 
 	// CONSUMER
-	final String CREATE_CONSUMER = "http://%s:%s/sdc2/rest/v1/consumers";
-	final String GET_CONSUMER = "http://%s:%s/sdc2/rest/v1/consumers/%s";
-	final String DELETE_CONSUMER = "http://%s:%s/sdc2/rest/v1/consumers/%s";
+	final String CREATE_CONSUMER = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/consumers";
+	final String GET_CONSUMER = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/consumers/%s";
+	final String DELETE_CONSUMER = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/consumers/%s";
 
 	// Categories
-	final String CREATE_CATEGORY = "http://%s:%s/sdc2/rest/v1/category/%s";
-	final String GET_ALL_CATEGORIES = "http://%s:%s/sdc2/rest/v1/categories/%s";
-	final String GET_ALL_CATEGORIES_FE = "http://%s:%s/sdc1/feProxy/rest/v1/categories/%s";
-	final String DELETE_CATEGORY = "http://%s:%s/sdc2/rest/v1/category/%s/%s";
-	final String CREATE_SUB_CATEGORY = "http://%s:%s/sdc2/rest/v1/category/%s/%s/subCategory";
-	final String DELETE_SUB_CATEGORY = "http://%s:%s/sdc2/rest/v1/category/%s/%s/subCategory/%s";
-	final String CREATE_GROUPING = "http://%s:%s/sdc2/rest/v1/category/%s/%s/subCategory/%s/grouping";
-	final String DELETE_GROUPING = "http://%s:%s/sdc2/rest/v1/category/%s/%s/subCategory/%s/grouping/%s";
+	final String CREATE_CATEGORY = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/category/%s";
+	final String GET_ALL_CATEGORIES = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/categories/%s";
+	final String GET_ALL_CATEGORIES_FE = SDC_HTTP_METHOD + "://%s:%s/sdc1/feProxy/rest/v1/categories/%s";
+	final String DELETE_CATEGORY = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/category/%s/%s";
+	final String CREATE_SUB_CATEGORY = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/category/%s/%s/subCategory";
+	final String DELETE_SUB_CATEGORY = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/category/%s/%s/subCategory/%s";
+	final String CREATE_GROUPING = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/category/%s/%s/subCategory/%s/grouping";
+	final String DELETE_GROUPING = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/category/%s/%s/subCategory/%s/grouping/%s";
 
 	// product
-	final String CREATE_PRODUCT = "http://%s:%s/sdc2/rest/v1/catalog/products";
-	final String DELETE_PRODUCT = "http://%s:%s/sdc2/rest/v1/catalog/products/%s";
+	final String CREATE_PRODUCT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/products";
+	final String DELETE_PRODUCT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/products/%s";
 	// last %s is resourceId, productId
-	final String GET_PRODUCT = "http://%s:%s/sdc2/rest/v1/catalog/products/%s";
-	final String UPDATE_PRODUCT = "http://%s:%s/sdc2/rest/v1/catalog/products/%s/metadata";
-	final String GET_PRODUCT_BY_NAME_AND_VERSION = "http://%s:%s/sdc2/rest/v1/catalog/products/productName/%s/productVersion/%s";
+	final String GET_PRODUCT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/products/%s";
+	final String UPDATE_PRODUCT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/products/%s/metadata";
+	final String GET_PRODUCT_BY_NAME_AND_VERSION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/products/productName/%s/productVersion/%s";
 
 	// groups
-	final String GET_GROUP_BY_ID = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/groups/%s";
-
+	final String GET_GROUP_BY_ID = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/groups/%s";
+	//module property
+	final String RESOURCE_GROUP_PROPERTY = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/groups/%s/properties";
 	// modules
-	final String GET_MODULE_BY_ID = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/groups/%s";
-	
+	final String GET_MODULE_BY_ID = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/groups/%s";
+
 	// inputs
-	final String ADD_INPUTS = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/create/inputs"; //{componentType}/{componentId}/create/inputs
-	final String DELETE_INPUT_BY_ID = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/delete/%s/input"; //{componentType}/{componentId}/delete/{inputId}/input
-	final String GET_COMPONENT_INPUTS = "http://%s:%s/sdc2/rest/v1/catalog/services/%s/inputs"; //services/{componentId}/inputs
-	final String GET_COMPONENT_INSTANCE_INPUTS = "http://%s:%s/sdc2/rest/v1/catalog/%s/%s/componentInstances/%s/%s/inputs"; //{componentType}/{componentId}/componentInstances/{instanceId}/{originComonentUid}/inputs
-	final String GET_INPUTS_FOR_COMPONENT_INPUT = "http://%s:%s/sdc2/rest/v1/catalog/resources/%s/groups/%s"; //{componentType}/{componentId}/inputs/{inputId}/inputs
+	final String ADD_INPUTS = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/create/inputs"; //{componentType}/{componentId}/create/inputs
+	final String DELETE_INPUT_BY_ID = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/delete/%s/input"; //{componentType}/{componentId}/delete/{inputId}/input
+	final String GET_COMPONENT_INPUTS = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/services/%s/inputs"; //services/{componentId}/inputs
+	final String GET_COMPONENT_INSTANCE_INPUTS = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/%s/%s/componentInstances/%s/%s/inputs"; //{componentType}/{componentId}/componentInstances/{instanceId}/{originComonentUid}/inputs
+	final String GET_INPUTS_FOR_COMPONENT_INPUT = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/v1/catalog/resources/%s/groups/%s"; //{componentType}/{componentId}/inputs/{inputId}/inputs
 
 	// check version
-	final String ONBOARD_VERSION = "http://%s:%s/onboarding-api/docs/build-info.json";
-	final String OS_VERSION = "http://%s:%s/sdc2/rest/version";
-	
+	final String ONBOARD_VERSION = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/docs/build-info.json";
+	final String OS_VERSION = SDC_HTTP_METHOD + "://%s:%s/sdc2/rest/version";
+
 //	amdocs APIs
-	final String GET_VENDOR_SOFTWARE_PRODUCT = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/packages/%s";
-	final String UPLOAD_SNMP_POLL_ARTIFACT = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/0.1/components/%s/uploads/types/SNMP_POLL";
-	final String UPLOAD_SNMP_TRAP_ARTIFACT = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/0.1/components/%s/uploads/types/SNMP_TRAP";
-	final String UPLOAD_VES_EVENTS_ARTIFACT = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/0.1/components/%s/uploads/types/VES_EVENTS";
-	final String UPLOAD_AMDOCS_ARTIFACT = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/0.1/components/%s/uploads/types/%s";
-	final String DELETE_AMDOCS_ARTIFACT_BY_TYPE = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/0.1/components/%s/monitors/%s";
-	final String GET_VSP_COMPONENTS = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/0.1/components";
-	final String CREATE_VENDOR_LISENCE_MODELS = "http://%s:%s/onboarding-api/v1.0/vendor-license-models";
-	final String CREATE_VENDOR_LISENCE_AGREEMENT = "http://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/versions/0.1/license-agreements";
-	final String CREATE_VENDOR_LISENCE_FEATURE_GROUPS = "http://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/versions/0.1/feature-groups";
-	final String CREATE_VENDOR_LISENCE_ENTITLEMENT_POOL = "http://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/versions/0.1/entitlement-pools";
-	final String CREATE_VENDOR_LISENCE_KEY_GROUPS = "http://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/versions/0.1/license-key-groups";
-	final String CREATE_VENDOR_SOFTWARE_PRODUCT = "http://%s:%s/onboarding-api/v1.0/vendor-software-products";
-	final String VALIDATE_UPLOAD = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/0.1/orchestration-template-candidate/process";
-	final String UPLOAD_HEAT_PACKAGE = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s/orchestration-template-candidate";
-	final String ACTION_ON_COMPONENT = "http://%s:%s/onboarding-api/v1.0/%s/%s/versions/%s/actions";
-	final String UPDATE_VSP = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s";
-	final String GET_VSP_COMPONENT_BY_VERSION = "http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s";
-	final String GET_VLM_COMPONENT_BY_VERSION = "http://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/versions/%s";
+	final String GET_VENDOR_SOFTWARE_PRODUCT = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/packages/%s";
+	final String UPLOAD_SNMP_POLL_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s/components/%s/uploads/types/SNMP_POLL";
+	final String UPLOAD_SNMP_TRAP_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s/components/%s/uploads/types/SNMP_TRAP";
+	final String UPLOAD_VES_EVENTS_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s/components/%s/uploads/types/VES_EVENTS";
+	final String UPLOAD_AMDOCS_ARTIFACT = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s/components/%s/uploads/types/%s";
+	final String DELETE_AMDOCS_ARTIFACT_BY_TYPE = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s/components/%s/monitors/%s";
+	final String GET_VSP_COMPONENTS = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s/components";
+	final String CREATE_VENDOR_LISENCE_MODELS = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-license-models";
+	final String CREATE_VENDOR_LISENCE_AGREEMENT = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/versions/%s/license-agreements";
+	final String CREATE_VENDOR_LISENCE_FEATURE_GROUPS = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/versions/%s/feature-groups";
+	final String CREATE_VENDOR_LISENCE_ENTITLEMENT_POOL = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/versions/%s/entitlement-pools";
+	final String CREATE_VENDOR_LISENCE_KEY_GROUPS = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/versions/%s/license-key-groups";
+	final String CREATE_METHOD = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/%s/%s/versions/%s/";
+	final String CREATE_VENDOR_SOFTWARE_PRODUCT = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products";
+	final String VALIDATE_UPLOAD = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s/orchestration-template-candidate/process";
+	final String UPLOAD_HEAT_PACKAGE = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s/orchestration-template-candidate";
+	final String ACTION_ON_COMPONENT = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/%s/%s/versions/%s/actions";
+	final String UPDATE_VSP = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s";
+	final String GET_VSP_COMPONENT_BY_VERSION = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/%s";
+	final String GET_VLM_COMPONENT_BY_VERSION = SDC_HTTP_METHOD + "://%s:%s/onboarding-api/v1.0/vendor-license-models/%s/versions/%s";
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/config/Config.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/config/Config.java
index 7bb4602..590297e 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/config/Config.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/config/Config.java
@@ -92,7 +92,17 @@
 	private String windowsDownloadDirectory;
 	private boolean captureTraffic;
 	private boolean useBrowserMobProxy;
-	
+	private String sdcHttpMethod;
+	private String localDataCenter;
+
+	public String getLocalDataCenter() {
+		return localDataCenter;
+	}
+
+	public void setLocalDataCenter(String localDataCenter) {
+		this.localDataCenter = localDataCenter;
+	}
+
 	private static Config configIt = null;
 
 	private static Yaml yaml = new Yaml();
@@ -150,6 +160,8 @@
 		if (configFile == null) {
 			if (System.getProperty("os.name").contains("Windows")) {
 				configFile = WINDOWS_CONFIG_FILE;
+			} else if (System.getProperty("os.name").contains("Mac")) {
+				configFile = WINDOWS_CONFIG_FILE;
 			} else {
 				throw new RuntimeException("Please Add Jvm Argument config.resource");
 			}
@@ -246,6 +258,14 @@
 		this.systemUnderDebug = systemUnderDebug;
 	}
 
+	public String getSdcHttpMethod() {
+		return sdcHttpMethod;
+	}
+
+	public void setSdcHttpMethod(String sdcHttpMethod) {
+		this.sdcHttpMethod = sdcHttpMethod;
+	}
+
 	public boolean getRerun() {
 		return rerun;
 	}
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/dataProviders/OnbordingDataProviders.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/dataProviders/OnbordingDataProviders.java
index 8a9171e..58a11b0 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/dataProviders/OnbordingDataProviders.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/dataProviders/OnbordingDataProviders.java
@@ -1,14 +1,15 @@
 package org.openecomp.sdc.ci.tests.dataProviders;
 
-import static org.testng.Assert.assertFalse;
+import org.openecomp.sdc.ci.tests.utils.general.FileHandling;
+import org.openecomp.sdc.ci.tests.utils.general.OnboardingUtils;
+import org.testng.annotations.DataProvider;
+
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import org.openecomp.sdc.ci.tests.utils.general.FileHandling;
-import org.openecomp.sdc.ci.tests.utils.general.OnboardingUtils;
-import org.testng.annotations.DataProvider;
+import static org.testng.Assert.assertFalse;
 
 public class OnbordingDataProviders {
 
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/GroupHeatMetaDefinition.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/GroupHeatMetaDefinition.java
index 03bedd6..5ebb260 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/GroupHeatMetaDefinition.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/GroupHeatMetaDefinition.java
@@ -28,6 +28,8 @@
 public class GroupHeatMetaDefinition {
 
 	private int group = 0;
+	private String groupName;
+
 //	private List<String> artifactList = new ArrayList<String>();
 	private List<HeatMetaFirstLevelDefinition> artifactList = new ArrayList<HeatMetaFirstLevelDefinition>();
 	@Override
@@ -75,7 +77,15 @@
 		this.group = group;
 	}
 
-//	public List<String> getArtifactList() {
+	public String getGroupName() {
+		return groupName;
+	}
+
+	public void setGroupName(String groupName) {
+		this.groupName = groupName;
+	}
+
+	//	public List<String> getArtifactList() {
 //		return artifactList;
 //	}
 //
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/ImportReqDetails.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/ImportReqDetails.java
index 0089eec..e7899ee 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/ImportReqDetails.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/ImportReqDetails.java
@@ -36,7 +36,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.codehaus.jettison.json.JSONArray;
 import org.codehaus.jettison.json.JSONException;
 import org.openecomp.sdc.be.model.User;
@@ -45,6 +45,8 @@
 import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
 import org.yaml.snakeyaml.Yaml;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 public class ImportReqDetails extends ResourceReqDetails {
 
 	private String payloadName;
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/PropertyObject.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/PropertyObject.java
new file mode 100644
index 0000000..9fea62b
--- /dev/null
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/PropertyObject.java
@@ -0,0 +1,90 @@
+package org.openecomp.sdc.ci.tests.datatypes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PropertyObject {
+
+    private String defaultValue;
+    private String name;
+    private String parentUniqueId;
+    private boolean password;
+    private boolean required;
+    private List<Schema> Schema;
+    private String type;
+    private String uniqueId;
+    private boolean definition;
+    private Object value = null;
+
+
+    public PropertyObject() {
+    }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public void setValue(Object value) {
+        this.value = value;
+    }
+
+    public PropertyObject(String defaultValue, String name, String parentUniqueId, String uniqueId) {
+        this.defaultValue = defaultValue;
+        this.name = name;
+        this.parentUniqueId = parentUniqueId;
+        this.uniqueId = uniqueId;
+        this.password = false;
+        this.required = false;
+        this.type = "String";
+        this.definition = false;
+        this.Schema = new ArrayList<Schema>();
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getParentUniqueId() {
+        return parentUniqueId;
+    }
+
+    public void setParentUniqueId(String parentUniqueId) {
+        this.parentUniqueId = parentUniqueId;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getUniqueId() {
+        return uniqueId;
+    }
+
+    public void setUniqueId(String uniqueId) {
+        this.uniqueId = uniqueId;
+    }
+}
+
+class Schema {
+
+    private List<Property> property;
+}
+
+class Property {}
+
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/ResourceReqDetails.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/ResourceReqDetails.java
index 5a80fd1..e3517a8 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/ResourceReqDetails.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/ResourceReqDetails.java
@@ -29,7 +29,11 @@
 	List<String> derivedFrom;
 	String vendorName;
 	String vendorRelease;
+	String componentType = "RESOURCE";
 
+	public String getComponentType() {
+		return componentType;
+	}
 	// Unsettable/unupdatable fields
 
 	Boolean isAbstract;
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/VendorSoftwareProductObject.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/VendorSoftwareProductObject.java
index 8b40210..a6aba7f 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/VendorSoftwareProductObject.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/VendorSoftwareProductObject.java
@@ -16,8 +16,8 @@
 		this.version = version;
 	}
 
-	public VendorSoftwareProductObject(String name, String description, String category, String subCategory, String vendorId, String vendorName, LicensingVersion licensingVersion, LicensingData licensingData, String onboardingMethod, String networkPackageName, String onboardingOrigin, String vspId, String componentId, String attContact, String version) {
-		super(name, description, category, subCategory, vendorId, vendorName, licensingVersion, licensingData, onboardingMethod, networkPackageName, onboardingOrigin);
+	public VendorSoftwareProductObject(String name, String description, String category, String subCategory, String vendorId, String vendorName, String licensingVersion, LicensingData licensingData, String onboardingMethod, String networkPackageName, String onboardingOrigin, String icon, String vspId, String componentId, String attContact, String version) {
+		super(name, description, category, subCategory, vendorId, vendorName, licensingVersion, licensingData, onboardingMethod, networkPackageName, onboardingOrigin, icon);
 		this.vspId = vspId;
 		this.componentId = componentId;
 		this.attContact = attContact;
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/VendorSoftwareProductObjectReqDetails.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/VendorSoftwareProductObjectReqDetails.java
index 10093c2..459bfaa 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/VendorSoftwareProductObjectReqDetails.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/VendorSoftwareProductObjectReqDetails.java
@@ -8,11 +8,14 @@
     private String subCategory;
     private String vendorId;
     private String vendorName;
-    private LicensingVersion licensingVersion;
+//    private LicensingVersion licensingVersion;
+    private String licensingVersion;
     private LicensingData licensingData;
     private String onboardingMethod;
     private String networkPackageName;
     private String onboardingOrigin;
+    private String icon;
+
 
     public String getIcon() {
         return icon;
@@ -22,12 +25,10 @@
         this.icon = icon;
     }
 
-    private String icon;
-
     public VendorSoftwareProductObjectReqDetails() {
     }
 
-    public VendorSoftwareProductObjectReqDetails(String name, String description, String category, String subCategory, String vendorId, String vendorName, LicensingVersion licensingVersion, LicensingData licensingData, String onboardingMethod, String networkPackageName, String onboardingOrigin) {
+    public VendorSoftwareProductObjectReqDetails(String name, String description, String category, String subCategory, String vendorId, String vendorName, String licensingVersion, LicensingData licensingData, String onboardingMethod, String networkPackageName, String onboardingOrigin, String icon) {
         this.name = name;
         this.description = description;
         this.category = category;
@@ -39,6 +40,15 @@
         this.onboardingMethod = onboardingMethod;
         this.networkPackageName = networkPackageName;
         this.onboardingOrigin = onboardingOrigin;
+        this.icon = icon;
+    }
+
+    public String getLicensingVersion() {
+        return licensingVersion;
+    }
+
+    public void setLicensingVersion(String licensingVersion) {
+        this.licensingVersion = licensingVersion;
     }
 
     public String getName() {
@@ -89,13 +99,13 @@
         this.vendorName = vendorName;
     }
 
-    public LicensingVersion getLicensingVersion() {
-        return licensingVersion;
-    }
-
-    public void setLicensingVersion(LicensingVersion licensingVersion) {
-        this.licensingVersion = licensingVersion;
-    }
+//    public LicensingVersion getLicensingVersion() {
+//        return licensingVersion;
+//    }
+//
+//    public void setLicensingVersion(LicensingVersion licensingVersion) {
+//        this.licensingVersion = licensingVersion;
+//    }
 
     public LicensingData getLicensingData() {
         return licensingData;
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/GroupPropertyEnum.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/GroupPropertyEnum.java
new file mode 100644
index 0000000..4651995
--- /dev/null
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/GroupPropertyEnum.java
@@ -0,0 +1,46 @@
+package org.openecomp.sdc.ci.tests.datatypes.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public enum GroupPropertyEnum {
+
+    IS_BASE("isBase"),
+    MIN_VF_MODULE_INSTANCES("min_vf_module_instances"),
+    MAX_VF_MODULE_INSTANCES("max_vf_module_instances"),
+    VF_MODULE_LABEL("vf_module_label"),
+    VFC_LIST("vfc_list"),
+    VF_MODULE_TYPE("vf_module_type"),
+    VF_MODULE_DESCRIPTION("vf_module_description"),
+    INITIAL_COUNT("initial_count"),
+    VOLUME_GROUP("volume_group"),
+    AVAILABILITY_ZONE_COUNT("availability_zone_count");
+
+    private String propertyName;
+
+    GroupPropertyEnum(String propertyName) {
+        this.propertyName = propertyName;
+    }
+
+    public String getPropertyName() {
+        return propertyName;
+    }
+
+    public static List<String> getGroupPropertyNamesWithoutIsbase(){
+        List<String> groupPropertyNames = new ArrayList<>();
+
+        for(GroupPropertyEnum groupProperty : GroupPropertyEnum.values()) {
+            if (!groupProperty.getPropertyName().equals(GroupPropertyEnum.IS_BASE)){
+                groupPropertyNames.add(groupProperty.getPropertyName());
+            }
+        }
+        return groupPropertyNames;
+    }
+
+    public static List<String> getGroupPropertyNames(){
+        List<String> groupPropertyNames = GroupPropertyEnum.getGroupPropertyNamesWithoutIsbase();
+        groupPropertyNames.add(GroupPropertyEnum.IS_BASE.getPropertyName());
+        return groupPropertyNames;
+    }
+
+}
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/ResourceCategoryEnum.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/ResourceCategoryEnum.java
index 1ba6c5c..a0b13b7 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/ResourceCategoryEnum.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/ResourceCategoryEnum.java
@@ -20,6 +20,11 @@
 
 package org.openecomp.sdc.ci.tests.datatypes.enums;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+
 import java.util.Random;
 
 public enum ResourceCategoryEnum {
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/UserRoleEnum.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/UserRoleEnum.java
index 20a4b12..aa70c37 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/UserRoleEnum.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/enums/UserRoleEnum.java
@@ -26,7 +26,7 @@
 //	GOVERNOR("gv0001","David", "Shadmi"), OPS("op0001", "Steve", "Regev"), PRODUCT_STRATEGIST1("ps0001", "Eden","Rozin"), PRODUCT_STRATEGIST2("ps0002", "Ella", "Kvetny"), PRODUCT_STRATEGIST3("ps0003", "Geva", "Alon"), 
 //	PRODUCT_MANAGER1("pm0001", "Teddy", "Isashar"), PRODUCT_MANAGER2("pm0002", "Sarah", "Bettens");
 	ADMIN("jh0003", "Jimmy", "Hendrix"), DESIGNER("m08740", "Zero", "ASDCMech"), DESIGNER2("me0009", "Melissa","Etheridge"), DESIGNER3("cs0008", "Carlos", "Santana"),TESTER("jm0007", "Johnny", "Depp"), ADMIN4("km2000", "Kot", "May"),
-	GOVERNOR("gv0001","David", "Shadmi"), OPS("op0001", "Aretha", "Franklin"), PRODUCT_STRATEGIST1("ps0001", "Eden","Rozin"), PRODUCT_STRATEGIST2("ps0002", "Ella", "Kvetny"), PRODUCT_STRATEGIST3("ps0003", "Geva", "Alon"), 
+	GOVERNOR("gv0001","David", "Shadmi"), OPS("af0006", "Aretha", "Franklin"), PRODUCT_STRATEGIST1("ps0001", "Eden","Rozin"), PRODUCT_STRATEGIST2("ps0002", "Ella", "Kvetny"), PRODUCT_STRATEGIST3("ps0003", "Geva", "Alon"),
 	PRODUCT_MANAGER1("pm0001", "Teddy", "Isashar"), PRODUCT_MANAGER2("pm0002", "Sarah", "Bettens");
 	private String userId;
 	private String firstName;
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/http/HttpRequest.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/http/HttpRequest.java
index a8ca77d..2435b10 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/http/HttpRequest.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/datatypes/http/HttpRequest.java
@@ -20,24 +20,6 @@
 
 package org.openecomp.sdc.ci.tests.datatypes.http;
 
-import java.io.BufferedReader;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.StringWriter;
-import java.net.HttpURLConnection;
-import java.net.URI;
-import java.net.URL;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Scanner;
-
-import javax.net.ssl.HttpsURLConnection;
-
-import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.io.IOUtils;
 import org.apache.http.HttpEntity;
 import org.apache.http.annotation.NotThreadSafe;
@@ -45,23 +27,29 @@
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
 import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.entity.mime.MultipartEntityBuilder;
-import org.apache.http.entity.mime.content.FileBody;
-import org.apache.http.entity.mime.content.StringBody;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
+import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import sun.net.www.protocol.https.DefaultHostnameVerifier;
 
-import com.google.gson.Gson;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 public class HttpRequest {
 	static Logger logger = LoggerFactory.getLogger(HttpRequest.class.getName());
-	
-	public RestResponse httpSendGet(String url, Map<String, String> headers) throws IOException {
+
+//	-----------------------------Http------------------------------------------------------------------------
+	public RestResponse httpSendGetInternal(String url, Map<String, String> headers) throws IOException {
 
 		RestResponse restResponse = new RestResponse();
 		url = url.replaceAll("\\s", "%20");
@@ -69,15 +57,7 @@
 		HttpURLConnection con = (HttpURLConnection) obj.openConnection();
 		// optional default is GET
 		con.setRequestMethod("GET");
-		// add request header
-		if (headers != null) {
-			for (Entry<String, String> header : headers.entrySet()) {
-				String key = header.getKey();
-				String value = header.getValue();
-				con.setRequestProperty(key, value);
-			}
-
-		}
+		addHttpRequestHEaders(headers, con);
 
 		int responseCode = con.getResponseCode();
 		logger.debug("Send GET http request, url: {}",url);
@@ -85,130 +65,40 @@
 
 		StringBuffer response = new StringBuffer();
 		String result;
-
 		try {
 
 			result = IOUtils.toString(con.getInputStream());
 			response.append(result);
-
-		} catch (Exception e) {			
+		} catch (Exception e) {
+			logger.debug("Fail with exception", e);
 		}
-
 		try {
-
 			result = IOUtils.toString(con.getErrorStream());
 			response.append(result);
-
 		} catch (Exception e) {
+//			logger.debug("Fail with exception", e);
 		}
 
 		logger.debug("Response body: {}" ,response);
 
 		// print result
-
-		restResponse.setErrorCode(responseCode);
-
-		if (response != null) {
-			restResponse.setResponse(response.toString());
-		}
-
-		restResponse.setErrorCode(responseCode);
-		Map<String, List<String>> headerFields = con.getHeaderFields();
-		restResponse.setHeaderFields(headerFields);
-		String responseMessage = con.getResponseMessage();
-		restResponse.setResponseMessage(responseMessage);
-
+		setHttpResponseToObject(restResponse, con, responseCode, response);
 		con.disconnect();
 
 		return restResponse;
 	}
 
-	public RestResponse httpsSendGet(String url, Map<String, String> headers) throws IOException {
-
-		RestResponse restResponse = new RestResponse();
-		URL obj = new URL(url);
-		HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
-		// optional default is GET
-		con.setRequestMethod("GET");
-		// add request header
-		if (headers != null) {
-			for (Entry<String, String> header : headers.entrySet()) {
-				String key = header.getKey();
-				String value = header.getValue();
-				con.setRequestProperty(key, value);
-			}
-
-		}
-
-		int responseCode = con.getResponseCode();
-		logger.debug("Send GET http request, url: {}",url);
-		logger.debug("Response Code: {}",responseCode);
-
-		StringBuffer response = new StringBuffer();
-		try {
-			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
-			String inputLine;
-			while ((inputLine = in.readLine()) != null) {
-				response.append(inputLine);
-			}
-			in.close();
-		} catch (Exception e) {
-			logger.debug("response body is null");
-		}
-
-		String result;
-
-		try {
-
-			result = IOUtils.toString(con.getErrorStream());
-			response.append(result);
-
-		} catch (Exception e2) {
-			// result = null;
-		}
-		logger.debug("Response body: {}",response);
-
-		// print result
-
-		restResponse.setErrorCode(responseCode);
-
-		if (response != null) {
-			restResponse.setResponse(response.toString());
-		}
-
-		restResponse.setErrorCode(responseCode);
-		// restResponse.setResponse(result);
-		Map<String, List<String>> headerFields = con.getHeaderFields();
-		restResponse.setHeaderFields(headerFields);
-		String responseMessage = con.getResponseMessage();
-		restResponse.setResponseMessage(responseMessage);
-
-		con.disconnect();
-
-		return restResponse;
-	}
-
-	public RestResponse httpSendByMethod(String url, String method, String body, Map<String, String> headers)
-			throws IOException {
+	public RestResponse httpSendByMethodInternal(String url, String method, String body, Map<String, String> headers) throws IOException {
 
 		RestResponse restResponse = new RestResponse();
 		URL obj = new URL(url);
 		HttpURLConnection con = (HttpURLConnection) obj.openConnection();
-
-		// add request method
+// add request method
 		con.setRequestMethod(method);
-
-		// add request headers
-		if (headers != null) {
-			for (Entry<String, String> header : headers.entrySet()) {
-				String key = header.getKey();
-				String value = header.getValue();
-				con.setRequestProperty(key, value);
-			}
-
-		}
+// add request headers
+		addHttpRequestHEaders(headers, con);
 		if (body != null && !body.isEmpty() && !method.equals("DELETE")) {
-			// Send post request
+// Send post request
 			con.setDoOutput(true);
 			DataOutputStream wr = new DataOutputStream(con.getOutputStream());
 			wr.writeBytes(body);
@@ -216,542 +106,69 @@
 			wr.close();
 		}
 
-		// con.connect();
-
 		int responseCode = con.getResponseCode();
 		logger.debug("Send {} http request, url: {}",method,url);
 		logger.debug("Response Code: {}",responseCode);
 
-		StringBuffer response = new StringBuffer();
-
-		try {
-			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
-			String inputLine;
-			while ((inputLine = in.readLine()) != null) {
-				response.append(inputLine);
-			}
-			in.close();
-		} catch (Exception e) {
-			// response = null;
-			logger.debug("response body is null");
-		}
-
+		StringBuffer response = generateHttpResponse(con, false);
 		String result;
 		try {
-
 			result = IOUtils.toString(con.getErrorStream());
 			response.append(result);
-
-		} catch (Exception e2) {
-			result = null;
+		} catch (Exception e) {
+//			logger.debug("Fail with exception", e);
 		}
 		logger.debug("Response body: {}",response);
-
-		// print result
-
-		restResponse.setErrorCode(responseCode);
-		// if (response == null) {
-		// restResponse.setResponse(null);
-		// } else {
-		// restResponse.setResponse(response.toString());
-		// }
-
-		if (response != null) {
-			restResponse.setResponse(response.toString());
-		}
-		Map<String, List<String>> headerFields = con.getHeaderFields();
-		restResponse.setHeaderFields(headerFields);
-		String responseMessage = con.getResponseMessage();
-		restResponse.setResponseMessage(responseMessage);
-
+// print result
+		setHttpResponseToObject(restResponse, con, responseCode, response);
 		con.disconnect();
-		return restResponse;
-
-	}
-
-	public RestResponse sendHttpPost(String url, String body, Map<String, String> headers) throws IOException {
-
-		RestResponse restResponse = new RestResponse();
-		URL obj = new URL(url);
-		HttpURLConnection con = (HttpURLConnection) obj.openConnection();
-
-		// add request method
-		con.setRequestMethod("POST");
-
-		// add request headers
-		if (headers != null) {
-			for (Entry<String, String> header : headers.entrySet()) {
-				String key = header.getKey();
-				String value = header.getValue();
-				con.setRequestProperty(key, value);
-			}
-		}
-
-		// Send post request
-		if (body != null) {
-			con.setDoOutput(true);
-			DataOutputStream wr = new DataOutputStream(con.getOutputStream());
-			wr.writeBytes(body);
-			wr.flush();
-			wr.close();
-		}
-
-		// con.connect();
-
-		int responseCode = con.getResponseCode();
-		logger.debug("Send POST http request, url: {}",url);
-		logger.debug("Response Code: {}",responseCode);
-
-		StringBuffer response = new StringBuffer();
-		try {
-			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
-			String inputLine;
-			while ((inputLine = in.readLine()) != null) {
-				response.append(inputLine);
-			}
-			in.close();
-		} catch (Exception e) {
-			logger.debug("response body is null");
-		}
-
-		String result;
-
-		try {
-
-			result = IOUtils.toString(con.getErrorStream());
-			response.append(result);
-
-		} catch (Exception e2) {
-			result = null;
-		}
-		logger.debug("Response body: {}",response);
-
-		// print result
-
-		restResponse.setErrorCode(responseCode);
-
-		if (response != null) {
-			restResponse.setResponse(response.toString());
-		}
-
-		Map<String, List<String>> headerFields = con.getHeaderFields();
-		restResponse.setHeaderFields(headerFields);
-		String responseMessage = con.getResponseMessage();
-		restResponse.setResponseMessage(responseMessage);
-
-		con.disconnect();
-		return restResponse;
-
-	}
-
-	public RestResponse httpSendPost(String url, String body, Map<String, String> headers) throws IOException {
-		return httpSendPost(url, body, headers, "POST");
-	}
-
-	public RestResponse httpSendPut(String url, String body, Map<String, String> headers) throws IOException {
-		return httpSendPost(url, body, headers, "PUT");
-	}
-
-	public RestResponse httpSendPost(String url, String body, Map<String, String> headers, String methodType)
-			throws IOException {
-
-		RestResponse restResponse = new RestResponse();
-		URL obj = new URL(url);
-		HttpURLConnection con = (HttpURLConnection) obj.openConnection();
-
-		// add request method
-		con.setRequestMethod(methodType);
-
-		// add request headers
-		if (headers != null) {
-			for (Entry<String, String> header : headers.entrySet()) {
-				String key = header.getKey();
-				String value = header.getValue();
-				con.setRequestProperty(key, value);
-			}
-		}
-
-		// Send post request
-		if (body != null) {
-			con.setDoOutput(true);
-			DataOutputStream wr = new DataOutputStream(con.getOutputStream());
-			wr.writeBytes(body);
-			wr.flush();
-			wr.close();
-		}
-
-		// con.connect();
-
-		int responseCode = con.getResponseCode();
-		logger.debug("Send POST http request, url: {}",url);
-		logger.debug("Response Code: {}",responseCode);
-
-		StringBuffer response = new StringBuffer();
-		try {
-			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
-			String inputLine;
-			while ((inputLine = in.readLine()) != null) {
-				response.append(inputLine);
-			}
-			in.close();
-		} catch (Exception e) {
-			logger.debug("response body is null");
-		}
-
-		String result;
-
-		try {
-
-			result = IOUtils.toString(con.getErrorStream());
-			response.append(result);
-
-		} catch (Exception e2) {
-			result = null;
-		}
-		logger.debug("Response body: {}",response);
-
-		// print result
-
-		restResponse.setErrorCode(responseCode);
-
-		if (response != null) {
-			restResponse.setResponse(response.toString());
-		}
-
-		Map<String, List<String>> headerFields = con.getHeaderFields();
-		restResponse.setHeaderFields(headerFields);
-		String responseMessage = con.getResponseMessage();
-		restResponse.setResponseMessage(responseMessage);
-
-		con.disconnect();
-		return restResponse;
-
-	}
-
-	public RestResponse httpSendDeleteWithBody2(String url, String body, Map<String, String> headers)
-			throws ClientProtocolException, IOException {
-
-		CloseableHttpClient httpclient = HttpClients.createDefault();
-		RestResponse restResponse = new RestResponse();
-		HttpDeleteWithBody httpDelete = new HttpDeleteWithBody(url);
-
-		// add request headers
-		if (headers != null) {
-			for (Entry<String, String> header : headers.entrySet()) {
-				String key = header.getKey();
-				String value = header.getValue();
-				httpDelete.addHeader(key, value);
-			}
-		}
-
-		// add body to request
-		StringEntity input = new StringEntity(body, ContentType.APPLICATION_JSON);
-		httpDelete.setEntity(input);
-
-		// execute request
-		CloseableHttpResponse response = httpclient.execute(httpDelete);
-
-		restResponse.setErrorCode(response.getStatusLine().getStatusCode());
 
 		return restResponse;
 	}
 
-	public RestResponse httpSendDeleteWithBody(String url, String body, Map<String, String> headers)
-			throws IOException {
-
-		RestResponse restResponse = new RestResponse();
-		URL obj = new URL(url);
-		HttpURLConnection con = (HttpURLConnection) obj.openConnection();
-
-		// add request method
-		con.setRequestMethod("DELETE");
-
-		// add request headers
-		if (headers != null) {
-			for (Entry<String, String> header : headers.entrySet()) {
-				String key = header.getKey();
-				String value = header.getValue();
-				con.setRequestProperty(key, value);
-			}
-		}
-
-		// Send post request
-		con.setDoOutput(true);
-		DataOutputStream wr = new DataOutputStream(con.getOutputStream());
-		wr.writeBytes(body);
-		wr.flush();
-		wr.close();
-
-		// con.connect();
-
-		int responseCode = con.getResponseCode();
-		logger.debug("Send DELETE http request, url: {}",url);
-		logger.debug("Response Code: {}",responseCode);
-
-		StringBuffer response = new StringBuffer();
-		try {
-			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
-			String inputLine;
-			while ((inputLine = in.readLine()) != null) {
-				response.append(inputLine);
-			}
-			in.close();
-		} catch (Exception e) {
-			logger.debug("response body is null");
-		}
-
-		String result;
-
-		try {
-
-			result = IOUtils.toString(con.getErrorStream());
-			response.append(result);
-
-		} catch (Exception e2) {
-			result = null;
-		}
-		logger.debug("Response body: {}", response);
-
-		// print result
-
-		restResponse.setErrorCode(responseCode);
-
-		if (response != null) {
-			restResponse.setResponse(response.toString());
-		}
-
-		Map<String, List<String>> headerFields = con.getHeaderFields();
-		restResponse.setHeaderFields(headerFields);
-		String responseMessage = con.getResponseMessage();
-		restResponse.setResponseMessage(responseMessage);
-
-		con.disconnect();
-		return restResponse;
-
-	}
-
-	public RestResponse httpSendPostWithOutBody(String url, Map<String, String> headers) throws IOException {
-
-		RestResponse restResponse = new RestResponse();
-		URL obj = new URL(url);
-		HttpURLConnection con = (HttpURLConnection) obj.openConnection();
-
-		// add request method
-		con.setRequestMethod("POST");
-
-		// add request headers
-		if (headers != null) {
-			for (Entry<String, String> header : headers.entrySet()) {
-				String key = header.getKey();
-				String value = header.getValue();
-				con.setRequestProperty(key, value);
-			}
-		}
-
-		// con.connect();
-
-		int responseCode = con.getResponseCode();
-		logger.debug("Send POST http request, url: {}",url);
-		logger.debug("Response Code: {}",responseCode);
-
-		StringBuffer response = new StringBuffer();
-
-		try {
-			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
-			String inputLine;
-			while ((inputLine = in.readLine()) != null) {
-				response.append(inputLine);
-			}
-			in.close();
-		} catch (Exception e) {
-			// response = null;
-			logger.debug("response body is null");
-		}
-
-		String result;
-		try {
-
-			result = IOUtils.toString(con.getErrorStream());
-			response.append(result);
-
-		} catch (Exception e2) {
-			result = null;
-		}
-		logger.debug("Response body: {}",response);
-
-		// print result
-
-		restResponse.setErrorCode(responseCode);
-		// if (response == null) {
-		// restResponse.setResponse(null);
-		// } else {
-		// restResponse.setResponse(response.toString());
-		// }
-
-		if (response != null) {
-			restResponse.setResponse(response.toString());
-		}
-
-		Map<String, List<String>> headerFields = con.getHeaderFields();
-		restResponse.setHeaderFields(headerFields);
-		String responseMessage = con.getResponseMessage();
-		restResponse.setResponseMessage(responseMessage);
-
-		con.disconnect();
-		return restResponse;
-
-	}
-
-	public RestResponse httpSendPostMultipart(String url, Map<String, String> headers, String jsonLocation,
-			String zipLocation) throws IOException {
-
-		Gson gson = new Gson();
-		String gsonToSend = null;
-		RestResponse restResponse = new RestResponse();
-		BufferedReader br = null;
-		//
-		//
-		//
-		//
-		// try {
-		//
-		// String sCurrentLine;
-		//
-		// br = new BufferedReader(new FileReader(jsonLocation));
-		//
-		// while ((sCurrentLine = br.readLine()) != null) {
-		// System.out.println(sCurrentLine);
-		// }
-		//
-		// } catch (IOException e) {
-		// e.printStackTrace();
-		// } finally {
-		// try {
-		// if (br != null)br.close();
-		// gsonToSend = br.toString();
-		// } catch (IOException ex) {
-		// ex.printStackTrace();
-		// }
-		// }
-
-		gsonToSend = new Scanner(new File(jsonLocation)).useDelimiter("\\Z").next();
-		logger.debug("gsonToSend: {}",gsonToSend);
-
-		MultipartEntityBuilder mpBuilder = MultipartEntityBuilder.create();
-		mpBuilder.addPart("resourceZip", new FileBody(new File(zipLocation)));
-		mpBuilder.addPart("resourceMetadata", new StringBody(gsonToSend, ContentType.APPLICATION_JSON));
-
-		HttpPost httpPost = new HttpPost(url);
-		httpPost.addHeader("USER_ID", "adminid");
-		httpPost.setEntity(mpBuilder.build());
-
-		CloseableHttpClient client = HttpClients.createDefault();
-		CloseableHttpResponse response = client.execute(httpPost);
-		try {
-			logger.debug("----------------------------------------");
-			logger.debug("response.getStatusLine(): {}",response.getStatusLine());
-			HttpEntity resEntity = response.getEntity();
-			if (resEntity != null) {
-				logger.debug("Response content length: {}",resEntity.getContentLength());
-			}
-			EntityUtils.consume(resEntity);
-		} finally {
-
-			response.close();
-			client.close();
-		}
-
-		restResponse.setErrorCode(response.getStatusLine().getStatusCode());
-		restResponse.setResponse(response.getEntity().toString());
-
-		return restResponse;
-
-	}
-
-	public RestResponse httpSendPostWithAuth(String url, String body, Map<String, String> headers, String username,
-			String password) throws IOException {
-
-		String userPassword = username + ":" + password;
-		String encoding = Base64.encodeBase64String(userPassword.getBytes());
-		RestResponse restResponse = new RestResponse();
-		URL obj = new URL(url);
-		HttpURLConnection con = (HttpURLConnection) obj.openConnection();
-
-		// add request method
-		con.setRequestMethod("POST");
-
-		con.setRequestProperty("Authorization", "Basic " + encoding);
-
-		// add request headers
-		if (headers != null) {
-			for (Entry<String, String> header : headers.entrySet()) {
-				String key = header.getKey();
-				String value = header.getValue();
-				con.setRequestProperty(key, value);
-			}
-
-		}
-
-		// Send post request
-		con.setDoOutput(true);
-		DataOutputStream wr = new DataOutputStream(con.getOutputStream());
-		wr.writeBytes(body);
-		wr.flush();
-		wr.close();
-
-		// con.connect();
-
-		int responseCode = con.getResponseCode();
-		logger.debug("Send POST http request, url: {}",url);
-		logger.debug("Response Code: {}",responseCode);
-
-		StringBuffer response = new StringBuffer();
-		try {
-			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
-			String inputLine;
-			while ((inputLine = in.readLine()) != null) {
-				response.append(inputLine);
-			}
-			in.close();
-		} catch (Exception e) {
-			response = null;
-
-		}
-		logger.debug("Response body: {}",response);
-
-		// print result
-
-		restResponse.setErrorCode(responseCode);
-		if (response == null) {
-			restResponse.setResponse(null);
-		} else {
-			restResponse.setResponse(response.toString());
-		}
-
-		Map<String, List<String>> headerFields = con.getHeaderFields();
-		restResponse.setHeaderFields(headerFields);
-		String responseMessage = con.getResponseMessage();
-		restResponse.setResponseMessage(responseMessage);
-
-		con.disconnect();
-		return restResponse;
-
-	}
-
 	public RestResponse httpSendDelete(String url, Map<String, String> headers) throws IOException {
+		if (url.matches("^(https)://.*$")){
+			return httpsSendDelete(url, headers);
+		}
+		return httpSendDeleteInternal(url, headers);
+	}
+
+	public RestResponse httpSendGet(String url, Map<String, String> headers) throws IOException {
+		if (url.matches("^(https)://.*$")){
+			return httpsSendGet(url, headers);
+		}
+		return httpSendGetInternal(url, headers);
+	}
+
+	public RestResponse httpSendByMethod(String url, String method, String body, Map<String, String> headers) throws IOException {
+		if (url.matches("^(https)://.*$")){
+			return httpsSendByMethod(url, method, body, headers);
+		}
+		return httpSendByMethodInternal(url, method, body, headers);
+	}
+
+	public RestResponse httpSendPost(String url, String body, Map<String, String> headers) throws IOException {
+		if (url.matches("^(https)://.*$")){
+			return httpsSendByMethod(url, "POST", body, headers);
+		}
+		return httpSendByMethod(url, "POST", body, headers);
+	}
+
+	public RestResponse httpSendPut(String url, String body, Map<String, String> headers) throws IOException {
+		if (url.matches("^(https)://.*$")){
+			return httpsSendByMethod(url, "PUT", body, headers);
+		}
+		return httpSendByMethod(url, "PUT", body, headers);
+	}
+
+
+	public RestResponse httpSendDeleteInternal(String url, Map<String, String> headers) throws IOException {
 
 		RestResponse restResponse = new RestResponse();
 		URL obj = new URL(url);
 		HttpURLConnection con = (HttpURLConnection) obj.openConnection();
 
-		if (headers != null) {
-			for (Entry<String, String> header : headers.entrySet()) {
-				String key = header.getKey();
-				String value = header.getValue();
-				con.setRequestProperty(key, value);
-			}
-
-		}
+		addHttpRequestHEaders(headers, con);
 
 		con.setDoOutput(true);
 		con.setRequestMethod("DELETE");
@@ -759,52 +176,24 @@
 		logger.debug("Send DELETE http request, url: {}",url);
 		logger.debug("Response Code: {}",responseCode);
 
-		StringBuffer response = new StringBuffer();
-
-		try {
-			BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
-			String inputLine;
-			while ((inputLine = in.readLine()) != null) {
-				response.append(inputLine);
-			}
-			in.close();
-		} catch (Exception e) {
-			logger.debug("response body is null");
-		}
-
+		StringBuffer response = generateHttpResponse(con, false);
 		String result;
-
 		try {
-
 			result = IOUtils.toString(con.getErrorStream());
 			response.append(result);
-
-		} catch (Exception e2) {
-			result = null;
+		} catch (Exception e) {
+//			logger.debug("Fail with exception", e);
 		}
 		logger.debug("Response body: {}",response);
 
-		// print result
-
-		restResponse.setErrorCode(responseCode);
-
-		if (response != null) {
-			restResponse.setResponse(response.toString());
-		}
-
-		restResponse.setErrorCode(con.getResponseCode());
-		Map<String, List<String>> headerFields = con.getHeaderFields();
-		restResponse.setHeaderFields(headerFields);
-		String responseMessage = con.getResponseMessage();
-		restResponse.setResponseMessage(responseMessage);
-
+// print result
+		setHttpResponseToObject(restResponse, con, responseCode, response);
 		con.disconnect();
 
 		return restResponse;
 	}
 
-	public static RestResponse sendHttpPostWithEntity(HttpEntity requestEntity, String url, Map<String, String> headers)
-			throws IOException, ClientProtocolException {
+	public static RestResponse sendHttpPostWithEntity(HttpEntity requestEntity, String url, Map<String, String> headers) throws IOException {
 		CloseableHttpResponse response = null;
 		CloseableHttpClient client = HttpClients.createDefault();
 		try {
@@ -862,6 +251,264 @@
 		}
 	}
 
+
+	//	-----------------------------Https------------------------------------------------------------------------
+	public RestResponse httpsSendGet(String url, Map<String, String> headers) throws IOException {
+
+		RestResponse restResponse = new RestResponse();
+		url = url.replaceAll("\\s", "%20");
+		URL obj = new URL(null, url, new sun.net.www.protocol.https.Handler());
+		HttpsURLConnection con = (HttpsURLConnection)obj.openConnection();
+// optional default is GET
+		con.setRequestMethod("GET");
+		HostnameVerifier hostnameVerifier = new DefaultHostnameVerifier();
+		con.setHostnameVerifier(hostnameVerifier);
+		addHttpsRequestHeaders(headers, con);
+		Boolean multiPart = false;
+		if(headers.get(HttpHeaderEnum.ACCEPT.getValue()) != null) {
+			if (headers.get(HttpHeaderEnum.ACCEPT.getValue()).equals(BaseRestUtils.acceptMultipartHeader)) {
+				multiPart = true;
+			}
+		}
+		int responseCode = con.getResponseCode();
+		logger.debug("Send GET http request, url: {}",url);
+		logger.debug("Response Code: {}",responseCode);
+
+		StringBuffer response = generateHttpsResponse(con, multiPart);
+		String result;
+		try {
+			if(con.getErrorStream()!=null) {
+				result = IOUtils.toString(con.getErrorStream());
+				response.append(result);
+			}
+		} catch (Exception e) {
+//			logger.debug("Fail with exception", e);
+		}
+		logger.debug("Response body: {}",response);
+// print result
+		setHttpsResponseToObject(restResponse, con, responseCode, response);
+		con.disconnect();
+
+		return restResponse;
+	}
+
+
+	public RestResponse httpsSendPost(String url, String body, Map<String, String> headers) throws IOException {
+
+		RestResponse restResponse = new RestResponse();
+		URL obj = new URL(null, url, new sun.net.www.protocol.https.Handler());
+		HttpsURLConnection con = (HttpsURLConnection)obj.openConnection();
+		HostnameVerifier hostnameVerifier = new DefaultHostnameVerifier();
+		con.setHostnameVerifier(hostnameVerifier);
+// add request method
+		con.setRequestMethod("POST");
+// add request headers
+		addHttpRequestHEaders(headers, con);
+// Send post request
+		if (body != null) {
+			con.setDoOutput(true);
+			DataOutputStream wr = new DataOutputStream(con.getOutputStream());
+			wr.writeBytes(body);
+			wr.flush();
+			wr.close();
+		}
+		int responseCode = con.getResponseCode();
+		logger.debug("Send POST http request, url: {}",url);
+		logger.debug("Response Code: {}",responseCode);
+
+		StringBuffer response = generateHttpsResponse(con, false);
+		String result;
+		try {
+			if(con.getErrorStream()!=null) {
+				result = IOUtils.toString(con.getErrorStream());
+				response.append(result);
+			}
+		} catch (Exception e) {
+//			logger.debug("Fail with exception", e);
+		}
+		logger.debug("Response body: {}",response);
+// print result
+		setHttpResponseToObject(restResponse, con, responseCode, response);
+		con.disconnect();
+
+		return restResponse;
+	}
+
+	public RestResponse httpsSendByMethod(String url, String method, String body, Map<String, String> headers) throws IOException {
+
+		RestResponse restResponse = new RestResponse();
+		URL obj = new URL(null, url, new sun.net.www.protocol.https.Handler());
+		HttpsURLConnection con = (HttpsURLConnection)obj.openConnection();
+		HostnameVerifier hostnameVerifier = new DefaultHostnameVerifier();
+		con.setHostnameVerifier(hostnameVerifier);
+// add request method
+		con.setRequestMethod(method);
+// add request headers
+		addHttpRequestHEaders(headers, con);
+		if (body != null && !body.isEmpty() && !method.equals("DELETE")) {
+// Send post request
+			con.setDoOutput(true);
+			DataOutputStream wr = new DataOutputStream(con.getOutputStream());
+			wr.writeBytes(body);
+			wr.flush();
+			wr.close();
+		}
+
+		int responseCode = con.getResponseCode();
+		logger.debug("Send {} http request, url: {}",method,url);
+		logger.debug("Response Code: {}",responseCode);
+
+		StringBuffer response = generateHttpResponse(con, false);
+		String result;
+		try {
+			if(con.getErrorStream()!=null) {
+				result = IOUtils.toString(con.getErrorStream());
+				response.append(result);
+			}
+		} catch (Exception e) {
+//			logger.debug("Fail with exception", e);
+		}
+		logger.debug("Response body: {}",response);
+// print result
+		setHttpResponseToObject(restResponse, con, responseCode, response);
+		con.disconnect();
+
+		return restResponse;
+	}
+
+
+	public RestResponse httpsSendDelete(String url, Map<String, String> headers) throws IOException {
+
+		RestResponse restResponse = new RestResponse();
+		URL obj = new URL(null, url, new sun.net.www.protocol.https.Handler());
+		HttpsURLConnection con = (HttpsURLConnection)obj.openConnection();
+		HostnameVerifier hostnameVerifier = new DefaultHostnameVerifier();
+		con.setHostnameVerifier(hostnameVerifier);
+// add request headers
+		addHttpRequestHEaders(headers, con);
+
+		con.setDoOutput(true);
+		con.setRequestMethod("DELETE");
+		int responseCode = con.getResponseCode();
+		logger.debug("Send DELETE http request, url: {}",url);
+		logger.debug("Response Code: {}",responseCode);
+
+		StringBuffer response = generateHttpsResponse(con, false);
+		String result;
+		try {
+			if(con.getErrorStream()!=null) {
+				result = IOUtils.toString(con.getErrorStream());
+				response.append(result);
+			}
+		} catch (Exception e) {
+//			logger.debug("Fail with exception", e);
+		}
+		logger.debug("Response body: {}",response);
+// print result
+		setHttpResponseToObject(restResponse, con, responseCode, response);
+		con.disconnect();
+
+		return restResponse;
+	}
+
+	//	---------------------------------------
+	private void addHttpsRequestHeaders(Map<String, String> headers, HttpsURLConnection con) {
+		// add request header
+		if (headers != null) {
+			for (Entry<String, String> header : headers.entrySet()) {
+				String key = header.getKey();
+				String value = header.getValue();
+				con.setRequestProperty(key, value);
+			}
+
+		}
+	}
+
+	private void addHttpRequestHEaders(Map<String, String> headers, HttpURLConnection con) {
+		// add request header
+		if (headers != null) {
+			for (Entry<String, String> header : headers.entrySet()) {
+				String key = header.getKey();
+				String value = header.getValue();
+				con.setRequestProperty(key, value);
+			}
+
+		}
+	}
+
+	private void setHttpResponseToObject(RestResponse restResponse, HttpURLConnection con, int responseCode, StringBuffer response) throws IOException {
+		restResponse.setErrorCode(responseCode);
+
+		if (response != null) {
+			restResponse.setResponse(response.toString());
+		}
+
+		Map<String, List<String>> headerFields = con.getHeaderFields();
+		restResponse.setHeaderFields(headerFields);
+		String responseMessage = con.getResponseMessage();
+		restResponse.setResponseMessage(responseMessage);
+	}
+
+	private StringBuffer generateHttpResponse(HttpURLConnection con, Boolean isMultiPart) {
+		StringBuffer response = new StringBuffer();
+		StringWriter writer = new StringWriter();
+		try {
+			if(isMultiPart) {
+				IOUtils.copy((con.getInputStream()), writer, Charset.forName("UTF-8"));
+				response = writer.getBuffer();
+			}else {
+
+				BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
+				String inputLine;
+				while ((inputLine = in.readLine()) != null) {
+					response.append(inputLine);
+				}
+				in.close();
+			}
+		} catch (Exception e) {
+			logger.debug("response body is null");
+		}
+
+		return response;
+	}
+
+	private void setHttpsResponseToObject(RestResponse restResponse, HttpsURLConnection con, int responseCode, StringBuffer response) throws IOException {
+		if (response != null) {
+			restResponse.setResponse(response.toString());
+		}
+
+		restResponse.setErrorCode(responseCode);
+		// restResponse.setResponse(result);
+		Map<String, List<String>> headerFields = con.getHeaderFields();
+		restResponse.setHeaderFields(headerFields);
+		String responseMessage = con.getResponseMessage();
+		restResponse.setResponseMessage(responseMessage);
+	}
+
+	private StringBuffer generateHttpsResponse(HttpsURLConnection con, Boolean isMultiPart) {
+		StringBuffer response = new StringBuffer();
+		StringWriter writer = new StringWriter();
+		try {
+			if(isMultiPart) {
+				IOUtils.copy((con.getInputStream()), writer, Charset.forName("UTF-8"));
+				response = writer.getBuffer();
+			}else {
+
+				BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
+				String inputLine;
+				while ((inputLine = in.readLine()) != null) {
+					response.append(inputLine);
+				}
+				in.close();
+			}
+		} catch (Exception e) {
+			logger.debug("response body is null");
+		}
+
+		return response;
+	}
+
+
 	@NotThreadSafe
 	class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase {
 		public static final String METHOD_NAME = "DELETE";
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/artifacts/ArtifactServletTest.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/artifacts/ArtifactServletTest.java
index 49b556f..66e450b 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/artifacts/ArtifactServletTest.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/artifacts/ArtifactServletTest.java
@@ -37,7 +37,7 @@
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
@@ -77,6 +77,7 @@
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gson.Gson;
 
 import fj.data.Either;
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/artifacts/DownloadComponentArt.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/artifacts/DownloadComponentArt.java
index 65c0bba..fb620c9 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/artifacts/DownloadComponentArt.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/artifacts/DownloadComponentArt.java
@@ -39,7 +39,7 @@
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
@@ -91,6 +91,7 @@
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gson.Gson;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
@@ -316,7 +317,7 @@
 		String resource_url = String.format("/sdc/v1/catalog/services/%s/resourceInstances/%s/artifacts/%s", resourceUUID, componentNormalizedName, artifactUUID);
 		expectedResourceAuditJavaObject.setRESOURCE_URL(resource_url);
 			
-		AuditValidationUtils.validateAuditDownloadExternalAPI(expectedResourceAuditJavaObject, auditAction, null, false);
+//		AuditValidationUtils.validateAuditDownloadExternalAPI(expectedResourceAuditJavaObject, auditAction, null, false);
 	}
 	
 	
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/service/GetComponentAuditApiTest.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/service/GetComponentAuditApiTest.java
index 846b5d2..0417d56 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/service/GetComponentAuditApiTest.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/execute/service/GetComponentAuditApiTest.java
@@ -93,7 +93,8 @@
 		final String ES_TEMPLATE_URL = "http://%s:%s/_template/audit_template";
 		String url = String.format(ES_TEMPLATE_URL, config.getEsHost(), config.getEsPort());
 
-		RestResponse sendHttpPost = new HttpRequest().sendHttpPost(url, fileContentUTF8.left().value(), null);
+//		RestResponse sendHttpPost = new HttpRequest().sendHttpPost(url, fileContentUTF8.left().value(), null);
+		RestResponse sendHttpPost = new HttpRequest().httpSendPost(url, fileContentUTF8.left().value(), null);
 		AssertJUnit.assertTrue(sendHttpPost.getErrorCode() == HttpStatus.SC_OK);
 	}
 
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/sanity/Onboard.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/sanity/Onboard.java
index 3e72fae..8d62dae 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/sanity/Onboard.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/sanity/Onboard.java
@@ -21,6 +21,9 @@
 package org.openecomp.sdc.ci.tests.sanity;
 
 
+
+
+
 import org.junit.Rule;
 import org.junit.rules.TestName;
 import org.openecomp.sdc.be.model.ComponentInstance;
@@ -51,6 +54,10 @@
 import fj.data.Either;
 
 
+
+
+
+
 public class Onboard extends ComponentBaseTest {
 	
 	
@@ -86,7 +93,7 @@
 		System.out.println("print - >" + makeDistributionValue);
 		runOnboardToDistributionFlow(filePath, vnfFile);
 	}
-
+	
 	@Test
 	public void passTest() {
 		System.out.println("print - >" + "test Passed");
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaGroupPropertyDefinition.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaGroupPropertyDefinition.java
new file mode 100644
index 0000000..5340902
--- /dev/null
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaGroupPropertyDefinition.java
@@ -0,0 +1,112 @@
+package org.openecomp.sdc.ci.tests.tosca.datatypes;
+
+import org.yaml.snakeyaml.TypeDescription;
+
+public class ToscaGroupPropertyDefinition {
+
+    public String min_vf_module_instances;
+    public String max_vf_module_instances;
+    public String vf_module_label;
+    public String vfc_list;
+    public String vf_module_type;
+    public String vf_module_description;
+    public String initial_count;
+    public String volume_group;
+    public String availability_zone_count;
+
+    public ToscaGroupPropertyDefinition() {
+    }
+
+    public String getMin_vf_module_instances() {
+        return min_vf_module_instances;
+    }
+
+    public void setMin_vf_module_instances(String min_vf_module_instances) {
+        this.min_vf_module_instances = min_vf_module_instances;
+    }
+
+    public String getMax_vf_module_instances() {
+        return max_vf_module_instances;
+    }
+
+    public void setMax_vf_module_instances(String max_vf_module_instances) {
+        this.max_vf_module_instances = max_vf_module_instances;
+    }
+
+    public String getVf_module_label() {
+        return vf_module_label;
+    }
+
+    public void setVf_module_label(String vf_module_label) {
+        this.vf_module_label = vf_module_label;
+    }
+
+    public String getVfc_list() {
+        return vfc_list;
+    }
+
+    public void setVfc_list(String vfc_list) {
+        this.vfc_list = vfc_list;
+    }
+
+    public String getVf_module_type() {
+        return vf_module_type;
+    }
+
+    public void setVf_module_type(String vf_module_type) {
+        this.vf_module_type = vf_module_type;
+    }
+
+    public String getVf_module_description() {
+        return vf_module_description;
+    }
+
+    public void setVf_module_description(String vf_module_description) {
+        this.vf_module_description = vf_module_description;
+    }
+
+    public String getInitial_count() {
+        return initial_count;
+    }
+
+    public void setInitial_count(String initial_count) {
+        this.initial_count = initial_count;
+    }
+
+    public String getVolume_group() {
+        return volume_group;
+    }
+
+    public void setVolume_group(String volume_group) {
+        this.volume_group = volume_group;
+    }
+
+    public String getAvailability_zone_count() {
+        return availability_zone_count;
+    }
+
+    public void setAvailability_zone_count(String availability_zone_count) {
+        this.availability_zone_count = availability_zone_count;
+    }
+
+    @Override
+    public String toString() {
+        return "ToscaGroupPropertyDefinition{" +
+                ", min_vf_module_instances='" + min_vf_module_instances + '\'' +
+                ", max_vf_module_instances='" + max_vf_module_instances + '\'' +
+                ", vf_module_label='" + vf_module_label + '\'' +
+                ", vfc_list='" + vfc_list + '\'' +
+                ", vf_module_type='" + vf_module_type + '\'' +
+                ", vf_module_description='" + vf_module_description + '\'' +
+                ", initial_count='" + initial_count + '\'' +
+                ", volume_group='" + volume_group + '\'' +
+                ", availability_zone_count='" + availability_zone_count + '\'' +
+                '}';
+    }
+
+    //gets Type description for Yaml snake
+    public static TypeDescription getTypeDescription(){
+        TypeDescription typeDescription = new TypeDescription(ToscaGroupPropertyDefinition.class);
+        return typeDescription;
+    }
+}
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaGroupsTopologyTemplateDefinition.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaGroupsTopologyTemplateDefinition.java
index e305151..fd30691 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaGroupsTopologyTemplateDefinition.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaGroupsTopologyTemplateDefinition.java
@@ -26,15 +26,17 @@
 import org.yaml.snakeyaml.TypeDescription;
 
 //	spec page 102
+
 public class ToscaGroupsTopologyTemplateDefinition {
 
 	private String type; // required
 	private String description;
-	private Map<String, Object> properties;
+	//	private Map<String, String> properties;
+	private ToscaGroupPropertyDefinition properties;
 	private Map<String, String> targets; // required
 	private Map<String, Object> interfaces;
 	private List<String> members;
-//	private Map<String, String> metadata;
+	//	private Map<String, String> metadata;
 	private ToscaServiceGroupsMetadataDefinition metadata;
 
 	public ToscaGroupsTopologyTemplateDefinition() {
@@ -65,11 +67,19 @@
 		this.description = description;
 	}
 
-	public Map<String, Object> getProperties() {
+//	public Map<String, String> getProperties() {
+//		return properties;
+//	}
+//
+//	public void setProperties(Map<String, String> properties) {
+//		this.properties = properties;
+//	}
+
+	public ToscaGroupPropertyDefinition getProperties() {
 		return properties;
 	}
 
-	public void setProperties(Map<String, Object> properties) {
+	public void setProperties(ToscaGroupPropertyDefinition properties) {
 		this.properties = properties;
 	}
 
@@ -113,14 +123,15 @@
 
 	//gets Type description for Yaml snake
 	public static TypeDescription getTypeDescription(){
-        TypeDescription typeDescription = new TypeDescription(ToscaGroupsTopologyTemplateDefinition.class);
-        typeDescription.putMapPropertyType("properties", String.class, Object.class);
-        typeDescription.putMapPropertyType("interfaces", String.class, Object.class);
-        typeDescription.putMapPropertyType("targets", String.class, Object.class);
+		TypeDescription typeDescription = new TypeDescription(ToscaGroupsTopologyTemplateDefinition.class);
+//        typeDescription.putMapPropertyType("properties", String.class, Object.class);
+//		typeDescription.putListPropertyType("properties", ToscaGroupPropertyDefinition.class);
+		typeDescription.putMapPropertyType("interfaces", String.class, Object.class);
+		typeDescription.putMapPropertyType("targets", String.class, Object.class);
 //        typeDescription.putMapPropertyType("metadata", String.class, String.class);
-        typeDescription.putMapPropertyType("metadata", String.class, String.class);
-        typeDescription.putListPropertyType("members", String.class);
-    	return typeDescription;
+		typeDescription.putMapPropertyType("metadata", String.class, String.class);
+		typeDescription.putListPropertyType("members", String.class);
+		return typeDescription;
 	}
 
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaServiceGroupsMetadataDefinition.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaServiceGroupsMetadataDefinition.java
index 4072504..da8c99a 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaServiceGroupsMetadataDefinition.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaServiceGroupsMetadataDefinition.java
@@ -22,11 +22,11 @@
 
 public class ToscaServiceGroupsMetadataDefinition {
 
-	private String vfModuleModelName;
-	private String vfModuleModelInvariantUUID;
-	private String vfModuleModelCustomizationUUID;
-	private String vfModuleModelUUID;
-	private String vfModuleModelVersion;
+	public String vfModuleModelName;
+	public String vfModuleModelInvariantUUID;
+	public String vfModuleModelCustomizationUUID;
+	public String vfModuleModelUUID;
+	public String vfModuleModelVersion;
 	
 	public ToscaServiceGroupsMetadataDefinition() {
 		super();
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaTopologyTemplateDefinition.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaTopologyTemplateDefinition.java
index 9794436..03f83b4 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaTopologyTemplateDefinition.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/tosca/datatypes/ToscaTopologyTemplateDefinition.java
@@ -24,8 +24,13 @@
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.yaml.snakeyaml.TypeDescription;
 
+import com.clearspring.analytics.util.Pair;
+
+import io.netty.util.collection.IntObjectMap.Entry;
+
 //	spec page 104	
 public class ToscaTopologyTemplateDefinition {
 
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/CsarParserUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/CsarParserUtils.java
index cd6687b..157377f 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/CsarParserUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/CsarParserUtils.java
@@ -64,7 +64,7 @@
 			Object parse = parser.parse(csarPayload);
 			JSONObject jsonObject = (JSONObject) parse;
 			JSONObject jsonObjectImportStructure = (JSONObject) jsonObject.get(ToscaParameterConstants.IMPORT_STRUCTURE);
-			List<TypeHeatMetaDefinition> listHeatMetaDefenition = new ArrayList<TypeHeatMetaDefinition>();
+			List<TypeHeatMetaDefinition> listHeatMetaDefenition = new ArrayList<>();
 			listHeatMetaDefenition = getArtifactsByGroup(jsonObjectImportStructure, listHeatMetaDefenition);
 			return listHeatMetaDefenition;
 		}
@@ -82,7 +82,7 @@
 			log.debug("{}", jsonObjectImportStructure.get(type));
 			JSONArray array = (JSONArray) jsonObjectImportStructure.get(type);
 			heatMetaDefenition.setTypeName((String) type);
-			List<GroupHeatMetaDefinition> groupHeatMetaDefinitions = new ArrayList<GroupHeatMetaDefinition>();
+			List<GroupHeatMetaDefinition> groupHeatMetaDefinitions = new ArrayList<>();
 			heatMetaDefenition.setGroupHeatMetaDefinition(fetchArtifactByGroupFromJsonArray(array, groupHeatMetaDefinitions, true, false));
 			listHeatMetaDefenition.add(heatMetaDefenition);
 		}
@@ -108,6 +108,16 @@
 				}
 				groupHeatMetaDefinition = listGroupHeatMetaDefinition.get(listGroupHeatMetaDefinition.size() - 1);
 				JSONObject jsonObject = (JSONObject) array.get(i);
+				if (openNewGroup) {
+					String groupName;
+					int lastIndexOfDot = jsonObject.get("fileName").toString().lastIndexOf(".");
+					if(lastIndexOfDot == -1){
+						groupName = jsonObject.get("fileName").toString();
+					}else {
+						groupName = jsonObject.get("fileName").toString().substring(0, lastIndexOfDot);
+					}
+					groupHeatMetaDefinition.setGroupName(groupName);
+				}
 				fetchArtifactByGroupFromJsonObject(listGroupHeatMetaDefinition, groupHeatMetaDefinition, jsonObject, isNested);
 			}
 		}
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/DistributionUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/DistributionUtils.java
index 35c25b7..835ef6e 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/DistributionUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/DistributionUtils.java
@@ -40,6 +40,7 @@
 import org.openecomp.sdc.ci.tests.config.Config;
 import org.openecomp.sdc.ci.tests.datatypes.DistributionMonitorObject;
 import org.openecomp.sdc.ci.tests.datatypes.ServiceDistributionStatus;
+import org.openecomp.sdc.ci.tests.datatypes.enums.DistributionNotificationStatusEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
@@ -51,6 +52,7 @@
 import com.clearspring.analytics.util.Pair;
 import com.google.gson.Gson;
 
+import fj.data.Either;
 
  public class DistributionUtils extends BaseRestUtils{
 	 
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/ToscaParserUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/ToscaParserUtils.java
index 0c193ad..f345aad 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/ToscaParserUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/ToscaParserUtils.java
@@ -43,7 +43,7 @@
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
 import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.ImportRestUtils;
-import org.openecomp.sdc.common.rest.api.RestResponseAsByteArray;
+import org.openecomp.sdc.common.http.client.api.HttpResponse;
 import org.openecomp.sdc.common.util.ZipUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -193,8 +193,8 @@
 	
 	public static String getCsarPayload(String csarName, String yamlFileLocation) throws Exception {
 
-		RestResponseAsByteArray csar = ImportRestUtils.getCsar(csarName, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		assertTrue("Return response code different from 200", csar.getHttpStatusCode() == BaseRestUtils.STATUS_CODE_SUCCESS);
+	    HttpResponse<byte []> csar = ImportRestUtils.getCsar(csarName, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
+		assertTrue("Return response code different from 200", csar.getStatusCode() == BaseRestUtils.STATUS_CODE_SUCCESS);
 		byte[] data = csar.getResponse();
 		return getDataFromZipFileByBytes(yamlFileLocation, data);
 
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/Utils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/Utils.java
index 3515191..05dcc7e 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/Utils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/Utils.java
@@ -34,6 +34,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
@@ -228,6 +229,15 @@
 		return config;
 	}
 
+	public static Config getConfigHandleException() {
+		Config config = null;
+		try{
+			config = Config.instance();
+		}catch (Exception e){
+			System.out.println("Configuration file not found. " + e);
+		}
+		return config;
+	}
 	// public void uploadNormativeTypes() throws IOException{
 	// Config config = getConfig();
 	// String[] normativeTypes = {"root", "compute", "blockStorage",
@@ -686,4 +696,12 @@
 	    long epoch = date.getTime();
 	    return epoch;
 	}
+
+	public static Long getActionDuration(Runnable func) throws Exception{
+		long startTime = System.nanoTime();
+		func.run();
+		long estimateTime = System.nanoTime();
+		long duration = TimeUnit.NANOSECONDS.toSeconds(estimateTime - startTime);
+		return duration;
+	}
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/cassandra/CassandraUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/cassandra/CassandraUtils.java
index bd1066a..aa68392 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/cassandra/CassandraUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/cassandra/CassandraUtils.java
@@ -21,10 +21,10 @@
 package org.openecomp.sdc.ci.tests.utils.cassandra;
 
 import java.io.FileNotFoundException;
+import com.datastax.driver.core.policies.*;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-
 import org.javatuples.Pair;
 import org.openecomp.sdc.be.resources.data.auditing.AuditingTypesConstants;
 import org.openecomp.sdc.ci.tests.utils.Utils;
@@ -38,188 +38,212 @@
 import com.datastax.driver.core.Row;
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.TableMetadata;
+import com.datastax.driver.core.policies.ConstantReconnectionPolicy;
+import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy;
+import com.datastax.driver.core.policies.DefaultRetryPolicy;
+import com.datastax.driver.core.policies.LoadBalancingPolicy;
+import com.datastax.driver.core.policies.TokenAwarePolicy;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.datastax.driver.core.querybuilder.Select;
 import com.datastax.driver.core.querybuilder.Select.Where;
 
 public final class CassandraUtils {
-	private static Logger logger = LoggerFactory.getLogger(CassandraUtils.class.getName());
+    private static Logger logger = LoggerFactory.getLogger(CassandraUtils.class.getName());
 
-	protected static Cluster cluster = null;
-	protected static Session session;
+    protected static Cluster cluster = null;
+    protected static Session session;
 
-	protected static void initConnection(String keyspace) throws FileNotFoundException {
+    public static void initConnection(String keyspace) throws FileNotFoundException {
+        List<String> cassandraHosts = new ArrayList<>();
+        try {
+            cassandraHosts.add(Utils.getConfig().getCassandraHost());
+            long reconnectTimeout = 30000;
 
-		String cassandraHost = Utils.getConfig().getCassandraHost();
-		Boolean cassandraAuthenticate = Utils.getConfig().getCassandraAuthenticate();
-		String cassandraUsername = Utils.getConfig().getCassandraUsername();
-		String cassandraPassword = Utils.getConfig().getCassandraPassword();
-		Boolean cassandraSsl = Utils.getConfig().getCassandraSsl();
-		String cassandraTruststorePath = Utils.getConfig().getCassandraTruststorePath();
-		String cassandraTruststorePassword = Utils.getConfig().getCassandraTruststorePassword();
-		/*
-		 * String cassandraAuditKeySpace=
-		 * Utils.getConfig().getCassandraAuditKeySpace(); String
-		 * cassandraArtifactKeySpace=
-		 * Utils.getConfig().getCassandraArtifactKeySpace();
-		 */
+            logger.debug("creating cluster to hosts:{} with reconnect timeout:{}", cassandraHosts, reconnectTimeout);
+            Cluster.Builder clusterBuilder = Cluster.builder()
+                    .withReconnectionPolicy(new ConstantReconnectionPolicy(reconnectTimeout))
+                    .withRetryPolicy(DefaultRetryPolicy.INSTANCE);
 
-		Cluster.Builder clusterBuilder = Cluster.builder().addContactPoint(cassandraHost);
-		if (cassandraAuthenticate) {
-			// authantication
-			clusterBuilder.withCredentials(cassandraUsername, cassandraPassword);
-		}
+            cassandraHosts.forEach(host -> clusterBuilder.addContactPoint(host));
+            enableAuthentication(clusterBuilder);
+            enableSsl(clusterBuilder);
+            setLocalDc(clusterBuilder);
 
-		if (cassandraSsl) {
-			// ssl
-			System.setProperty("javax.net.ssl.trustStore", cassandraTruststorePath);
-			System.setProperty("javax.net.ssl.trustStorePassword", cassandraTruststorePassword);
-			clusterBuilder.withSSL();
-		}
+            cluster = clusterBuilder.build();
+            session = cluster.connect(keyspace);
+        } catch (Exception e) {
+            logger.info("** CassandraClient isn't connected to {}", cassandraHosts);
+        }
+    }
 
-		cluster = clusterBuilder.build();
-		session = cluster.connect(keyspace);
+    private static void enableAuthentication(Cluster.Builder clusterBuilder) throws FileNotFoundException {
+        boolean authenticate = Utils.getConfig().getCassandraAuthenticate();
+        if (authenticate) {
+            String username = Utils.getConfig().getCassandraUsername();
+            String password = Utils.getConfig().getCassandraPassword();
+            if (username == null || password == null) {
+                logger.error("authentication is enabled but username or password were not supplied.");
+            } else {
+                clusterBuilder.withCredentials(username, password);
+            }
 
-	}
+        }
+    }
 
-	public static void truncateTable(String keyspace, String tableName) throws FileNotFoundException {
+    private static void enableSsl(Cluster.Builder clusterBuilder) throws FileNotFoundException {
+        boolean ssl = Utils.getConfig().getCassandraSsl();
+        if (ssl) {
+            String truststorePath = Utils.getConfig().getCassandraTruststorePath();
+            String truststorePassword = Utils.getConfig().getCassandraTruststorePassword();
+            if (truststorePath == null || truststorePassword == null) {
+                logger.error("ssl is enabled but truststorePath or truststorePassword were not supplied.");
+            } else {
+                System.setProperty("javax.net.ssl.trustStore", truststorePath);
+                System.setProperty("javax.net.ssl.trustStorePassword", truststorePassword);
+                clusterBuilder.withSSL();
+            }
+        }
+    }
 
-		if (session == null || session.isClosed()) {
-			initConnection(keyspace);
-		}
 
-		try {
+    private static void setLocalDc(Cluster.Builder clusterBuilder) throws FileNotFoundException {
+        String localDataCenter = Utils.getConfig().getLocalDataCenter();
+        if (localDataCenter != null) {
+            logger.info("localDatacenter was provided, setting Cassndra clint to use datacenter: {} as local.", localDataCenter);
+            LoadBalancingPolicy tokenAwarePolicy = new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().withLocalDc(localDataCenter).build());
+            clusterBuilder.withLoadBalancingPolicy(tokenAwarePolicy);
+        } else {
+            logger.info("localDatacenter was provided, the driver will use the datacenter of the first contact point that was reached at initialization");
+        }
+    }
 
-			if (session != null) {
-				session.execute(QueryBuilder.truncate(keyspace, tableName));
-				logger.debug("The table {}.{} was cleaned",keyspace,tableName);
-			} else {
-				throw new RuntimeException("Keyspace " + keyspace + " not connected");
-			}
-		} finally {
-			// if (cluster != null) {
-			// cluster.close();
-			// }
-		}
-	}
+    public static void truncateTable(String keyspace, String tableName) throws FileNotFoundException {
 
-	public static void close() {
-		if (cluster != null) {
-			cluster.close();
-		}
-	}
+        if (session == null || session.isClosed()) {
+            initConnection(keyspace);
+        }
 
-	public static void truncateAllKeyspaces() throws FileNotFoundException {
-		// truncateAllTables(AuditingTypesConstants.ARTIFACT_KEYSPACE);
-		truncateAllTables(AuditingTypesConstants.AUDIT_KEYSPACE);
-	}
+        try (Cluster cluster = CassandraUtils.cluster){
 
-	public static void truncateAllTables(String keyspace) throws FileNotFoundException {
+            if (session != null) {
+                session.execute(QueryBuilder.truncate(keyspace, tableName));
+                logger.debug("The table {}.{} was cleaned", keyspace, tableName);
+            } else {
+                throw new RuntimeException("Keyspace " + keyspace + " not connected");
+            }
+        }
+    }
 
-		if (session == null || session.isClosed()) {
-			initConnection(keyspace);
-		}
-		try {
+    public static void close() {
+        if (cluster != null) {
+            cluster.close();
+        }
+    }
 
-			if (session != null) {
-				Metadata metadata = cluster.getMetadata();
-				KeyspaceMetadata keyspaceMetadata = metadata.getKeyspace(keyspace);
-				if (keyspaceMetadata != null) {
-					Collection<TableMetadata> tables = keyspaceMetadata.getTables();
-					tables.forEach(table -> {
-						session.execute(QueryBuilder.truncate(table));
-						logger.debug("Table trunceted - {}", table.getName());
-					});
-				}
-			} else {
-				throw new RuntimeException("Keyspace " + keyspace + " not connected");
-			}
+    public static void truncateAllKeyspaces() throws FileNotFoundException {
+        // truncateAllTables(AuditingTypesConstants.ARTIFACT_KEYSPACE);
+        truncateAllTables(AuditingTypesConstants.AUDIT_KEYSPACE);
+    }
 
-		} finally {
-			// if (cluster != null) {
-			// cluster.close();
-			// }
-		}
-	}
+    public static void truncateAllTables(String keyspace) throws FileNotFoundException {
 
-	public static List<Row> fetchFromTable(String keyspace, String tableName,
-			List<Pair<AuditingFieldsKeysEnum, String>> fields) throws FileNotFoundException {
+        if (session == null || session.isClosed()) {
+            initConnection(keyspace);
+        }
+        try {
 
-		List<Pair<String, String>> fieldsConverted = new ArrayList<>();
+            if (session != null) {
+                Metadata metadata = cluster.getMetadata();
+                KeyspaceMetadata keyspaceMetadata = metadata.getKeyspace(keyspace);
+                if (keyspaceMetadata != null) {
+                    Collection<TableMetadata> tables = keyspaceMetadata.getTables();
+                    tables.forEach(table -> {
+                        session.execute(QueryBuilder.truncate(table));
+                        logger.debug("Table trunceted - {}", table.getName());
+                    });
+                }
+            } else {
+                throw new RuntimeException("Keyspace " + keyspace + " not connected");
+            }
+
+        } finally {
+             if (cluster != null) {
+             cluster.close();
+             }
+        }
+    }
+
+    public static List<Row> fetchFromTable(String keyspace, String tableName, List<Pair<AuditingFieldsKeysEnum, String>> fields) throws FileNotFoundException {
+
+        List<Pair<String, String>> fieldsConverted = new ArrayList<>();
 
 //		fields.forEach(pair -> {
 //			Pair<String, String> newPair = new Pair(pair.getValue0().getDisplayName(), pair.getValue1());
 //			fieldsConverted.add(newPair);
 //		});
-		
-		fields.forEach(pair ->{
-			Pair<String, String> newPair;
-			if(pair.getValue0() == AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_RESOURCE_URL ){
-			newPair = new Pair<String, String>("RESOURE_URL", pair.getValue1());
-			
-		}else{
-			newPair = new Pair<String, String>(pair.getValue0().getDisplayName(), pair.getValue1());
-		}
-		fieldsConverted.add(newPair);
-			
-		});
 
-		return fetchFromTableQuery(keyspace, tableName, fieldsConverted);
-	}
+        fields.forEach(pair -> {
+            Pair<String, String> newPair;
+            if (pair.getValue0() == AuditingFieldsKeysEnum.AUDIT_DISTRIBUTION_RESOURCE_URL) {
+                newPair = new Pair<String, String>("RESOURE_URL", pair.getValue1());
 
-	public static List<Row> fetchFromTableQuery(String keyspace, String tableName, List<Pair<String, String>> fields)
-			throws FileNotFoundException {
+            } else {
+                newPair = new Pair<String, String>(pair.getValue0().getDisplayName(), pair.getValue1());
+            }
+            fieldsConverted.add(newPair);
 
-		if (session == null || session.isClosed()) {
-			initConnection(keyspace);
-		}
-		try {
+        });
 
-			if (session != null) {
-				Select select = QueryBuilder.select().all().from(keyspace, tableName);
-				if (fields != null) {
-					// Set<Entry<AuditingFieldsKeysEnum, String>> entrySet =
-					// fields.entrySet();
-					// fields.
-					boolean multiple = (fields.size() > 1) ? true : false;
-					Where where = null;
-					int size = 0;
+        return fetchFromTableQuery(keyspace, tableName, fieldsConverted);
+    }
 
-					for (Pair<String, String> pair : fields) {
-						++size;
-						if (size == 1) {
-							where = select.where(QueryBuilder.eq(pair.getValue0(), pair.getValue1()));
-						} else {
-							where.and(QueryBuilder.eq(pair.getValue0(), pair.getValue1()));
-						}
-					}
-					if (multiple) {
-						select.allowFiltering();
-					}
+    public static List<Row> fetchFromTableQuery(String keyspace, String tableName, List<Pair<String, String>> fields)
+            throws FileNotFoundException {
 
-				}
+        if (session == null || session.isClosed()) {
+            initConnection(keyspace);
+        }
+        try {
 
-				List<Row> rows = session.execute(select).all();
-				for (Row row : rows) {
-					logger.debug("{}", row);
-				}
-				return rows;
-			}
-		} finally {
-			// if (cluster != null) {
-			// cluster.close();
-			// }
-		}
-		return null;
-	}
-	//
-	// public static void main(String[] args) throws FileNotFoundException {
-	// Map<AuditingFieldsKeysEnum, String> map = new HashMap<>();
-	// map.put(AuditingFieldsKeysEnum.AUDIT_ACTION, "Access");
-	// map.put(AuditingFieldsKeysEnum.AUDIT_STATUS, "200");
-	// // CassandraUtils.truncateTable("sdcartifact", "resources");
-	//// CassandraUtils.truncateAllTables("sdcaudit");
-	// CassandraUtils.fetchFromTable("sdcaudit", "useraccessevent", map );
-	// }
+            if (session != null) {
+                Select select = QueryBuilder.select().all().from(keyspace, tableName);
+                if (fields != null) {
+                    // Set<Entry<AuditingFieldsKeysEnum, String>> entrySet =
+                    // fields.entrySet();
+                    // fields.
+                    boolean multiple = (fields.size() > 1) ? true : false;
+                    Where where = null;
+                    int size = 0;
+
+                    for (Pair<String, String> pair : fields) {
+                        ++size;
+                        if (size == 1) {
+                            where = select.where(QueryBuilder.eq(pair.getValue0(), pair.getValue1()));
+                        } else {
+                            where.and(QueryBuilder.eq(pair.getValue0(), pair.getValue1()));
+                        }
+                    }
+                    if (multiple) {
+                        select.allowFiltering();
+                    }
+
+                }
+
+                List<Row> rows = session.execute(select).all();
+                for (Row row : rows) {
+                    logger.debug("{}", row);
+                }
+                return rows;
+            }
+        } finally {
+            // if (cluster != null) {
+            // cluster.close();
+            // }
+        }
+        return null;
+    }
+
+
+
 
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/AtomicOperationUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/AtomicOperationUtils.java
index 56c350f..e81c63f 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/AtomicOperationUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/AtomicOperationUtils.java
@@ -38,18 +38,22 @@
 import org.apache.commons.lang3.tuple.Pair;
 import org.json.JSONException;
 import org.openecomp.sdc.be.datatypes.elements.ConsumerDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
 import org.openecomp.sdc.be.model.ArtifactDefinition;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.DistributionStatusEnum;
+import org.openecomp.sdc.be.model.GroupDefinition;
 import org.openecomp.sdc.be.model.Product;
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.GroupDefinition;
 import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
 import org.openecomp.sdc.ci.tests.api.ExtentTestActions;
 import org.openecomp.sdc.ci.tests.api.Urls;
@@ -76,6 +80,7 @@
 import org.openecomp.sdc.ci.tests.utils.CsarToscaTester;
 import org.openecomp.sdc.ci.tests.utils.DistributionUtils;
 import org.openecomp.sdc.ci.tests.utils.Utils;
+import org.openecomp.sdc.ci.tests.utils.Utils;
 import org.openecomp.sdc.ci.tests.utils.rest.ArtifactRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.AssetRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
@@ -118,7 +123,7 @@
 	public static Either<Resource, RestResponse> importResource(String filePath, String fileName) {
 		try {
 			User designer = ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER);
-			ImportReqDetails importReqDetails = ElementFactory.getDefaultImportResource("ciTmpVFC");
+			ImportReqDetails importReqDetails = ElementFactory.getDefaultImportResource(ElementFactory.getResourcePrefix());
 			importReqDetails = ImportUtils.getImportResourceDetailsByPathAndName(importReqDetails, filePath, fileName);
 			RestResponse importResourceResponse = ResourceRestUtils.createImportResource(importReqDetails, designer, null);
 			return buildResourceFromResponse(importResourceResponse);
@@ -127,6 +132,26 @@
 		}
 	}
 
+	public static Either<Resource, RestResponse> importResource(ImportReqDetails importReqDetails, String filePath, String fileName, User userRole, Boolean validateState) {
+		try {
+			importReqDetails = ImportUtils.getImportResourceDetailsByPathAndName(importReqDetails, filePath, fileName);
+			RestResponse importResourceResponse = ResourceRestUtils.createImportResource(importReqDetails, userRole, null);
+
+			if (validateState) {
+				assertTrue("Import resource failed with error: " + importResourceResponse.getResponse(),importResourceResponse.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED);
+			}
+
+			if (importResourceResponse.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED) {
+				Resource resourceResponseObject = ResponseParser.convertResourceResponseToJavaObject(importResourceResponse.getResponse());
+				return Either.left(resourceResponseObject);
+			}
+			return Either.right(importResourceResponse);
+		} catch (Exception e) {
+			throw new AtomicOperationException(e);
+		}
+	}
+
+
 	public static Either<Resource, RestResponse> createResourceByType(ResourceTypeEnum resourceType, UserRoleEnum userRole, Boolean validateState) {
 		try {
 			User defaultUser = ElementFactory.getDefaultUser(userRole);
@@ -134,7 +159,7 @@
 			RestResponse resourceResp = ResourceRestUtils.createResource(defaultResource, defaultUser);
 
 			if (validateState) {
-				assertTrue(resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED);
+				assertTrue("Create resource failed with error: " + resourceResp.getResponse(),resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED);
 			}
 
 			if (resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED) {
@@ -153,7 +178,7 @@
 			RestResponse resourceResp = ResourceRestUtils.createResource(resourceDetails, defaultUser);
 
 			if (validateState) {
-				assertTrue(resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED);
+				assertTrue("Create resource failed with error: " + resourceResp.getResponse(),resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED);
 			}
 
 			if (resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED) {
@@ -192,7 +217,7 @@
 		RestResponse resourceResp = ResourceRestUtils.createResource(defaultResource, defaultUser);
 
 		if (validateState) {
-			assertTrue("actual result: " + resourceResp.getResponseMessage(), resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED);
+			assertTrue("Create resource failed with error: " + resourceResp.getResponse(), resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED);
 		}
 
 		if (resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED) {
@@ -210,7 +235,7 @@
 			RestResponse resourceResp = ResourceRestUtils.updateResource(resourceReqDetails, defaultUser, resourceReqDetails.getUniqueId());
 
 			if (validateState) {
-				assertTrue(resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_SUCCESS);
+				assertTrue("Update resource failed with error: " + resourceResp.getResponse(),resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_SUCCESS);
 			}
 
 			if (resourceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_SUCCESS) {
@@ -231,7 +256,7 @@
 		RestResponse createServiceResp = ServiceRestUtils.createService(serviceDetails, defaultUser);
 
 		if (validateState) {
-			assertTrue(createServiceResp.getErrorCode() == ServiceRestUtils.STATUS_CODE_CREATED);
+			assertTrue("Create service failed with error: " + createServiceResp.getResponse(),createServiceResp.getErrorCode() == ServiceRestUtils.STATUS_CODE_CREATED);
 		}
 
 		if (createServiceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED) {
@@ -247,7 +272,7 @@
 		RestResponse createServiceResp = ServiceRestUtils.createService(serviceDetails, defaultUser);
 
 		if (validateState) {
-			assertTrue(createServiceResp.getErrorCode() == ServiceRestUtils.STATUS_CODE_CREATED);
+			assertTrue("Create service failed with error: " + createServiceResp.getResponse(),createServiceResp.getErrorCode() == ServiceRestUtils.STATUS_CODE_CREATED);
 		}
 
 		if (createServiceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED) {
@@ -262,7 +287,7 @@
 		RestResponse createServiceResp = ServiceRestUtils.createService(serviceDetails, defaultUser);
 
 		if (validateState) {
-			assertTrue(createServiceResp.getErrorCode() == ServiceRestUtils.STATUS_CODE_CREATED);
+			assertTrue("Create service failed with error: " + createServiceResp.getResponse(),createServiceResp.getErrorCode() == ServiceRestUtils.STATUS_CODE_CREATED);
 		}
 
 		if (createServiceResp.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED) {
@@ -329,10 +354,8 @@
 			component = getComponentObject(component, userRole);
 			return Pair.of(component, null);
 		}
-		// List<LifeCycleStatesEnum> lifeCycleStatesEnumOrigList = new
-		// ArrayList<LifeCycleStatesEnum>(EnumSet.allOf(LifeCycleStatesEnum.class));
 
-		ArrayList<String> lifeCycleStatesEnumList = new ArrayList<String>();
+		ArrayList<String> lifeCycleStatesEnumList = new ArrayList<>();
 		if (curentCompState.equals(LifeCycleStatesEnum.CHECKIN) && targetState.equals(LifeCycleStatesEnum.CHECKOUT)) {
 			lifeCycleStatesEnumList.add(LifeCycleStatesEnum.CHECKIN.toString());
 			lifeCycleStatesEnumList.add(LifeCycleStatesEnum.CHECKOUT.toString());
@@ -395,16 +418,14 @@
 		}
 
 		if (validateState) {
-			assertTrue(approveDistribution.getErrorCode() == ProductRestUtils.STATUS_CODE_SUCCESS);
-			assertTrue(distributionService.getErrorCode() == ProductRestUtils.STATUS_CODE_SUCCESS);
+			assertTrue("Distribution approve failed with error: " + approveDistribution.getResponse(),approveDistribution.getErrorCode() == ProductRestUtils.STATUS_CODE_SUCCESS);
+			assertTrue("Distribute service failed with error: " + distributionService.getResponse(),distributionService.getErrorCode() == ProductRestUtils.STATUS_CODE_SUCCESS);
 			return distributionService;
 		}
 
 		return distributionService;
-
 	}
-
-
+	
 	public static void toscaValidation(Component component, String vnfFile) throws Exception {
 
 		ISdcCsarHelper fdntCsarHelper;
@@ -476,6 +497,34 @@
 		}
 	}
 
+	public static Either<ComponentInstance, RestResponse> addComponentInstanceToComponentContainer(Component compInstParent, Component compContainer, UserRoleEnum userRole, Boolean validateState, String positionX, String positionY) {
+		try {
+			User defaultUser = ElementFactory.getDefaultUser(userRole);
+			ComponentInstanceReqDetails componentInstanceDetails = ElementFactory.getComponentInstance(compInstParent);
+			componentInstanceDetails.setPosX(positionX);
+			componentInstanceDetails.setPosY(positionY);
+			RestResponse createComponentInstance = ComponentInstanceRestUtils.createComponentInstance(componentInstanceDetails, defaultUser, compContainer);
+
+			if (validateState) {
+				if (createComponentInstance.getErrorCode() == ServiceRestUtils.STATUS_CODE_NOT_FOUND)
+				{
+					throw new SkipException("Open bug DE262001");
+				}
+				else{
+					assertTrue("error - " + createComponentInstance.getErrorCode() + "instead - " + ServiceRestUtils.STATUS_CODE_CREATED, createComponentInstance.getErrorCode() == ServiceRestUtils.STATUS_CODE_CREATED);
+				}
+			}
+
+			if (createComponentInstance.getErrorCode() == ResourceRestUtils.STATUS_CODE_CREATED) {
+				ComponentInstance componentInstance = ResponseParser.convertComponentInstanceResponseToJavaObject(createComponentInstance.getResponse());
+				return Either.left(componentInstance);
+			}
+			return Either.right(createComponentInstance);
+		} catch (Exception e) {
+			throw new AtomicOperationException(e);
+		}
+	}
+
 	public static Resource getResourceObject(Component containerDetails, UserRoleEnum userRole) throws Exception {
 		// User defaultUser = ElementFactory.getDefaultUser(userRole);
 		RestResponse restResponse = ResourceRestUtils.getResource(containerDetails.getUniqueId());
@@ -619,7 +668,7 @@
 	public static Either<ComponentInstanceProperty, RestResponse> addCustomPropertyToResource(PropertyReqDetails propDetails, Resource resourceDetails, UserRoleEnum userRole, Boolean validateState) throws Exception {
 
 		User defaultUser = ElementFactory.getDefaultUser(userRole);
-		Map<String, PropertyReqDetails> propertyToSend = new HashMap<String, PropertyReqDetails>();
+		Map<String, PropertyReqDetails> propertyToSend = new HashMap<>();
 		propertyToSend.put(propDetails.getName(), propDetails);
 		Gson gson = new Gson();
 		RestResponse addPropertyResponse = PropertyRestUtils.createProperty(resourceDetails.getUniqueId(), gson.toJson(propertyToSend), defaultUser);
@@ -641,7 +690,7 @@
 	public static Either<ComponentInstanceProperty, RestResponse> updatePropertyOfResource(PropertyReqDetails propDetails, Resource resourceDetails, String propertyUniqueId, UserRoleEnum userRole, Boolean validateState) throws Exception {
 
 		User defaultUser = ElementFactory.getDefaultUser(userRole);
-		Map<String, PropertyReqDetails> propertyToSend = new HashMap<String, PropertyReqDetails>();
+		Map<String, PropertyReqDetails> propertyToSend = new HashMap<>();
 		propertyToSend.put(propDetails.getName(), propDetails);
 		Gson gson = new Gson();
 		RestResponse addPropertyResponse = PropertyRestUtils.updateProperty(resourceDetails.getUniqueId(), propertyUniqueId, gson.toJson(propertyToSend), defaultUser);
@@ -668,7 +717,7 @@
 
 		User defaultUser = ElementFactory.getDefaultUser(userRole);
 		PropertyReqDetails propDetails = ElementFactory.getPropertyDetails(propertyType);
-		Map<String, PropertyReqDetails> propertyToSend = new HashMap<String, PropertyReqDetails>();
+		Map<String, PropertyReqDetails> propertyToSend = new HashMap<>();
 		propertyToSend.put(propDetails.getName(), propDetails);
 		Gson gson = new Gson();
 		RestResponse addPropertyResponse = PropertyRestUtils.createProperty(resourceDetails.getUniqueId(), gson.toJson(propertyToSend), defaultUser);
@@ -687,6 +736,23 @@
 		return Either.right(addPropertyResponse);
 	}
 
+	public static Either<GroupDefinition, RestResponse> updateGroupPropertyOnResource(List<PropertyDataDefinition> propertyObject, Resource resource, String groupId, User user, Boolean validateState) throws Exception {
+
+		Gson gson = new Gson();
+		RestResponse updateGroupPropertyResponse = PropertyRestUtils.updateGroupProperty(resource, groupId, gson.toJson(propertyObject), user);
+
+		if (validateState) {
+			assertTrue("update group property to resource failed: " + updateGroupPropertyResponse.getResponseMessage(), updateGroupPropertyResponse.getErrorCode() == BaseRestUtils.STATUS_CODE_SUCCESS);
+		}
+
+		if (updateGroupPropertyResponse.getErrorCode() == BaseRestUtils.STATUS_CODE_SUCCESS) {
+			GroupDefinition responseGroupDefinition = ResponseParser.convertPropertyResponseToObject(updateGroupPropertyResponse.getResponse());
+			return Either.left(responseGroupDefinition);
+		}
+		return Either.right(updateGroupPropertyResponse);
+	}
+
+
 	public static RestResponse createDefaultConsumer(Boolean validateState) {
 		try {
 			ConsumerDataDefinition defaultConsumerDefinition = ElementFactory.getDefaultConsumerDetails();
@@ -725,7 +791,7 @@
 		}
 
 		private static final long serialVersionUID = 1L;
-	};
+	}
 	
 	/**
 	 * Import resource from CSAR
@@ -801,11 +867,11 @@
 			url = String.format(Urls.UI_DOWNLOAD_RESOURCE_ARTIFACT, config.getCatalogBeHost(), config.getCatalogBePort(), component.getUniqueId(), component.getToscaArtifacts().get(artifactType).getUniqueId());
 		}
 		String userId = component.getLastUpdaterUserId();
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json");
-		headersMap.put(HttpHeaderEnum.CACHE_CONTROL.getValue(), "no-cache");
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.CACHE_CONTROL.getValue(), BaseRestUtils.cacheControlHeader);
 		headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), basicAuthentication);
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 		if (userId != null) {
 			headersMap.put(HttpHeaderEnum.USER_ID.getValue(), userId);
 		}
@@ -818,7 +884,7 @@
 
 	}
 
-	public static RestResponse getDistributionStatusByDistributionId(String distributionId ,Boolean validateState) {
+	public static RestResponse getDistributionStatusByDistributionId(String distributionId, Boolean validateState) {
 
 		try {
 			User defaultUser = ElementFactory.getDefaultUser(UserRoleEnum.OPS);
@@ -834,12 +900,11 @@
 		}
 	}
 	
-	public static Either <RestResponse, Map<String, List<DistributionMonitorObject>>> getSortedDistributionStatusMap(Service service ,Boolean validateState) {
+	public static Either <RestResponse, Map<String, List<DistributionMonitorObject>>> getSortedDistributionStatusMap(Service service, Boolean validateState) {
 		
 		try {
 			ServiceDistributionStatus serviceDistributionObject = DistributionUtils.getLatestServiceDistributionObject(service);
 			RestResponse response = getDistributionStatusByDistributionId(serviceDistributionObject.getDistributionID(), true);
-
 			if(validateState) {
 				assertTrue(response.getErrorCode() == ResourceRestUtils.STATUS_CODE_SUCCESS);
 			}
@@ -863,36 +928,39 @@
 	 * @throws Exception
 	 */
 	public static Boolean distributeAndValidateService(Service service, int pollingCount, int pollingInterval) throws Exception {
-
+        int firstPollingInterval = 30000; //this value define first be polling topic time, should change if DC configuration changed  
 		Boolean statusFlag = true;
 		AtomicOperationUtils.distributeService(service,  true);
-		TimeUnit.MILLISECONDS.sleep(pollingInterval);
+		TimeUnit.MILLISECONDS.sleep(firstPollingInterval);
 		int timeOut = pollingCount * pollingInterval;
+		com.clearspring.analytics.util.Pair<Boolean,Map<String,List<String>>> verifyDistributionStatus = null;
+		
 		while (timeOut > 0) {
 			Map<String,List<DistributionMonitorObject>> sortedDistributionStatusMap = AtomicOperationUtils.getSortedDistributionStatusMap(service, true).right().value();
-			com.clearspring.analytics.util.Pair<Boolean,Map<String,List<String>>> verifyDistributionStatus = DistributionUtils.verifyDistributionStatus(sortedDistributionStatusMap);
+			verifyDistributionStatus = DistributionUtils.verifyDistributionStatus(sortedDistributionStatusMap);
 			if(verifyDistributionStatus.left.equals(false)){
-				if((verifyDistributionStatus.right != null && ! verifyDistributionStatus.right.isEmpty()) && timeOut == 0){
-					for(Entry<String, List<String>> entry : verifyDistributionStatus.right.entrySet()){
-						if(ComponentBaseTest.getExtendTest() != null){
-							ComponentBaseTest.getExtendTest().log(Status.INFO, "Consumer: " + entry.getKey() + " failed on following: "+ entry.getValue());
-							statusFlag = false;
-						}else{
-							System.out.println("Consumer: " + entry.getKey() + " failed on following: "+ entry.getValue());
-						}
-					}
-				}
 				TimeUnit.MILLISECONDS.sleep(pollingInterval);
 				timeOut-=pollingInterval;
 			}else {
 				timeOut = 0;
 			}
 		}
+		
+		if((verifyDistributionStatus.right != null && ! verifyDistributionStatus.right.isEmpty())){
+			for(Entry<String, List<String>> entry : verifyDistributionStatus.right.entrySet()){
+				if(ComponentBaseTest.getExtendTest() != null){
+					ComponentBaseTest.getExtendTest().log(Status.INFO, "Consumer: " + entry.getKey() + " failed on following: "+ entry.getValue());
+				}else{
+					System.out.println("Consumer: [" + entry.getKey() + "] failed on following: "+ entry.getValue());
+				}
+			}
+			statusFlag = false;
+		}
 		return statusFlag;
 	}
 	
 	public static Boolean distributeAndValidateService(Service service) throws Exception {
-		return distributeAndValidateService(service, 6, 10000);
+		return distributeAndValidateService(service, 10, 10000);
 	}
 
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/ElementFactory.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/ElementFactory.java
index 8224f08..d170124 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/ElementFactory.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/ElementFactory.java
@@ -20,49 +20,18 @@
 
 package org.openecomp.sdc.ci.tests.utils.general;
 
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
 import org.apache.commons.lang.StringUtils;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.datatypes.elements.ConsumerDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
-import org.openecomp.sdc.be.model.ArtifactDefinition;
-import org.openecomp.sdc.be.model.CapabilityDefinition;
-import org.openecomp.sdc.be.model.CapabilityRequirementRelationship;
-import org.openecomp.sdc.be.model.Component;
-import org.openecomp.sdc.be.model.LifecycleStateEnum;
-import org.openecomp.sdc.be.model.RelationshipImpl;
-import org.openecomp.sdc.be.model.RelationshipInfo;
-import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
-import org.openecomp.sdc.be.model.RequirementDefinition;
-import org.openecomp.sdc.be.model.Resource;
-import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.*;
 import org.openecomp.sdc.be.model.category.CategoryDefinition;
 import org.openecomp.sdc.be.model.category.GroupingDefinition;
 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
-import org.openecomp.sdc.ci.tests.datatypes.ArtifactReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ComponentInstanceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ComponentReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ImportReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ProductReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.PropertyReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceExternalReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ArtifactTypeEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ErrorInfo;
-import org.openecomp.sdc.ci.tests.datatypes.enums.LifeCycleStatesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.NormativeTypesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.PropertyTypeEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ResourceCategoryEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ServiceCategoriesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
+import org.openecomp.sdc.ci.tests.datatypes.*;
+import org.openecomp.sdc.ci.tests.datatypes.enums.*;
 import org.openecomp.sdc.ci.tests.datatypes.expected.ExpectedExternalAudit;
 import org.openecomp.sdc.ci.tests.datatypes.expected.ExpectedResourceAuditJavaObject;
 import org.openecomp.sdc.ci.tests.utils.rest.ArtifactRestUtils;
@@ -72,6 +41,12 @@
 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
 import org.openecomp.sdc.common.util.ValidationUtils;
 
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
 public class ElementFactory {
 
 	private static final String CI_SERVICE = "ciService";
@@ -131,6 +106,10 @@
 	}
 
 	// New
+	public static ResourceReqDetails getDefaultResourceByType(ResourceTypeEnum ResourceType, String resourceName, ResourceCategoryEnum resourceCategory, String vendorName, String vendorModelNumber) {
+		return getDefaultResourceByType(resourceName, NormativeTypesEnum.ROOT, resourceCategory, "jh0003", ResourceType.toString(), vendorName, vendorModelNumber);
+	}
+
 	public static ResourceReqDetails getDefaultResourceByType(ResourceTypeEnum ResourceType, String resourceName) {
 		return getDefaultResourceByType(resourceName, NormativeTypesEnum.ROOT, ResourceCategoryEnum.GENERIC_INFRASTRUCTURE, "jh0003", ResourceType.toString());
 	}
@@ -154,10 +133,10 @@
 	public static ResourceReqDetails getDefaultResource(String resourceName, NormativeTypesEnum derived, ResourceCategoryEnum category, String contactId) {
 		resourceName = (resourceName + generateUUIDforSufix());
 		String description = "Represents a generic software component that can be managed and run by a Compute Node Type.";
-		ArrayList<String> resourceTags = new ArrayList<String>();
+		ArrayList<String> resourceTags = new ArrayList<>();
 		resourceTags.add(resourceName);
 
-		ArrayList<String> derivedFrom = new ArrayList<String>();
+		ArrayList<String> derivedFrom = new ArrayList<>();
 		derivedFrom.add(derived.normativeName);
 		String vendorName = "ATT Tosca";
 		String vendorRelease = "1.0.0.wd03";
@@ -177,10 +156,10 @@
 	public static ResourceReqDetails getDefaultResource(String resourceName, Resource derived, ResourceCategoryEnum category, String contactId) {
 		resourceName = (resourceName + generateUUIDforSufix());
 		String description = "Represents a generic software component that can be managed and run by a Compute Node Type.";
-		ArrayList<String> resourceTags = new ArrayList<String>();
+		ArrayList<String> resourceTags = new ArrayList<>();
 		resourceTags.add(resourceName);
 
-		ArrayList<String> derivedFrom = new ArrayList<String>();
+		ArrayList<String> derivedFrom = new ArrayList<>();
 		derivedFrom.add(derived.getToscaResourceName());
 		String vendorName = "ATT Tosca";
 		String vendorRelease = "1.0.0.wd03";
@@ -200,7 +179,7 @@
 	public static ResourceReqDetails getDefaultResourceByType(String resourceName, NormativeTypesEnum derived, ResourceCategoryEnum category, String contactId, String resourceType) {
 		resourceName = (resourceName + resourceType + generateUUIDforSufix());
 		String description = "Represents a generic software component that can be managed and run by a Compute Node Type.";
-		ArrayList<String> resourceTags = new ArrayList<String>();
+		ArrayList<String> resourceTags = new ArrayList<>();
 		resourceTags.add(resourceName);
 		ArrayList<String> derivedFrom = null;
 		if (derived != null) {
@@ -216,6 +195,25 @@
 		return resourceDetails;
 	}
 
+	public static ResourceReqDetails getDefaultResourceByType(String resourceName, NormativeTypesEnum derived, ResourceCategoryEnum category, String contactId, String resourceType, String vendorName, String vendorModelNumber) {
+		resourceName = (resourceName + resourceType + generateUUIDforSufix());
+
+		String description = "Represents a generic software component that can be managed and run by a Compute Node Type.";
+		ArrayList<String> resourceTags = new ArrayList<>();
+		resourceTags.add(resourceName);
+		ArrayList<String> derivedFrom = null;
+		if (derived != null) {
+			derivedFrom = new ArrayList<>();
+			derivedFrom.add(derived.normativeName);
+		}
+		String vendorRelease = "1.0.0.wd03";
+		String icon = "defaulticon";
+		ResourceReqDetails resourceDetails = new ResourceReqDetails(resourceName, description, resourceTags, null, derivedFrom, vendorName, vendorRelease, contactId, icon, resourceType.toString());
+		resourceDetails.addCategoryChain(category.getCategory(), category.getSubCategory());
+		resourceDetails.setResourceVendorModelNumber(vendorModelNumber);
+		return resourceDetails;
+	}
+
 	public static ResourceReqDetails getRandomCategoryResource() {
 		ResourceReqDetails resourceDetails = getDefaultResource(ResourceCategoryEnum.getRandomElement());
 		return resourceDetails;
@@ -224,7 +222,7 @@
 	public static ResourceExternalReqDetails getDefaultResourceByType(String resourceName, ResourceCategoryEnum category, String contactId, String resourceType) {
 		resourceName = (resourceName + resourceType + generateUUIDforSufix());
 		String description = "Represents a generic software component that can be managed and run by a Compute Node Type.";
-		ArrayList<String> resourceTags = new ArrayList<String>();
+		ArrayList<String> resourceTags = new ArrayList<>();
 		resourceTags.add(resourceName);
 		String vendorName = "ATT Tosca";
 		String vendorRelease = "1.0.0.wd03";
@@ -239,11 +237,11 @@
 	public static ImportReqDetails getDefaultImportResourceByType(String resourceName, NormativeTypesEnum derived, ResourceCategoryEnum category, String contactId, String resourceType) {
 		resourceName = (resourceName + resourceType + generateUUIDforSufix());
 		String description = "Represents a generic software component that can be managed and run by a Compute Node Type.";
-		ArrayList<String> resourceTags = new ArrayList<String>();
+		ArrayList<String> resourceTags = new ArrayList<>();
 		resourceTags.add(resourceName);
 		ArrayList<String> derivedFrom = null;
 		if (derived != null) {
-			derivedFrom = new ArrayList<String>();
+			derivedFrom = new ArrayList<>();
 			derivedFrom.add(derived.normativeName);
 		}
 		String vendorName = "ATT Tosca";
@@ -310,7 +308,7 @@
 
 	public static ServiceReqDetails getDefaultService(String serviceName, ServiceCategoriesEnum category, String contactId) {
 		serviceName = (serviceName + generateUUIDforSufix());
-		ArrayList<String> tags = new ArrayList<String>();
+		ArrayList<String> tags = new ArrayList<>();
 		tags.add("serviceTag");
 		tags.add("serviceTag1");
 		tags.add(serviceName);
@@ -965,12 +963,12 @@
 		ProductReqDetails product = new ProductReqDetails(productName);
 		productName = (productName + generateUUIDforSufix());
 		product.setName(productName);
-		ArrayList<String> tags = new ArrayList<String>();
+		ArrayList<String> tags = new ArrayList<>();
 		tags.add(productName);
 		product.setTags(tags);
 		product.setProjectCode("12345");
 		product.setIcon("myIcon");
-		ArrayList<String> contacts = new ArrayList<String>();
+		ArrayList<String> contacts = new ArrayList<>();
 		// contacts.add(ElementFactory.getDefaultUser(UserRoleEnum.PRODUCT_STRATEGIST1).getUserId());
 		// contacts.add(ElementFactory.getDefaultUser(UserRoleEnum.PRODUCT_STRATEGIST2).getUserId());
 		contacts.add(ElementFactory.getDefaultUser(UserRoleEnum.PRODUCT_MANAGER1).getUserId());
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/FileHandling.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/FileHandling.java
index 9759653..7af18dd 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/FileHandling.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/FileHandling.java
@@ -20,6 +20,7 @@
 
 package org.openecomp.sdc.ci.tests.utils.general;
 
+import com.aventstack.extentreports.Status;
 import static org.testng.AssertJUnit.assertTrue;
 
 import java.io.BufferedOutputStream;
@@ -51,6 +52,15 @@
 import org.yaml.snakeyaml.Yaml;
 
 import com.aventstack.extentreports.Status;
+import java.io.*;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+
+import static org.testng.AssertJUnit.assertTrue;
 
 public class FileHandling {
 
@@ -94,7 +104,6 @@
 		return dataTypesMap;
 	}
 //	-------------------------------------------------------------------------------------------------
-	
 
 	/**
 	 * @param folder, folder name under "Files" folder
@@ -154,7 +163,7 @@
 	public static String getVnfRepositoryPath() {
 		return getFilePath("VNFs");
 	}
-	
+
 	public static String getPortMirroringRepositoryPath() {
 		return getFilePath("PortMirroring");
 	}
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/FileUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/FileUtils.java
index 28964e2..f0ca9dd 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/FileUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/FileUtils.java
@@ -104,8 +104,7 @@
 		return loadPayloadFile(newList, pattern, isBase64);
 	}
 
-	public static String loadPayloadFile(List<String> listFileName, String pattern, Boolean isBase64)
-			throws IOException {
+	public static String loadPayloadFile(List<String> listFileName, String pattern, Boolean isBase64) throws IOException {
 		String fileName;
 		String payload = null;
 		fileName = FileUtils.getFilePathFromListByPattern(listFileName, pattern);
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/OnboardingUtillViaApis.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/OnboardingUtillViaApis.java
index 76e4c51..8637a9b 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/OnboardingUtillViaApis.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/OnboardingUtillViaApis.java
@@ -30,15 +30,17 @@
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import com.aventstack.extentreports.Status;
+import com.clearspring.analytics.util.Pair;
+import com.google.gson.Gson;
+import fj.data.Either;
 
 import org.apache.commons.codec.binary.Base64;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.ci.tests.api.ExtentTestActions;
 import org.openecomp.sdc.ci.tests.api.Urls;
 import org.openecomp.sdc.ci.tests.config.Config;
 import org.openecomp.sdc.ci.tests.datatypes.AmdocsLicenseMembers;
@@ -53,7 +55,6 @@
 import org.openecomp.sdc.ci.tests.utils.Utils;
 import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
 
-import com.aventstack.extentreports.Status;
 import com.clearspring.analytics.util.Pair;
 import com.google.gson.Gson;
 
@@ -61,28 +62,28 @@
 
 public class OnboardingUtillViaApis {
 
-	protected static Map<String, String> prepareHeadersMap(String userId) {
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json");
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), "application/json");
-		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), userId);
-		return headersMap;
-	}
-	
+//	protected static Map<String, String> prepareHeadersMap(String userId) {
+//		Map<String, String> headersMap = new HashMap<String, String>();
+//		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json");
+//		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), "application/json");
+//		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), userId);
+//		return headersMap;
+//	}
+
 	public static Pair<String, VendorSoftwareProductObject> createVspViaApis(ResourceReqDetails resourceReqDetails, String filepath, String vnfFile, User user) throws Exception {
 
 		VendorSoftwareProductObject vendorSoftwareProductObject = new VendorSoftwareProductObject();
-		ExtentTestActions.log(Status.INFO, String.format("Create Vendor License"));
-		AmdocsLicenseMembers amdocsLicenseMembers = OnboardingUtils.createVendorLicense(user);
-		Pair<String, Map<String, String>> createVendorSoftwareProduct = OnboardingUtils.createVendorSoftwareProduct(resourceReqDetails, vnfFile, filepath, user, amdocsLicenseMembers);
-		Map<String, String> map = createVendorSoftwareProduct.right;
-		vendorSoftwareProductObject.setAttContact(map.get("attContact"));
-		vendorSoftwareProductObject.setCategory(map.get("category"));
-		vendorSoftwareProductObject.setComponentId(map.get("componentId"));
-		vendorSoftwareProductObject.setDescription(map.get("description"));
-		vendorSoftwareProductObject.setSubCategory(map.get("subCategory"));
-		vendorSoftwareProductObject.setVendorName(map.get("vendorName"));
-		vendorSoftwareProductObject.setVspId(map.get("vspId"));
+
+		AmdocsLicenseMembers amdocsLicenseMembers = VendorLicenseModelRestUtils.createVendorLicense(user);
+		Pair<String, VendorSoftwareProductObject> createVendorSoftwareProduct = VendorSoftwareProductRestUtils.createVendorSoftwareProduct(resourceReqDetails, vnfFile, filepath, user, amdocsLicenseMembers);
+		VendorSoftwareProductObject map = createVendorSoftwareProduct.right;
+		vendorSoftwareProductObject.setAttContact(map.getAttContact());
+		vendorSoftwareProductObject.setCategory(map.getCategory());
+		vendorSoftwareProductObject.setComponentId(map.getComponentId());
+		vendorSoftwareProductObject.setDescription(map.getDescription());
+		vendorSoftwareProductObject.setSubCategory(map.getSubCategory());
+		vendorSoftwareProductObject.setVendorName(map.getVendorName());
+		vendorSoftwareProductObject.setVspId(map.getVspId());
 		Pair<String, VendorSoftwareProductObject> pair = new Pair<String, VendorSoftwareProductObject>(createVendorSoftwareProduct.left, vendorSoftwareProductObject);
 		return pair;
 	}
@@ -109,18 +110,18 @@
 		
 		return resource; 
 	}*/
-
-	public static Resource createResourceFromVSP(ResourceReqDetails resourceDetails, UserRoleEnum user) throws Exception {
-		Resource resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, user, true).left().value();
-
-		return resource;
-	}
-
 	public static Resource createResourceFromVSP(ResourceReqDetails resourceDetails) throws Exception {
 		Resource resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
-		
 		return resource;
+
 	}
+	
+	public static Resource createResourceFromVSP(ResourceReqDetails resourceDetails, UserRoleEnum userRole) throws Exception {
+		Resource resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, userRole, true).left().value();
+		return resource;
+
+	}
+	
 	public static void downloadToscaCsarToDirectory(Component component, File file) {
 		try {
 			Either<String, RestResponse> componentToscaArtifactPayload = AtomicOperationUtils.getComponenetArtifactPayload(component, "assettoscacsar");
@@ -236,7 +237,7 @@
 		Config config = Utils.getConfig();
 		String url = String.format(Urls.GET_VENDOR_SOFTWARE_PRODUCT, config.getCatalogBeHost(), config.getCatalogBePort(), vspId);
 		String userId = user.getUserId();
-		Map<String, String> headersMap = prepareHeadersMap(userId);
+		Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
 		headersMap.put(HttpHeaderEnum.X_ECOMP_REQUEST_ID_HEADER.getValue(), "123456");
 		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), "*/*");
 		headersMap.put("Accept-Encoding", "gzip, deflate, br");
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/OnboardingUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/OnboardingUtils.java
index dc38d40..c1950df 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/OnboardingUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/OnboardingUtils.java
@@ -20,268 +20,98 @@
 
 package org.openecomp.sdc.ci.tests.utils.general;
 
-import static org.testng.AssertJUnit.assertEquals;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.nio.file.FileSystems;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.mime.MultipartEntityBuilder;
-import org.apache.http.entity.mime.content.FileBody;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONValue;
 import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
 import org.openecomp.sdc.ci.tests.api.Urls;
 import org.openecomp.sdc.ci.tests.config.Config;
-import org.openecomp.sdc.ci.tests.datatypes.AmdocsLicenseMembers;
-import org.openecomp.sdc.ci.tests.datatypes.LicensingData;
-import org.openecomp.sdc.ci.tests.datatypes.LicensingVersion;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.VendorSoftwareProductObject;
-import org.openecomp.sdc.ci.tests.datatypes.VendorSoftwareProductObjectReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.enums.CvfcTypeEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ResourceCategoryEnum;
 import org.openecomp.sdc.ci.tests.datatypes.http.HttpHeaderEnum;
 import org.openecomp.sdc.ci.tests.datatypes.http.HttpRequest;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.Utils;
-import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
 
-import com.aventstack.extentreports.Status;
-import com.clearspring.analytics.util.Pair;
-import com.google.gson.Gson;
+import java.util.*;
 
 public class OnboardingUtils {
 
 	/**
 	 * excluded VNF file list
 	 */
-	protected static List<String> exludeVnfList =
-//			new ArrayList<String>();
-
-			Arrays.asList(
-
-//			new VNFs
-					"Vhss-epc-rdm3-lab-vf-0921-v2.0-MOBILITY-10-20.zip", "Apndns-1710-vf-v3.0-10-20.zip",
-					"HeatCandidate_2017-09-22_01-48_55Name_2016-182-asbg-nsbg-tsbg-v1.0-(VOIP).zip", "HeatCandidate_2017-09-22_01-47_55Name_2016-182-asbg-nsbg-tsbg-v7.0-(VOIP).zip",
-					"Efmc-dbe-nin-v24.0-VOIP-10-20.zip", "VF_LMSP_v5-062317-V3.0-(Mobility).zip", "base_bwks_nfm_volume-236262502.zip",
-
-//			newest failed VNFs
-					"HeatCandidate_2017-09-20_15-07_66Name_2016-20-visbc1vf-v4.0-(VOIP).zip",
-					"HeatCandidate_2017-09-20_15-06_66Name_2016-20-visbc1vf-v6.0-(VOIP).zip", "1-Vf-zrdm5bpxtc02-092017-(MOBILITY)_v3.0.zip",
-					"1-2017-491-4vshaken-HTTP-CM-vf-(VOIP)_v2.0.zip"
-
-			);
+	public static List<String> exludeVnfList =
+//		new ArrayList<>();
+	Arrays.asList(
+//		DUPLICATE_RESOURCE_ID_IN_DIFFERENT_FILES:
+		"2017-376_vMOG_11_1.zip",
+		"HeatCandidate_2017-09-20_15-06_66Name_2016-20-visbc1vf-v6.0-(VOIP).zip",
+		"1 Apndns-1710-vf v3.0.zip",
+		"1 AVPN_vRE_BV_volume-V2.zip",
+		"1-Vf-zrdm5bpxtc02-092017-(MOBILITY)_v3.0.zip",
+		"1-Mobility_vprobe_fe_11_2_1_vf_(MOBILITY)_v1.0.zip",
+//		ORCHESTRATION_NOT_FOUND:
+		"1-2017-491-4vshaken-HTTP-CM-vf-(VOIP)_v2.0.zip",
+//		did not succeed to create package of new VSP  expected:<200> but was:<500>:
+		"1-Riverbed-WANx1710VFv_v2.0.zip",
+		"1-LMSP_v5-062317_v3.0.zip",
+		"1-VF-Cisco-vCSR-1710_v2.0.zip",
+		"1-mDNS-preload_1710-0914_v3.0.zip",
+		"1-Firewall_170_Pala_Aloto_VF_v2.0.zip",
+		"2-mDNS-preload-1710-0914_v3.1VF.zip",
+		"1-2016-233_xsp_bfsa_nin2-vf-V1.0-VOIP-10-20.zip",
+//		did not succeed to submit new VSP expected:<200> but was:<417>
+		"1-VF_vEPDG_v4.0.zip",
+		"1-VF-2017-491_9vShaken-F5-LB_v1.0.zip",
+		"2-2016-73_Mow-AVPN-vpe-BV-L_v1.0.zip",
+		"VF-2017389vTSBCDPA2-v4.0.zip",
+		"1-vEPDG_V1.0(3).zip",
+		"1-vHSS-EPC-RDM3-Lab-VF-0830_V3.0.zip",
+		"2-2016-73_Mow-AVPN-vPE-BV-L_VF_V2.0_1027.zip",
+		"1-ADIOD_base_vPE_BV_v9.0.zip",
+		"Vhss-epc-rdm3-lab-vf-0921-v2.0-MOBILITY-10-20.zip",
+		"1-Vhss-epc-rdm3-lab-vf-0921_VF00816v2.0-MOBILITY-10-20.zip",
+		"1-VF-vUSP-CCF-DB-0620_v1.0base_vDB.zip",
+		"1-Vusp_vhss-ims_cm-repo1_V1.zip",
+		"1-base_vepdg_volume_v4.0.zip",
+		"1-Vocg_1710-2017-509(2)_v1.0.zip",
+		"1-2016-20-vISBC3VF_v3.0.zip",
+		"Apndns-1710-vf-v3.0-10-20.zip",
+		"1-VF-EFMC_DBE_Nin_v27.0.zip",
+		"2-APNDNS_1710-VF_v4.0.zip",
+		"1-Mow_adig_vpe_bv-V3.0.zip",
+		"1-VF-2017-488_ADOID_vPE_v9.0.zip",
+		"1-MOBT_Nimbus_3_Sprint-1.zip",
+		"1-VF-2017-491_9vShaken-CM_v1.0.zip",
+		"1-VF_zrdm5bpxtc02_092017_v2.0.zip",
+//		Error: TOSCA yaml file %1 cannot be modeled to VF as it does not contain \u0027topology_template
+		"1-VF-Checkpoint_vFW-1710_v1.0.zip"
+	);
 
 	/**
 	 * additional files to exludeVnfList files for tosca parser tests
 	 */
 	protected static List<String> exludeVnfListForToscaParser = //new ArrayList<String>();
-	Arrays.asList("1-Vvig-062017-(MOBILITY)_v5.1.zip",
-			"HeatCandidate_2017-09-22_01-43_57Name_2017389vtsbc4vf-v1.0-(VOIP).zip",
-			"1-Mvm-sbc-1710-092017-(MOBILITY)_v7.0.zip",
-			"1-2017-492-5vshaken-SIP-AS-vf-(VOIP)_v2.0.zip",
-			"HeatCandidate_2017-09-20_13-37_70Name_2017-491-4vshaken-HTTP-CM-vf-v1.0-(VOIP)_10202017.zip", "1-201712-488-adiod-vpe-(Layer-0-3)_v2.0.zip",
-			"2017-502.zip",
-			"1-2017-505-urlb-vhepe-(Layer-0-3)_v2.0.zip",
-			"2017-376_vMOG_11_1.zip",
-			"HeatCandidate_2017-09-22_00-55_62Name_2017-491-6vshaken-http-cm-vf-v1.0-(VOIP).zip", "HeatCandidate_2017-09-22_01-30_60Name_Vdbe-vsp-15.1x49-d50.3-v3.0-(VOIP).zip",
-			"HeatCandidate_2017-09-22_01-35_59Name_2017-418-afx-v1.0.zip",
-			"1-2017-488-adiod-vpe-(Layer-0-3)_v-5.0.zip",
-			"HeatCandidate_2017-09-22_01-42_57Name_2017389vtsbc4vf-v10.0-(VOIP).zip",
-			"HeatCandidate_2017-09-20_13-47_68Name_2017-492-5vshaken-SIP-AS-vf-v1.0-(VOIP)_10202017.zip", "1-2016-20-visbc3vf-(VOIP)_v2.1.zip",
-			"1-2017-404_vUSP_vCCF_AIC3.0-(VOIP)_v6.0.zip", "1-2017389vtsbc4vf-(VOIP)_v11.0.zip",
-			"HeatCandidate_2017-09-22_01-32_60Name_Vdbe-vsp-15.1x49-d50.3-v1.0-(VOIP).zip", "1-2017-418-afx-v1.1.zip");
+	Arrays.asList(
+		"1-Vvig-062017-(MOBILITY)_v5.1.zip",
+		"1-Mvm-sbc-1710-092017-(MOBILITY)_v7.0.zip",
+		"1-2017-492-5vshaken-SIP-AS-vf-(VOIP)_v2.0.zip",
+		"1-201712-488-adiod-vpe-(Layer-0-3)_v2.0.zip",
+		"2017-502.zip",
+		"1-2017-505-urlb-vhepe-(Layer-0-3)_v2.0.zip",
+		"2017-376_vMOG_11_1.zip",
+		"HeatCandidate_2017-09-22_01-30_60Name_Vdbe-vsp-15.1x49-d50.3-v3.0-(VOIP).zip",
+		"HeatCandidate_2017-09-22_01-42_57Name_2017389vtsbc4vf-v10.0-(VOIP).zip",
+		"HeatCandidate_2017-09-20_13-47_68Name_2017-492-5vshaken-SIP-AS-vf-v1.0-(VOIP)_10202017.zip",
+		"1-2016-20-visbc3vf-(VOIP)_v2.1.zip",
+		"1-2017-404_vUSP_vCCF_AIC3.0-(VOIP)_v6.0.zip",
+		"1-2017389vtsbc4vf-(VOIP)_v11.0.zip"
+	);
 	
-	public OnboardingUtils() {
-	}
-
-	public static Pair<String, Map<String, String>> createVendorSoftwareProduct(ResourceReqDetails resourceReqDetails, String heatFileName, String filepath, User user, AmdocsLicenseMembers amdocsLicenseMembers, Map<CvfcTypeEnum, String> cvfcArtifacts)
-			throws Exception {
-
-		Pair<String, Map<String, String>> pair = createVSP(resourceReqDetails, heatFileName, filepath, user, amdocsLicenseMembers);
-		String vspid = pair.right.get("vspId");
-		if(cvfcArtifacts != null && ! cvfcArtifacts.isEmpty()){
-			OnboardingUtils.addCvfcArtifacts(cvfcArtifacts, vspid, user, null);
-
-		}
-		prepareVspForUse(user, vspid, "0.1");
-		return pair;
-	}
-
-	public static Pair<String, Map<String, String>> createVendorSoftwareProduct(ResourceReqDetails resourceReqDetails, String heatFileName, String filepath, User user, AmdocsLicenseMembers amdocsLicenseMembers)
-			throws Exception {
-
-		Map<CvfcTypeEnum, String> cvfcArtifacts = new HashMap<>();
-		return createVendorSoftwareProduct(resourceReqDetails, heatFileName, filepath, user, amdocsLicenseMembers, cvfcArtifacts);
-	}
-
-//	duplicate function
-	public static void prepareVspForUse(User user, String vspid, String vspVersion) throws Exception {
-
-		RestResponse checkin = OnboardingUtils.checkinVendorSoftwareProduct(vspid, user, vspVersion);
-		assertEquals("did not succeed to checking new VSP", 200, checkin.getErrorCode().intValue());
-
-		RestResponse submit = OnboardingUtils.submitVendorSoftwareProduct(vspid, user, vspVersion);
-		assertEquals("did not succeed to submit new VSP", 200, submit.getErrorCode().intValue());
-
-		RestResponse createPackage = OnboardingUtils.createPackageOfVendorSoftwareProduct(vspid, user, vspVersion);
-		assertEquals("did not succeed to create package of new VSP ", 200, createPackage.getErrorCode().intValue());
-
-//		ComponentBaseTest.getExtendTest().log(Status.INFO, "Succeeded in creating the vendor software product");
-	}
-
-	public static VendorSoftwareProductObject createAndFillVendorSoftwareProduct(ResourceReqDetails resourceReqDetails, String heatFileName, String filePath, User user, AmdocsLicenseMembers amdocsLicenseMembers, Map<CvfcTypeEnum, String> cvfcArtifacts)
-			throws Exception {
-
-		Pair<String, Map<String, String>> createVendorSoftwareProduct = OnboardingUtils.createVendorSoftwareProduct(resourceReqDetails, heatFileName, filePath, user, amdocsLicenseMembers, cvfcArtifacts);
-		VendorSoftwareProductObject vendorSoftwareProductObject = fillVendorSoftwareProductObjectWithMetaData(heatFileName, createVendorSoftwareProduct);
-		return vendorSoftwareProductObject;
-
-	}
-
-	public static void updateVendorLicense(AmdocsLicenseMembers amdocsLicenseMembers, User user, String vlmVersion) throws Exception {
-
-		RestResponse checkoutVendorLicense = checkoutVendorLicense(amdocsLicenseMembers.getVendorId(), user, vlmVersion);
-		assertEquals("did not succeed to checkout vendor license", 200, checkoutVendorLicense.getErrorCode().intValue());
-
-		RestResponse checkinVendorLicense = checkinVendorLicense(amdocsLicenseMembers.getVendorId(), user, vlmVersion);
-		assertEquals("did not succeed to checkin vendor license", 200, checkinVendorLicense.getErrorCode().intValue());
-
-		RestResponse submitVendorLicense = submitVendorLicense(amdocsLicenseMembers.getVendorId(), user, vlmVersion);
-		assertEquals("did not succeed to submit vendor license", 200, submitVendorLicense.getErrorCode().intValue());
-
-		if(ComponentBaseTest.getExtendTest() != null){
-			ComponentBaseTest.getExtendTest().log(Status.INFO, "Succeeded in updating the vendor license");
-		}
-	}
-
-	public static Pair<String, Map<String, String>> createVSP(ResourceReqDetails resourceReqDetails, String heatFileName, String filepath, User user, AmdocsLicenseMembers amdocsLicenseMembers) throws Exception {
-		String vspName = handleFilename(heatFileName);
-
-		if(ComponentBaseTest.getExtendTest() != null){
-			ComponentBaseTest.getExtendTest().log(Status.INFO, "Starting to create the vendor software product");
-		}
-
-		Pair<RestResponse, Map<String, String>> createNewVspPair = createNewVendorSoftwareProduct(resourceReqDetails, vspName, amdocsLicenseMembers, user);
-		RestResponse createNewVendorSoftwareProduct = createNewVspPair.left;
-		assertEquals("did not succeed to create new VSP", 200,createNewVendorSoftwareProduct.getErrorCode().intValue());
-		String vspid = ResponseParser.getValueFromJsonResponse(createNewVendorSoftwareProduct.getResponse(), "vspId");
-		String componentId = ResponseParser.getValueFromJsonResponse(createNewVendorSoftwareProduct.getResponse(), "componentId");
-
-		Map<String, String> vspMeta = createNewVspPair.right;
-		Map<String, String> vspObject = new HashMap<String, String>();
-		Iterator<String> iterator = vspMeta.keySet().iterator();
-		while(iterator.hasNext()){
-			Object key = iterator.next();
-			Object value = vspMeta.get(key);
-			vspObject.put(key.toString(), value.toString());
-		}
-		vspObject.put("vspId", vspid);
-		vspObject.put("componentId", componentId);
-		vspObject.put("vendorName", amdocsLicenseMembers.getVendorLicenseName());
-		vspObject.put("attContact", user.getUserId());
-
-		RestResponse uploadHeatPackage = uploadHeatPackage(filepath, heatFileName, vspid, user, "0.1");
-		assertEquals("did not succeed to upload HEAT package", 200, uploadHeatPackage.getErrorCode().intValue());
-
-		RestResponse validateUpload = validateUpload(vspid, user, "0.1");
-		assertEquals("did not succeed to validate upload process, reason: " + validateUpload.getResponse(), 200, validateUpload.getErrorCode().intValue());
-
-		Pair<String, Map<String, String>> pair = new Pair<String, Map<String, String>>(vspName, vspObject);
-
-		return pair;
-	}
-
-	public static void updateVspWithVfcArtifacts(String filepath, String vspId, String updatedSnmpPoll, String updatedSnmpTrap, String componentId, User user, String vspVersion) throws Exception{
-		RestResponse checkout = checkoutVendorSoftwareProduct(vspId, user, vspVersion);
-		assertEquals("did not succeed to checkout new VSP", 200, checkout.getErrorCode().intValue());
-//		ExtentTestActions.log(Status.INFO, "Deleting SNMP POLL");
-		deleteArtifactByType(componentId, vspId, user, CvfcTypeEnum.SNMP_POLL);
-//		ExtentTestActions.log(Status.INFO, "Deleting SNMP TRAP");
-		deleteArtifactByType(componentId, vspId, user, CvfcTypeEnum.SNMP_TRAP);
-		addVFCArtifacts(filepath, updatedSnmpPoll, updatedSnmpTrap, vspId, user, componentId);
-		prepareVspForUse(user, vspId, vspVersion);
-	}
-
-	private static RestResponse deleteArtifactByType(String componentId, String vspId, User user, CvfcTypeEnum snmpType) throws Exception
-	{
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.DELETE_AMDOCS_ARTIFACT_BY_TYPE, config.getCatalogBeHost(),config.getCatalogBePort(), vspId, componentId, snmpType.getValue());
-		String userId = user.getUserId();
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-
-		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendDelete(url, headersMap);
-		return response;
-	}
-
-//	duplicated method
-	public static String updateVendorSoftwareProduct(String vspId, String HeatFileName, String filepath, User user, String vspVersion)
-		throws Exception, Throwable {
-		String vspName = OnboardingUtils.handleFilename(HeatFileName);
-		ComponentBaseTest.getExtendTest().log(Status.INFO, "Starting to update the vendor software product");
-
-		RestResponse checkout = OnboardingUtils.checkoutVendorSoftwareProduct(vspId, user, vspVersion);
-		assertEquals("did not succeed to checkout new VSP", 200, checkout.getErrorCode().intValue());
-
-		RestResponse uploadHeatPackage = OnboardingUtils.uploadHeatPackage(filepath, HeatFileName, vspId, user, vspVersion);
-		assertEquals("did not succeed to upload HEAT package", 200, uploadHeatPackage.getErrorCode().intValue());
-
-		RestResponse validateUpload = OnboardingUtils.validateUpload(vspId, user, vspVersion);
-		assertEquals("did not succeed to validate upload process", 200, validateUpload.getErrorCode().intValue());
-
-		RestResponse checkin = OnboardingUtils.checkinVendorSoftwareProduct(vspId, user, vspVersion);
-		assertEquals("did not succeed to checking VSP", 200, checkin.getErrorCode().intValue());
-
-		RestResponse submit = OnboardingUtils.submitVendorSoftwareProduct(vspId, user, vspVersion);
-		assertEquals("did not succeed to submit VSP", 200, submit.getErrorCode().intValue());
-
-		RestResponse createPackage = OnboardingUtils.createPackageOfVendorSoftwareProduct(vspId, user, vspVersion);
-		assertEquals("did not succeed to update package of VSP ", 200, createPackage.getErrorCode().intValue());
-
-		ComponentBaseTest.getExtendTest().log(Status.INFO, "Succeeded in updating the vendor software product");
-
-		return vspName;
-	}
-
-	public static void updateVendorSoftwareProductToNextVersion(VendorSoftwareProductObject vendorSoftwareProductObject, String toVspVersion, User user)
-			throws Exception, Throwable {
-
-		RestResponse checkout = checkoutVendorSoftwareProduct(vendorSoftwareProductObject.getVspId(), user, vendorSoftwareProductObject.getVersion());
-		assertEquals("did not succeed to checkout new VSP", 200, checkout.getErrorCode().intValue());
-
-		RestResponse checkin = checkinVendorSoftwareProduct(vendorSoftwareProductObject.getVspId(), user, vendorSoftwareProductObject.getVersion());
-		assertEquals("did not succeed to checking VSP", 200, checkin.getErrorCode().intValue());
-
-		RestResponse submit = submitVendorSoftwareProduct(vendorSoftwareProductObject.getVspId(), user, vendorSoftwareProductObject.getVersion());
-		assertEquals("did not succeed to submit VSP", 200, submit.getErrorCode().intValue());
-
-		vendorSoftwareProductObject.setVersion(toVspVersion);
-	}
-
 	public static String handleFilename(String heatFileName) {
-		final String namePrefix = "ciVFOnboarded-";
+		final String namePrefix = String.format("%sVF%s", ElementFactory.getResourcePrefix(), "Onboarded-");
 		final String nameSuffix = "-" + getShortUUID();
 
 		String subHeatFileName = heatFileName.substring(0, heatFileName.lastIndexOf("."));
@@ -299,498 +129,22 @@
 		return vnfName;
 	}
 	
-	public static String addVFCArtifacts(String filepath, String snmpPoll, String snmpTrap, String vspid, User user, String vspComponentId) throws Exception{
-		vspComponentId = (vspComponentId == null) ? getVSPComponentId(vspid, user) : vspComponentId;
-		if (vspComponentId != null){
-			if (snmpPoll != null){
-//				ExtentTestActions.log(Status.INFO, "Adding VFC artifact of type SNMP POLL with the file " + snmpPoll);
-				RestResponse uploadSnmpPollArtifact = uploadSnmpPollArtifact(filepath, snmpPoll, vspid, user, vspComponentId);
-				assertEquals("Did not succeed to add SNMP POLL", 200, uploadSnmpPollArtifact.getErrorCode().intValue());
-			}
-			if (snmpTrap != null){
-//				ExtentTestActions.log(Status.INFO, "Adding VFC artifact of type SNMP TRAP with the file " + snmpTrap);
-				RestResponse uploadSnmpTrapArtifact = uploadSnmpTrapArtifact(filepath, snmpTrap, vspid, user, vspComponentId);
-				assertEquals("Did not succeed to add SNMP TRAP", 200, uploadSnmpTrapArtifact.getErrorCode().intValue());
-			}
-		}
-		
-		return vspComponentId;
-	}
-
-	public static String addCvfcArtifacts(Map<CvfcTypeEnum, String> componentVfcArtifacts, String vspid, User user, String vspComponentId) throws Exception{
-		vspComponentId = (vspComponentId == null) ? getVSPComponentId(vspid, user) : vspComponentId;
-		if (vspComponentId != null){
-			for(Map.Entry<CvfcTypeEnum, String> entry : componentVfcArtifacts.entrySet()){
-//				ExtentTestActions.log(Status.INFO, "Adding VFC artifact of type " + entry.getKey().getValue() + " with the file " + entry.getValue());
-				RestResponse uploadSnmpPollArtifact = uploadCvfcArtifact(entry.getValue(), entry.getKey().getValue(), vspid, user, vspComponentId);
-				assertEquals("Did not succeed to add " + entry.getKey().getValue(), BaseRestUtils.STATUS_CODE_SUCCESS, uploadSnmpPollArtifact.getErrorCode().intValue());
-			}
-		}
-		return vspComponentId;
-	}
-
-	public static String addVFCArtifacts(String filepath, String snmpPoll, String snmpTrap, String vspid, User user) throws Exception{
-		return addVFCArtifacts(filepath, snmpPoll, snmpTrap, vspid, user, null);
-	}
-
-	public static RestResponse uploadCvfcArtifact(String filepath, String cvfcType, String vspid, User user, String vspComponentId) throws FileNotFoundException, IOException, ClientProtocolException {
-		Config config = Utils.getConfig();
-		String snmpPollUrl = String.format(Urls.UPLOAD_AMDOCS_ARTIFACT, config.getCatalogBeHost(),config.getCatalogBePort(), vspid, vspComponentId, cvfcType);
-		return uploadFile(filepath, null, snmpPollUrl, user);
-	}
-
-
-	private static RestResponse uploadSnmpPollArtifact(String filepath, String zipArtifact, String vspid, User user,
-													   String vspComponentId) throws FileNotFoundException, IOException, ClientProtocolException {
-		Config config = Utils.getConfig();
-		String snmpPollUrl = String.format(Urls.UPLOAD_SNMP_POLL_ARTIFACT, config.getCatalogBeHost(),config.getCatalogBePort(), vspid, vspComponentId);
-		return uploadFile(filepath, zipArtifact, snmpPollUrl, user);
-	}
-
-	private static RestResponse uploadSnmpTrapArtifact(String filepath, String zipArtifact, String vspid, User user,
-													   String vspComponentId) throws FileNotFoundException, IOException, ClientProtocolException {
-		Config config = Utils.getConfig();
-		String snmpTrapUrl = String.format(Urls.UPLOAD_SNMP_POLL_ARTIFACT, config.getCatalogBeHost(),config.getCatalogBePort(), vspid, vspComponentId);
-		return uploadFile(filepath, zipArtifact, snmpTrapUrl, user);
-	}
-	
-	private static RestResponse deleteSnmpArtifact(String componentId, String vspId, User user, SnmpTypeEnum snmpType) throws Exception
-	{
-		Config config = Utils.getConfig();
-		String url = String.format("http://%s:%s/onboarding-api/v1.0/vendor-software-products/%s/versions/0.1/components/%s/monitors/%s", 
-				config.getCatalogBeHost(),config.getCatalogBePort(), vspId, componentId, snmpType.getValue());
-		String userId = user.getUserId();
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-
-		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendDelete(url, headersMap);
-		return response;
-	}
-
-	private static String getVSPComponentId(String vspid, User user) throws Exception, JSONException {
-		RestResponse components = getVSPComponents(vspid, user);
-		String response = components.getResponse();
-		Map<String, Object> responseMap = (Map<String, Object>) JSONValue.parse(response);
-		JSONArray results = (JSONArray)responseMap.get("results");
-		for (Object res : results){
-			Map<String, Object> compMap= (Map<String, Object>) JSONValue.parse(res.toString());
-			String componentId = compMap.get("id").toString();
-			return componentId;
-		}
-		return null;
-	}
-
-	private static RestResponse getVSPComponents(String vspid, User user) throws Exception{
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.GET_VSP_COMPONENTS, config.getCatalogBeHost(),config.getCatalogBePort(), vspid);
-		String userId = user.getUserId();
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-
-		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendGet(url, headersMap);
-		return response;
-	}
-
-	private static RestResponse getVLMComponentByVersion(String vlmId, String vlmVersion, User user) throws Exception{
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.GET_VLM_COMPONENT_BY_VERSION, config.getCatalogBeHost(),config.getCatalogBePort(), vlmId,vlmVersion);
-		String userId = user.getUserId();
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-
-		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendGet(url, headersMap);
-		return response;
-	}
-
-	public static boolean validateVspExist(String vspId, String vspVersion, User user) throws Exception {
-		RestResponse restResponse = getVSPComponentByVersion(vspId, vspVersion, user);
-		assertEquals(String.format("Vsp version not updated, reponse message: %s", restResponse.getResponse()),restResponse.getErrorCode().intValue(),200);
-		return (restResponse.getErrorCode()==200);
-	}
-
-	public static boolean validateVlmExist(String vlmId, String vlmVersion, User user) throws Exception {
-		RestResponse restResponse = getVLMComponentByVersion(vlmId, vlmVersion, user);
-		assertEquals(String.format("VLM version not updated, reponse code message: %s", restResponse.getResponse()),restResponse.getErrorCode().intValue(),200);
-		return (restResponse.getErrorCode()==200);
-	}
-
-
-	private static RestResponse getVSPComponentByVersion(String vspId, String vspVersion, User user) throws Exception{
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.GET_VSP_COMPONENT_BY_VERSION, config.getCatalogBeHost(),config.getCatalogBePort(), vspId,vspVersion);
-		String userId = user.getUserId();
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-
-		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendGet(url, headersMap);
-		return response;
-	}
-
-//	Duplicate method
-	public static AmdocsLicenseMembers createVendorLicense(User user) throws Exception {
-		
-		AmdocsLicenseMembers amdocsLicenseMembers;
-//		ComponentBaseTest.getExtendTest().log(Status.INFO, "Starting to create the vendor license");
-		String vendorLicenseName = "ciLicense" + OnboardingUtils.getShortUUID();
-		RestResponse vendorLicenseResponse = OnboardingUtils.createVendorLicenseModels_1(vendorLicenseName, user);
-		assertEquals("did not succeed to create vendor license model", 200, vendorLicenseResponse.getErrorCode().intValue());
-		String vendorId = ResponseParser.getValueFromJsonResponse(vendorLicenseResponse.getResponse(), "value");
-
-		RestResponse vendorKeyGroupsResponse = OnboardingUtils.createVendorKeyGroups_2(vendorId, user);
-		assertEquals("did not succeed to create vendor key groups", 200, vendorKeyGroupsResponse.getErrorCode().intValue());
-		String keyGroupId = ResponseParser.getValueFromJsonResponse(vendorKeyGroupsResponse.getResponse(), "value");
-
-		RestResponse vendorEntitlementPool = OnboardingUtils.createVendorEntitlementPool_3(vendorId, user);
-		assertEquals("did not succeed to create vendor entitlement pool", 200, vendorEntitlementPool.getErrorCode().intValue());
-		String entitlementPoolId = ResponseParser.getValueFromJsonResponse(vendorEntitlementPool.getResponse(), "value");
-
-		RestResponse vendorLicenseFeatureGroups = OnboardingUtils.createVendorLicenseFeatureGroups_4(vendorId, keyGroupId, entitlementPoolId, user);
-		assertEquals("did not succeed to create vendor license feature groups", 200, vendorLicenseFeatureGroups.getErrorCode().intValue());
-		String featureGroupId = ResponseParser.getValueFromJsonResponse(vendorLicenseFeatureGroups.getResponse(), "value");
-
-		RestResponse vendorLicenseAgreement = OnboardingUtils.createVendorLicenseAgreement_5(vendorId, featureGroupId, user);
-		assertEquals("did not succeed to create vendor license agreement", 200, vendorLicenseAgreement.getErrorCode().intValue());
-		String vendorLicenseAgreementId = ResponseParser.getValueFromJsonResponse(vendorLicenseAgreement.getResponse(), "value");
-
-		RestResponse checkinVendorLicense = OnboardingUtils.checkinVendorLicense(vendorId, user, "0.1");
-		assertEquals("did not succeed to checkin vendor license", 200, checkinVendorLicense.getErrorCode().intValue());
-
-		RestResponse submitVendorLicense = OnboardingUtils.submitVendorLicense(vendorId, user, "0.1");
-		assertEquals("did not succeed to submit vendor license", 200, submitVendorLicense.getErrorCode().intValue());
-
-//		ComponentBaseTest.getExtendTest().log(Status.INFO, "Succeeded in creating the vendor license");
-
-		amdocsLicenseMembers = new AmdocsLicenseMembers(vendorId, vendorLicenseName, vendorLicenseAgreementId, featureGroupId);
-		amdocsLicenseMembers.setVersion("1.0"); // Once object created and submitted, his initial version is 1.0
-
-		return amdocsLicenseMembers;
-	}
 
 	public static String getShortUUID() {
 		return UUID.randomUUID().toString().split("-")[0];
 	}
 
-	private static RestResponse actionOnComponent(String vspid, String action, String onboardComponent, User user, String componentVersion)
-			throws Exception {
+	private static RestResponse actionOnComponent(String vspid, String body, String onboardComponent, User user, String componentVersion) throws Exception {
 		Config config = Utils.getConfig();
 		String url = String.format(Urls.ACTION_ON_COMPONENT, config.getCatalogBeHost(), config.getCatalogBePort(), onboardComponent, vspid, componentVersion);
 		String userId = user.getUserId();
-
-		JSONObject jObject = new JSONObject();
-		jObject.put("action", action);
-
 		Map<String, String> headersMap = prepareHeadersMap(userId);
 
 		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendPut(url, jObject.toString(), headersMap);
-		return response;
-	}
-
-
-		public static RestResponse checkinVendorLicense(String vspid, User user, String vlmVersion) throws Exception {
-		return actionOnComponent(vspid, "Checkin", "vendor-license-models", user, vlmVersion);
-	}
-
-	public static RestResponse checkoutVendorLicense(String vspid, User user, String vlmVersion) throws Exception {
-		return actionOnComponent(vspid, "Checkout", "vendor-license-models", user, vlmVersion);
-	}
-
-	public static RestResponse submitVendorLicense(String vspid, User user, String vlmVersion) throws Exception {
-		return actionOnComponent(vspid, "Submit", "vendor-license-models", user, vlmVersion);
-	}
-
-	public static RestResponse createVendorLicenseModels_1(String name, User user) throws Exception {
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.CREATE_VENDOR_LISENCE_MODELS, config.getCatalogBeHost(),
-				config.getCatalogBePort());
-		String userId = user.getUserId();
-
-		JSONObject jObject = new JSONObject();
-		jObject.put("vendorName", name);
-		jObject.put("description", "new vendor license model");
-		jObject.put("iconRef", "icon");
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-
-		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendPost(url, jObject.toString(), headersMap);
-		return response;
-
-	}
-
-	public static RestResponse createVendorLicenseAgreement_5(String vspid, String featureGroupId, User user)
-			throws Exception {
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.CREATE_VENDOR_LISENCE_AGREEMENT, config.getCatalogBeHost(), config.getCatalogBePort(), vspid);
-		String userId = user.getUserId();
-
-		JSONObject licenseTermpObject = new JSONObject();
-		licenseTermpObject.put("choice", "Fixed_Term");
-		licenseTermpObject.put("other", "");
-
-		JSONObject jObjectBody = new JSONObject();
-		jObjectBody.put("name", "abc");
-		jObjectBody.put("description", "new vendor license agreement");
-		jObjectBody.put("requirementsAndConstrains", "abc");
-		jObjectBody.put("licenseTerm", licenseTermpObject);
-		jObjectBody.put("addedFeatureGroupsIds", Arrays.asList(featureGroupId).toArray());
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-
-		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendPost(url, jObjectBody.toString(), headersMap);
-		return response;
-	}
-
-	public static RestResponse createVendorLicenseFeatureGroups_4(String vspid, String licenseKeyGroupId,
-																  String entitlementPoolId, User user) throws Exception {
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.CREATE_VENDOR_LISENCE_FEATURE_GROUPS, config.getCatalogBeHost(), config.getCatalogBePort(), vspid);
-		String userId = user.getUserId();
-
-		JSONObject jObject = new JSONObject();
-		jObject.put("name", "xyz");
-		jObject.put("description", "new vendor license feature groups");
-		jObject.put("partNumber", "123abc456");
-		jObject.put("manufacturerReferenceNumber", "5");
-		jObject.put("addedLicenseKeyGroupsIds", Arrays.asList(licenseKeyGroupId).toArray());
-		jObject.put("addedEntitlementPoolsIds", Arrays.asList(entitlementPoolId).toArray());
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-
-		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendPost(url, jObject.toString(), headersMap);
-		return response;
-
-	}
-
-	public static RestResponse createVendorEntitlementPool_3(String vspid, User user) throws Exception {
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.CREATE_VENDOR_LISENCE_ENTITLEMENT_POOL, config.getCatalogBeHost(), config.getCatalogBePort(), vspid);
-		String userId = user.getUserId();
-
-		JSONObject jEntitlementMetricObject = new JSONObject();
-		jEntitlementMetricObject.put("choice", "CPU");
-		jEntitlementMetricObject.put("other", "");
-
-		JSONObject jAggregationFunctionObject = new JSONObject();
-		jAggregationFunctionObject.put("choice", "Peak");
-		jAggregationFunctionObject.put("other", "");
-
-		JSONObject jOperationalScope = new JSONObject();
-		jOperationalScope.put("choices", Arrays.asList("Availability_Zone").toArray());
-		jOperationalScope.put("other", "");
-
-		JSONObject jTimeObject = new JSONObject();
-		jTimeObject.put("choice", "Hour");
-		jTimeObject.put("other", "");
-
-		JSONObject jObjectBody = new JSONObject();
-		jObjectBody.put("name", "def"+ getShortUUID());
-		jObjectBody.put("description", "new vendor license entitlement pool");
-		jObjectBody.put("thresholdValue", "23");
-		jObjectBody.put("thresholdUnits", "Absolute");
-		jObjectBody.put("entitlementMetric", jEntitlementMetricObject);
-		jObjectBody.put("increments", "abcd");
-		jObjectBody.put("aggregationFunction", jAggregationFunctionObject);
-		jObjectBody.put("operationalScope", jOperationalScope);
-		jObjectBody.put("time", jTimeObject);
-		jObjectBody.put("manufacturerReferenceNumber", "123aaa");
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-
-		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendPost(url, jObjectBody.toString(), headersMap);
-		return response;
-	}
-
-	public static RestResponse createVendorKeyGroups_2(String vspid, User user) throws Exception {
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.CREATE_VENDOR_LISENCE_KEY_GROUPS, config.getCatalogBeHost(), config.getCatalogBePort(), vspid);
-		String userId = user.getUserId();
-
-		JSONObject jOperationalScope = new JSONObject();
-		jOperationalScope.put("choices", Arrays.asList("Tenant").toArray());
-		jOperationalScope.put("other", "");
-
-		JSONObject jObjectBody = new JSONObject();
-		jObjectBody.put("name", "keyGroup" + getShortUUID());
-		jObjectBody.put("description", "new vendor license key group");
-		jObjectBody.put("operationalScope", jOperationalScope);
-		jObjectBody.put("type", "Universal");
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-
-		HttpRequest http = new HttpRequest();
-		RestResponse response = http.httpSendPost(url, jObjectBody.toString(), headersMap);
-		return response;
-	}
-
-	public static Pair<RestResponse, Map<String, String>> createNewVendorSoftwareProduct(ResourceReqDetails resourceReqDetails, String vspName, AmdocsLicenseMembers amdocsLicenseMembers, User user) throws Exception {
-		Map<String, String> vspMetadta = new HashMap<String, String>();
-
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.CREATE_VENDOR_SOFTWARE_PRODUCT, config.getCatalogBeHost(), config.getCatalogBePort());
-		String userId = user.getUserId();
-		VendorSoftwareProductObject vendorSoftwareProductObject = new VendorSoftwareProductObject();
-		LicensingData licensingData = new LicensingData(amdocsLicenseMembers.getVendorLicenseAgreementId(), Arrays.asList(amdocsLicenseMembers.getFeatureGroupId()));
-		LicensingVersion licensingVersion = new LicensingVersion("1.0", "1.0");
-		ResourceCategoryEnum resourceCategoryEnum = ResourceCategoryEnum.findEnumNameByValues(resourceReqDetails.getCategories().get(0).getName(), resourceReqDetails.getCategories().get(0).getSubcategories().get(0).getName());
-
-		vendorSoftwareProductObject.setLicensingVersion(licensingVersion);
-
-		vendorSoftwareProductObject.setName(vspName);
-		vendorSoftwareProductObject.setDescription(resourceReqDetails.getDescription());
-		vendorSoftwareProductObject.setCategory(resourceCategoryEnum.getCategoryUniqeId());
-		vendorSoftwareProductObject.setSubCategory(resourceCategoryEnum.getSubCategoryUniqeId());
-		vendorSoftwareProductObject.setOnboardingMethod("NetworkPackage");
-		vendorSoftwareProductObject.setVendorName(amdocsLicenseMembers.getVendorLicenseName());
-		vendorSoftwareProductObject.setVendorId(amdocsLicenseMembers.getVendorId());
-		vendorSoftwareProductObject.setIcon("icon");
-		vendorSoftwareProductObject.setLicensingData(licensingData);
-
-		vspMetadta.put("description", resourceReqDetails.getDescription());
-		vspMetadta.put("category", resourceCategoryEnum.getCategory());
-		vspMetadta.put("subCategory", resourceCategoryEnum.getSubCategory());
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-		HttpRequest http = new HttpRequest();
-		Gson gson = new Gson();
-		String body = gson.toJson(vendorSoftwareProductObject);
-
-		RestResponse response = http.httpSendPost(url, body, headersMap);
-		return new Pair<RestResponse, Map<String, String>>(response, vspMetadta);
-	}
-
-	public static RestResponse validateUpload(String vspid, User user, String vspVersion) throws Exception {
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.VALIDATE_UPLOAD, config.getCatalogBeHost(), config.getCatalogBePort(), vspid,vspVersion);
-
-		String userId = user.getUserId();
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-		HttpRequest http = new HttpRequest();
-
-		String body =null;
-
 		RestResponse response = http.httpSendPut(url, body, headersMap);
-
 		return response;
 	}
 
-	public static RestResponse uploadHeatPackage(String filepath, String filename, String vspid, User user, String vspVersion) throws Exception {
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.UPLOAD_HEAT_PACKAGE, config.getCatalogBeHost(), config.getCatalogBePort(), vspid, vspVersion);
-		return uploadFile(filepath, filename, url, user);
-	}
-
-	private static RestResponse uploadFile(String filepath, String filename, String url, User user)
-			throws FileNotFoundException, IOException, ClientProtocolException {
-		CloseableHttpResponse response = null;
-
-		MultipartEntityBuilder mpBuilder = MultipartEntityBuilder.create();
-		mpBuilder.addPart("upload", new FileBody(getTestZipFile(filepath, filename)));
-
-		Map<String, String> headersMap = prepareHeadersMap(user.getUserId());
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "multipart/form-data");
-
-		CloseableHttpClient client = HttpClients.createDefault();
-		try {
-			HttpPost httpPost = new HttpPost(url);
-			RestResponse restResponse = new RestResponse();
-
-			Iterator<String> iterator = headersMap.keySet().iterator();
-			while (iterator.hasNext()) {
-				String key = iterator.next();
-				String value = headersMap.get(key);
-				httpPost.addHeader(key, value);
-			}
-			httpPost.setEntity(mpBuilder.build());
-			response = client.execute(httpPost);
-			HttpEntity entity = response.getEntity();
-			String responseBody = null;
-			if (entity != null) {
-				InputStream instream = entity.getContent();
-				try {
-					StringWriter writer = new StringWriter();
-					IOUtils.copy(instream, writer);
-					responseBody = writer.toString();
-				} finally {
-					instream.close();
-				}
-			}
-
-			restResponse.setErrorCode(response.getStatusLine().getStatusCode());
-			restResponse.setResponse(responseBody);
-
-			return restResponse;
-
-		} finally {
-			closeResponse(response);
-			closeHttpClient(client);
-
-		}
-	}
-
-	private static void closeResponse(CloseableHttpResponse response) {
-		try {
-			if (response != null) {
-				response.close();
-			}
-		} catch (IOException e) {
-			System.out.println(String.format("failed to close client or response: %s", e.getMessage()));
-		}
-	}
-
-	private static void closeHttpClient(CloseableHttpClient client) {
-		try {
-			if (client != null) {
-				client.close();
-			}
-		} catch (IOException e) {
-			System.out.println(String.format("failed to close client or response: %s", e.getMessage()));
-		}
-	}
-
-//	private static File getTestZipFile(String filepath, String filename) throws IOException {
-//		Config config = Utils.getConfig();
-//		String sourceDir = config.getImportResourceTestsConfigDir();
-//		java.nio.file.Path filePath = FileSystems.getDefault().getPath(filepath + File.separator + filename);
-//		return filePath.toFile();
-//	}
-
-	private static File getTestZipFile(String filepath, String filename) throws IOException {
-		Config config = Utils.getConfig();
-		String sourceDir = config.getImportResourceTestsConfigDir();
-		java.nio.file.Path filePath;
-		if(filename == null){
-			filePath = FileSystems.getDefault().getPath(filepath);
-		}else{
-			filePath = FileSystems.getDefault().getPath(filepath + File.separator + filename);
-		}
-		return filePath.toFile();
-	}
-
-	public static RestResponse checkinVendorSoftwareProduct(String vspid, User user, String vspVersion) throws Exception {
-		return actionOnComponent(vspid, "Checkin", "vendor-software-products", user, vspVersion);
-	}
-
-	public static RestResponse checkoutVendorSoftwareProduct(String vspid, User user, String vspVersion) throws Exception {
-		return actionOnComponent(vspid, "Checkout", "vendor-software-products", user, vspVersion);
-	}
-
-	public static RestResponse submitVendorSoftwareProduct(String vspid, User user, String vspVersion) throws Exception {
-		return actionOnComponent(vspid, "Submit", "vendor-software-products", user, vspVersion);
-	}
-
-	public static RestResponse createPackageOfVendorSoftwareProduct(String vspid, User user, String vspVersion) throws Exception {
-		return actionOnComponent(vspid, "Create_Package", "vendor-software-products", user, vspVersion);
-	}
-
 	protected static Map<String, String> prepareHeadersMap(String userId) {
 		Map<String, String> headersMap = new HashMap<String, String>();
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json");
@@ -799,193 +153,7 @@
 		return headersMap;
 	}
 
-	public static VendorSoftwareProductObject updateVSPWithNewVLMParameters(VendorSoftwareProductObject vendorSoftwareProductObject,
-																			AmdocsLicenseMembers amdocsLicenseMembers, User user, String vspCurrentVersion, String vspNextVersion) throws Exception {
 
-		LicensingVersion licensingVersion = new LicensingVersion(amdocsLicenseMembers.getLicenseVersionId(),amdocsLicenseMembers.getLicenseVersionId());
-		LicensingData licensingData = new LicensingData(amdocsLicenseMembers.getVendorLicenseAgreementId(), Arrays.asList(amdocsLicenseMembers.getFeatureGroupId()));
-		vendorSoftwareProductObject.setVendorId(amdocsLicenseMembers.getVendorId());
-		vendorSoftwareProductObject.setVendorName(amdocsLicenseMembers.getVendorLicenseName());
-		vendorSoftwareProductObject.setLicensingVersion(licensingVersion);
-		vendorSoftwareProductObject.setLicensingData(licensingData);
-
-		VendorSoftwareProductObjectReqDetails vendorSoftwareProductObjectReqDetails = new VendorSoftwareProductObjectReqDetails(
-				vendorSoftwareProductObject.getName(),
-				vendorSoftwareProductObject.getDescription(),
-				vendorSoftwareProductObject.getCategory(),
-				vendorSoftwareProductObject.getSubCategory(),
-				vendorSoftwareProductObject.getVendorId(),
-				vendorSoftwareProductObject.getVendorName(),
-				licensingVersion,
-				licensingData,
-				vendorSoftwareProductObject.getOnboardingMethod(),
-				vendorSoftwareProductObject.getNetworkPackageName(),
-				vendorSoftwareProductObject.getOnboardingOrigin());
-
-		Gson gson = new Gson();
-		String json = gson.toJson(vendorSoftwareProductObjectReqDetails);
-
-		RestResponse checkout = checkoutVendorSoftwareProduct(vendorSoftwareProductObject.getVspId(), user, "1.0");
-		assertEquals("did not succeed to checkout new VSP", 200, checkout.getErrorCode().intValue());
-
-		Config config = Utils.getConfig();
-		String url = String.format(Urls.UPDATE_VSP, config.getCatalogBeHost(), config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vspCurrentVersion);
-		String userId = user.getUserId();
-
-		Map<String, String> headersMap = prepareHeadersMap(userId);
-		HttpRequest http = new HttpRequest();
-
-		RestResponse response = http.httpSendPut(url, json, headersMap);
-
-		RestResponse checkin = checkinVendorSoftwareProduct(vendorSoftwareProductObject.getVspId(), user, vspCurrentVersion);
-		assertEquals("did not succeed to checking VSP", 200, checkin.getErrorCode().intValue());
-
-		RestResponse submit = submitVendorSoftwareProduct(vendorSoftwareProductObject.getVspId(), user, vspCurrentVersion);
-		assertEquals("did not succeed to submit VSP", 200, submit.getErrorCode().intValue());
-
-		vendorSoftwareProductObject.setVersion(vspNextVersion);
-
-		return vendorSoftwareProductObject;
-	}
-
-//	private static void importUpdateVSP(Pair<String, Map<String, String>> vsp, boolean isUpdate) throws Exception{
-//		String vspName = vsp.left;
-//		Map<String, String> vspMetadata = vsp.right;
-//		boolean vspFound = HomePage.searchForVSP(vspName);
-//
-//		if (vspFound){
-//
-//			List<WebElement> elemenetsFromTable = HomePage.getElemenetsFromTable();
-////			WebDriverWait wait = new WebDriverWait(GeneralUIUtils.getDriver(), 30);
-////			WebElement findElement = wait.until(ExpectedConditions.visibilityOf(elemenetsFromTable.get(1)));
-////			findElement.click();
-//			elemenetsFromTable.get(1).click();
-//			GeneralUIUtils.waitForLoader();
-//
-//			if (isUpdate){
-//				GeneralUIUtils.clickOnElementByTestId(DataTestIdEnum.ImportVfRepository.UPDATE_VSP.getValue());
-//
-//			}
-//			else{
-//				GeneralUIUtils.clickOnElementByTestId(DataTestIdEnum.ImportVfRepository.IMPORT_VSP.getValue());
-//			}
-//
-//			String lifeCycleState = ResourceGeneralPage.getLifeCycleState();
-//			boolean needCheckout = lifeCycleState.equals(LifeCycleStateEnum.CHECKIN.getValue()) || lifeCycleState.equals(LifeCycleStateEnum.CERTIFIED.getValue());
-//			if (needCheckout)
-//			{
-//				try {
-//					ResourceGeneralPage.clickCheckoutButton();
-//					Assert.assertTrue(ResourceGeneralPage.getLifeCycleState().equals(LifeCycleStateEnum.CHECKOUT.getValue()), "Did not succeed to checkout");
-//
-//				} catch (Exception e) {
-//					ExtentTestActions.log(Status.ERROR, "Did not succeed to checkout");
-//					e.printStackTrace();
-//				}
-//				GeneralUIUtils.waitForLoader();
-//			}
-//
-//			//Metadata verification
-//			VfVerificator.verifyOnboardedVnfMetadata(vspName, vspMetadata);
-//
-//			ExtentTestActions.log(Status.INFO, "Clicking create/update VNF");
-//			String duration = GeneralUIUtils.getActionDuration(() -> waitUntilVnfCreated());
-//		    ExtentTestActions.log(Status.INFO, "Succeeded in importing/updating " + vspName, duration);
-//		}
-//		else{
-//			Assert.fail("Did not find VSP named " + vspName);
-//		}
-//	}
-
-//	private static void waitUntilVnfCreated() {
-//		GeneralUIUtils.clickOnElementByTestIdWithoutWait(DataTestIdEnum.GeneralElementsEnum.CREATE_BUTTON.getValue());
-//		GeneralUIUtils.waitForLoader(60*10);
-//		GeneralUIUtils.waitForAngular();
-//		GeneralUIUtils.getWebElementByTestID(DataTestIdEnum.GeneralElementsEnum.CHECKIN_BUTTON.getValue());
-//	}
-//
-//	public static void updateVSP(Pair<String, Map<String, String>> vsp) throws Exception{
-//		ExtentTestActions.log(Status.INFO, "Updating VSP " + vsp.left);
-//		importUpdateVSP(vsp, true);
-//	}
-//
-//	public static void importVSP(Pair<String, Map<String, String>> vsp) throws Exception{
-//		ExtentTestActions.log(Status.INFO, "Importing VSP " + vsp.left);
-//		importUpdateVSP(vsp, false);
-//	}
-//
-//	public static void updateVnfAndValidate(String filepath, Pair<String, Map<String, String>> vsp, String updatedVnfFile, User user) throws Exception, Throwable {
-//		ExtentTestActions.log(Status.INFO, String.format("Going to update the VNF with %s......", updatedVnfFile));
-//		System.out.println(String.format("Going to update the VNF with %s......", updatedVnfFile));
-//
-//		Map<String, String> vspMap = vsp.right;
-//		String vspId = vspMap.get("vspId");
-//
-//		updateVendorSoftwareProduct(vspId, updatedVnfFile, filepath, user);
-//		HomePage.showVspRepository();
-//		updateVSP(vsp);
-//		ResourceGeneralPage.getLeftMenu().moveToDeploymentArtifactScreen();
-//		DeploymentArtifactPage.verifyArtifactsExistInTable(filepath, updatedVnfFile);
-//	}
-//
-//	public static Pair<String, Map<String, String>> onboardAndValidate(String filepath, String vnfFile, User user) throws Exception {
-//		ExtentTestActions.log(Status.INFO, String.format("Going to onboard the VNF %s", vnfFile));
-//		System.out.println(String.format("Going to onboard the VNF %s", vnfFile));
-//
-//		AmdocsLicenseMembers amdocsLicenseMembers = createVendorLicense(user);
-//		Pair<String, Map<String, String>> createVendorSoftwareProduct = createVendorSoftwareProduct(vnfFile, filepath, user, amdocsLicenseMembers);
-//		String vspName = createVendorSoftwareProduct.left;
-//
-//		DownloadManager.downloadCsarByNameFromVSPRepository(vspName, createVendorSoftwareProduct.right.get("vspId"));
-//		File latestFilefromDir = FileHandling.getLastModifiedFileNameFromDir();
-//
-//		ExtentTestActions.log(Status.INFO, String.format("Searching for onboarded %s", vnfFile));
-//		HomePage.showVspRepository();
-//		ExtentTestActions.log(Status.INFO,String.format("Going to import %s", vnfFile.substring(0, vnfFile.indexOf("."))));
-//		importVSP(createVendorSoftwareProduct);
-//
-//		ResourceGeneralPage.getLeftMenu().moveToDeploymentArtifactScreen();
-//
-//		// Verify deployment artifacts
-//		Map<String, Object> combinedMap = ArtifactFromCsar.combineHeatArtifacstWithFolderArtifacsToMap(latestFilefromDir.getAbsolutePath());
-//
-//		LinkedList<HeatMetaFirstLevelDefinition> deploymentArtifacts = ((LinkedList<HeatMetaFirstLevelDefinition>) combinedMap.get("Deployment"));
-//		ArtifactsCorrelationManager.addVNFartifactDetails(vspName, deploymentArtifacts);
-//
-//		List<String> heatEnvFilesFromCSAR = deploymentArtifacts.stream().filter(e -> e.getType().equals("HEAT_ENV")).
-//																		 map(e -> e.getFileName()).
-//																		 collect(Collectors.toList());
-//
-//		validateDeploymentArtifactsVersion(deploymentArtifacts, heatEnvFilesFromCSAR);
-//
-//		DeploymentArtifactPage.verifyArtifactsExistInTable(filepath, vnfFile);
-//		return createVendorSoftwareProduct;
-//	}
-//
-//	public static void validateDeploymentArtifactsVersion(LinkedList<HeatMetaFirstLevelDefinition> deploymentArtifacts,
-//			List<String> heatEnvFilesFromCSAR) {
-//		String artifactVersion;
-//		String artifactName;
-//
-//		for(HeatMetaFirstLevelDefinition deploymentArtifact: deploymentArtifacts) {
-//			artifactVersion = "1";
-//
-//			if(deploymentArtifact.getType().equals("HEAT_ENV")) {
-//				continue;
-//			} else if(deploymentArtifact.getFileName().contains(".")) {
-//				artifactName = deploymentArtifact.getFileName().trim().substring(0, deploymentArtifact.getFileName().lastIndexOf("."));
-//			} else {
-//				artifactName = deploymentArtifact.getFileName().trim();
-//			}
-//
-//			if (heatEnvFilesFromCSAR.contains(artifactName + ".env")){
-//				artifactVersion = "2";
-//			}
-//			ArtifactUIUtils.validateArtifactNameVersionType(artifactName, artifactVersion, deploymentArtifact.getType());
-//		}
-//	}
-	
-	
 	/**
 	 * @return
 	 * The method returns VNF names list from Files directory under sdc-vnfs repository
@@ -993,11 +161,30 @@
 	public static List<String> getVnfNamesFileList() {
 		String filepath = FileHandling.getVnfRepositoryPath();
 		List<String> fileNamesFromFolder = FileHandling.getZipFileNamesFromFolder(filepath);
+		//Please remove the hardcoded configuration ONAP Tal G!!!!!!
 		fileNamesFromFolder.removeAll(exludeVnfList);
+		//List<String> halfResourceListByDay = divideListByDayOfMonth(fileNamesFromFolder);
+		//System.out.println(halfResourceListByDay.toString());
 		return fileNamesFromFolder;
 	}
 
 	/**
+	 * @param vnfNamesFileList
+	 * @return divide List according to day of month, if day of month is even as get first half part of the List, else - second
+	 */
+	public static List<String> divideListByDayOfMonth(List<String> vnfNamesFileList){
+
+		Calendar cal = Calendar.getInstance();
+		int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH)+1;
+		int filesCount = vnfNamesFileList.size();
+		if(dayOfMonth%2 == 0){
+			return vnfNamesFileList.subList(0,filesCount/2);
+		}else{
+			return vnfNamesFileList.subList(filesCount/2, filesCount);
+		}
+	}
+	
+	/**
 	 * @return
 	 * The method returns VNF names list from Files directory under sdc-vnfs repository excluding zip files that known as failed in tosca parser
 	 */
@@ -1007,41 +194,6 @@
 		return fileNamesFromFolder;
 	}
 
-	public static VendorSoftwareProductObject fillVendorSoftwareProductObjectWithMetaData(String vnfFile, Pair<String, Map<String, String>> createVendorSoftwareProduct) {
-		VendorSoftwareProductObject vendorSoftwareProductObject = new VendorSoftwareProductObject();
-		Map<String, String> map = createVendorSoftwareProduct.right;
-		vendorSoftwareProductObject.setAttContact(map.get("attContact"));
-		vendorSoftwareProductObject.setCategory(map.get("category"));
-		vendorSoftwareProductObject.setComponentId(map.get("componentId"));
-		vendorSoftwareProductObject.setDescription(map.get("description"));
-		vendorSoftwareProductObject.setSubCategory(map.get("subCategory"));
-		vendorSoftwareProductObject.setVendorName(map.get("vendorName"));
-		vendorSoftwareProductObject.setVspId(map.get("vspId"));
-		vendorSoftwareProductObject.setName(createVendorSoftwareProduct.left);
-		String[] arrFileNameAndExtension = vnfFile.split("\\.");
-		vendorSoftwareProductObject.setOnboardingMethod("NetworkPackage");
-		vendorSoftwareProductObject.setNetworkPackageName(arrFileNameAndExtension[0]);
-		vendorSoftwareProductObject.setOnboardingOrigin(arrFileNameAndExtension[1]);
-
-		return vendorSoftwareProductObject;
-	}
-
-	public static void updateVendorSoftwareProductToNextVersion(VendorSoftwareProductObject vendorSoftwareProductObject, String toVspVersion, User user, String filepath, String heatFileName)
-			throws Exception, Throwable {
-
-		RestResponse checkout = checkoutVendorSoftwareProduct(vendorSoftwareProductObject.getVspId(), user, vendorSoftwareProductObject.getVersion());
-		assertEquals("did not succeed to checkout new VSP", 200, checkout.getErrorCode().intValue());
-
-		RestResponse uploadHeatPackage = uploadHeatPackage(filepath, heatFileName, vendorSoftwareProductObject.getVspId(), user, "1.1");
-		assertEquals("did not succeed to upload HEAT package", 200, uploadHeatPackage.getErrorCode().intValue());
-
-		RestResponse validateUpload = validateUpload(vendorSoftwareProductObject.getVspId(), user, "1.1");
-		assertEquals("did not succeed to validate upload process, reason: " + validateUpload.getResponse(), 200, validateUpload.getErrorCode().intValue());
-
-		prepareVspForUse(user,vendorSoftwareProductObject.getVspId(),toVspVersion);
-
-		vendorSoftwareProductObject.setVersion(toVspVersion);
-	}
 
 	public static Object[][] filterObjectArrWithExcludedVnfs(Object[][] objectArr)
 	{
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/SnmpTypeEnum.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/SnmpTypeEnum.java
index 366962e..7103892 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/SnmpTypeEnum.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/SnmpTypeEnum.java
@@ -20,6 +20,56 @@
 
 package org.openecomp.sdc.ci.tests.utils.general;
 
+import static org.testng.AssertJUnit.assertEquals;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.nio.file.FileSystems;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.FileBody;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONValue;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.ci.tests.config.Config;
+import org.openecomp.sdc.ci.tests.datatypes.AmdocsLicenseMembers;
+
+import org.openecomp.sdc.ci.tests.datatypes.HeatMetaFirstLevelDefinition;
+
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpHeaderEnum;
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpRequest;
+import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
+import org.openecomp.sdc.ci.tests.execute.devCI.ArtifactFromCsar;
+
+
+import org.openecomp.sdc.ci.tests.utils.Utils;
+import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
+
+import org.testng.Assert;
+
+import com.aventstack.extentreports.Status;
+import com.clearspring.analytics.util.Pair;
+
 enum SnmpTypeEnum{
     SNMP_POLL ("snmp"),
     SNMP_TRAP ("snmp-trap");
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/VendorLicenseModelRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/VendorLicenseModelRestUtils.java
new file mode 100644
index 0000000..ec368df
--- /dev/null
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/VendorLicenseModelRestUtils.java
@@ -0,0 +1,285 @@
+package org.openecomp.sdc.ci.tests.utils.general;
+
+import com.aventstack.extentreports.Status;
+import org.json.JSONObject;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
+import org.openecomp.sdc.ci.tests.api.Urls;
+import org.openecomp.sdc.ci.tests.config.Config;
+import org.openecomp.sdc.ci.tests.datatypes.AmdocsLicenseMembers;
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpRequest;
+import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
+import org.openecomp.sdc.ci.tests.utils.Utils;
+import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
+
+import java.util.Arrays;
+import java.util.Map;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+public class VendorLicenseModelRestUtils {
+
+    public static void updateVendorLicense(AmdocsLicenseMembers amdocsLicenseMembers, User user, Boolean isVlmUpdated) throws Exception {
+
+//		create major method
+        RestResponse creationMethodVendorLicense = creationMethodVendorLicense(amdocsLicenseMembers, user);
+        assertEquals("did not succeed to create method for vendor license", 200, creationMethodVendorLicense.getErrorCode().intValue());
+        amdocsLicenseMembers.setVersion(ResponseParser.getValueFromJsonResponse(creationMethodVendorLicense.getResponse(), "id"));
+
+        if(isVlmUpdated) {
+//		TODO update vlm do nothing
+//		commit
+            RestResponse commitVendorLicense = commitVendorLicense(amdocsLicenseMembers, user);
+            assertEquals("did not succeed to commit vendor license", 200, commitVendorLicense.getErrorCode().intValue());
+        }
+
+//		submit
+        RestResponse submitVendorLicense = submitVendorLicense(amdocsLicenseMembers, user);
+        assertEquals("did not succeed to submit vendor license", 200, submitVendorLicense.getErrorCode().intValue());
+
+        if(ComponentBaseTest.getExtendTest() != null){
+            ComponentBaseTest.getExtendTest().log(Status.INFO, "Succeeded in updating the vendor license");
+        }
+    }
+
+     private static RestResponse getVLMComponentByVersion(String vlmId, String vlmVersion, User user) throws Exception{
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.GET_VLM_COMPONENT_BY_VERSION, config.getCatalogBeHost(),config.getCatalogBePort(), vlmId,vlmVersion);
+        String userId = user.getUserId();
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendGet(url, headersMap);
+        return response;
+    }
+
+     public static boolean validateVlmExist(String vlmId, String vlmVersion, User user) throws Exception {
+        RestResponse restResponse = getVLMComponentByVersion(vlmId, vlmVersion, user);
+        assertEquals(String.format("VLM version not updated, reponse code message: %s", restResponse.getResponse()),restResponse.getErrorCode().intValue(),200);
+        return (restResponse.getErrorCode()==200);
+    }
+
+    public static AmdocsLicenseMembers createVendorLicense(User user) throws Exception {
+
+        AmdocsLicenseMembers amdocsLicenseMembers;
+//		ComponentBaseTest.getExtendTest().log(Status.INFO, "Starting to create the vendor license");
+        String vendorLicenseName = "ciLicense" + OnboardingUtils.getShortUUID();
+        RestResponse vendorLicenseResponse = createVendorLicenseModels_1(vendorLicenseName, user);
+        assertEquals("did not succeed to create vendor license model", 200, vendorLicenseResponse.getErrorCode().intValue());
+        String vendorId = ResponseParser.getValueFromJsonResponse(vendorLicenseResponse.getResponse(), "itemId");
+        String versionId = ResponseParser.getValueFromJsonResponse(vendorLicenseResponse.getResponse(), "version:id");
+
+        RestResponse vendorKeyGroupsResponse = createVendorKeyGroups_2(vendorId, versionId, user);
+        assertEquals("did not succeed to create vendor key groups", 200, vendorKeyGroupsResponse.getErrorCode().intValue());
+        String keyGroupId = ResponseParser.getValueFromJsonResponse(vendorKeyGroupsResponse.getResponse(), "value");
+
+        RestResponse vendorEntitlementPool = createVendorEntitlementPool_3(vendorId, versionId, user);
+        assertEquals("did not succeed to create vendor entitlement pool", 200, vendorEntitlementPool.getErrorCode().intValue());
+        String entitlementPoolId = ResponseParser.getValueFromJsonResponse(vendorEntitlementPool.getResponse(), "value");
+
+        RestResponse vendorLicenseFeatureGroups = createVendorLicenseFeatureGroups_4(vendorId, versionId, keyGroupId, entitlementPoolId, user);
+        assertEquals("did not succeed to create vendor license feature groups", 200, vendorLicenseFeatureGroups.getErrorCode().intValue());
+        String featureGroupId = ResponseParser.getValueFromJsonResponse(vendorLicenseFeatureGroups.getResponse(), "value");
+
+        RestResponse vendorLicenseAgreement = createVendorLicenseAgreement_5(vendorId, versionId, featureGroupId, user);
+        assertEquals("did not succeed to create vendor license agreement", 200, vendorLicenseAgreement.getErrorCode().intValue());
+        String vendorLicenseAgreementId = ResponseParser.getValueFromJsonResponse(vendorLicenseAgreement.getResponse(), "value");
+
+//		RestResponse checkinVendorLicense = OnboardingUtils.checkinVendorLicense(vendorId, user, versionId);
+//		assertEquals("did not succeed to checkin vendor license", 200, checkinVendorLicense.getErrorCode().intValue());
+
+        amdocsLicenseMembers = new AmdocsLicenseMembers(vendorId, vendorLicenseName, vendorLicenseAgreementId, featureGroupId);
+        amdocsLicenseMembers.setVersion(versionId); // Once object created and submitted, his initial version is 1.0
+
+        RestResponse submitVendorLicense = submitVendorLicense(amdocsLicenseMembers, user);
+        assertEquals("did not succeed to submit vendor license", 200, submitVendorLicense.getErrorCode().intValue());
+
+//		ComponentBaseTest.getExtendTest().log(Status.INFO, "Succeeded in creating the vendor license");
+
+        return amdocsLicenseMembers;
+    }
+
+    private static RestResponse actionOnComponent(String vspid, String body, String onboardComponent, User user, String componentVersion) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.ACTION_ON_COMPONENT, config.getCatalogBeHost(), config.getCatalogBePort(), onboardComponent, vspid, componentVersion);
+        String userId = user.getUserId();
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPut(url, body, headersMap);
+        return response;
+    }
+
+    private static RestResponse createMethodVendorLicense(String vendorId, String body, String onboardComponent, User user, String componentVersion) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.CREATE_METHOD, config.getCatalogBeHost(), config.getCatalogBePort(), onboardComponent, vendorId, componentVersion);
+        String userId = user.getUserId();
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPost(url, body, headersMap);
+        return response;
+    }
+
+    public static RestResponse submitVendorLicense(AmdocsLicenseMembers amdocsLicenseMembers, User user) throws Exception {
+        return actionOnComponent(amdocsLicenseMembers.getVendorId(), "{\"action\":\"Submit\"}", "vendor-license-models", user, amdocsLicenseMembers.getVersion());
+    }
+
+    /**
+     * @param amdocsLicenseMembers
+     * @param user
+     * @return
+     * checkOut exist VLM method
+     * @throws Exception
+     */
+    public static RestResponse creationMethodVendorLicense(AmdocsLicenseMembers amdocsLicenseMembers, User user) throws Exception {
+        String messageBody = "{\"description\":\"2.0\",\"creationMethod\":\"major\"}";
+        return createMethodVendorLicense(amdocsLicenseMembers.getVendorId(), messageBody, "items", user, amdocsLicenseMembers.getVersion());
+    }
+
+    public static RestResponse commitVendorLicense(AmdocsLicenseMembers amdocsLicenseMembers, User user) throws Exception {
+        String messageBody = "{\"action\":\"Commit\",\"commitRequest\":{\"message\":\"commit\"}}";
+        return actionOnComponent(amdocsLicenseMembers.getVendorId(), messageBody, "items", user, amdocsLicenseMembers.getVersion());
+    }
+
+    public static RestResponse createVendorLicenseModels_1(String name, User user) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.CREATE_VENDOR_LISENCE_MODELS, config.getCatalogBeHost(), config.getCatalogBePort());
+        String userId = user.getUserId();
+
+        JSONObject jObject = new JSONObject();
+        jObject.put("vendorName", name);
+        jObject.put("description", "new vendor license model");
+        jObject.put("iconRef", "icon");
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPost(url, jObject.toString(), headersMap);
+        return response;
+
+    }
+
+    public static RestResponse createVendorLicenseAgreement_5(String vspid, String versionId, String featureGroupId, User user)
+            throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.CREATE_VENDOR_LISENCE_AGREEMENT, config.getCatalogBeHost(), config.getCatalogBePort(), vspid, versionId);
+        String userId = user.getUserId();
+
+        JSONObject licenseTermpObject = new JSONObject();
+        licenseTermpObject.put("choice", "Fixed_Term");
+        licenseTermpObject.put("other", "");
+
+        JSONObject jObjectBody = new JSONObject();
+        jObjectBody.put("name", "abc");
+        jObjectBody.put("description", "new vendor license agreement");
+        jObjectBody.put("requirementsAndConstrains", "abc");
+        jObjectBody.put("licenseTerm", licenseTermpObject);
+        jObjectBody.put("addedFeatureGroupsIds", Arrays.asList(featureGroupId).toArray());
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPost(url, jObjectBody.toString(), headersMap);
+        return response;
+    }
+
+    public static RestResponse createVendorLicenseFeatureGroups_4(String vspid, String versionId, String licenseKeyGroupId,
+                                                                  String entitlementPoolId, User user) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.CREATE_VENDOR_LISENCE_FEATURE_GROUPS, config.getCatalogBeHost(), config.getCatalogBePort(), vspid, versionId);
+        String userId = user.getUserId();
+
+        JSONObject jObject = new JSONObject();
+        jObject.put("name", "xyz");
+        jObject.put("description", "new vendor license feature groups");
+        jObject.put("partNumber", "123abc456");
+        jObject.put("manufacturerReferenceNumber", "5");
+        jObject.put("addedLicenseKeyGroupsIds", Arrays.asList(licenseKeyGroupId).toArray());
+        jObject.put("addedEntitlementPoolsIds", Arrays.asList(entitlementPoolId).toArray());
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPost(url, jObject.toString(), headersMap);
+        return response;
+
+    }
+
+    public static RestResponse createVendorEntitlementPool_3(String vspid, String versionId, User user) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.CREATE_VENDOR_LISENCE_ENTITLEMENT_POOL, config.getCatalogBeHost(), config.getCatalogBePort(), vspid, versionId);
+        String userId = user.getUserId();
+
+        JSONObject jEntitlementMetricObject = new JSONObject();
+        jEntitlementMetricObject.put("choice", "CPU");
+        jEntitlementMetricObject.put("other", "");
+
+        JSONObject jAggregationFunctionObject = new JSONObject();
+        jAggregationFunctionObject.put("choice", "Peak");
+        jAggregationFunctionObject.put("other", "");
+
+        JSONObject jOperationalScope = new JSONObject();
+        jOperationalScope.put("choices", Arrays.asList("Availability_Zone").toArray());
+        jOperationalScope.put("other", "");
+
+        JSONObject jTimeObject = new JSONObject();
+        jTimeObject.put("choice", "Hour");
+        jTimeObject.put("other", "");
+
+        JSONObject jObjectBody = new JSONObject();
+        jObjectBody.put("name", "def"+ OnboardingUtils.getShortUUID());
+        jObjectBody.put("description", "new vendor license entitlement pool");
+        jObjectBody.put("thresholdValue", "23");
+        jObjectBody.put("thresholdUnits", "Absolute");
+        jObjectBody.put("entitlementMetric", jEntitlementMetricObject);
+        jObjectBody.put("increments", "abcd");
+        jObjectBody.put("aggregationFunction", jAggregationFunctionObject);
+        jObjectBody.put("operationalScope", jOperationalScope);
+        jObjectBody.put("time", jTimeObject);
+        jObjectBody.put("manufacturerReferenceNumber", "123aaa");
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPost(url, jObjectBody.toString(), headersMap);
+        return response;
+    }
+
+    public static RestResponse createVendorKeyGroups_2(String vspid, String versionId, User user) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.CREATE_VENDOR_LISENCE_KEY_GROUPS, config.getCatalogBeHost(), config.getCatalogBePort(), vspid, versionId);
+        String userId = user.getUserId();
+
+        JSONObject jOperationalScope = new JSONObject();
+        jOperationalScope.put("choices", Arrays.asList("Tenant").toArray());
+        jOperationalScope.put("other", "");
+
+        JSONObject jObjectBody = new JSONObject();
+        jObjectBody.put("name", "keyGroup" + OnboardingUtils.getShortUUID());
+        jObjectBody.put("description", "new vendor license key group");
+        jObjectBody.put("operationalScope", jOperationalScope);
+        jObjectBody.put("type", "Universal");
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPost(url, jObjectBody.toString(), headersMap);
+        return response;
+    }
+
+    public static RestResponse validateUpload(String vspid, User user, String vspVersion) throws Exception {
+        String body = null;
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.VALIDATE_UPLOAD, config.getCatalogBeHost(), config.getCatalogBePort(), vspid,vspVersion);
+        String userId = user.getUserId();
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPut(url, body, headersMap);
+
+        return response;
+    }
+
+}
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/VendorSoftwareProductRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/VendorSoftwareProductRestUtils.java
new file mode 100644
index 0000000..c3b0a28
--- /dev/null
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/general/VendorSoftwareProductRestUtils.java
@@ -0,0 +1,697 @@
+package org.openecomp.sdc.ci.tests.utils.general;
+
+import com.aventstack.extentreports.Status;
+import com.clearspring.analytics.util.Pair;
+import com.google.gson.Gson;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.entity.mime.content.FileBody;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONValue;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
+import org.openecomp.sdc.ci.tests.api.Urls;
+import org.openecomp.sdc.ci.tests.config.Config;
+import org.openecomp.sdc.ci.tests.datatypes.*;
+import org.openecomp.sdc.ci.tests.datatypes.enums.CvfcTypeEnum;
+import org.openecomp.sdc.ci.tests.datatypes.enums.ResourceCategoryEnum;
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpHeaderEnum;
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpRequest;
+import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
+import org.openecomp.sdc.ci.tests.utils.Utils;
+import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
+import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.nio.file.FileSystems;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+public class VendorSoftwareProductRestUtils {
+
+    public static Pair<String, VendorSoftwareProductObject> createVendorSoftwareProduct(ResourceReqDetails resourceReqDetails, String heatFileName, String filepath, User user, AmdocsLicenseMembers amdocsLicenseMembers, Map<CvfcTypeEnum, String> cvfcArtifacts)
+            throws Exception {
+
+        Pair<String, VendorSoftwareProductObject> pair = createVSP(resourceReqDetails, heatFileName, filepath, user, amdocsLicenseMembers);
+        if(cvfcArtifacts != null && ! cvfcArtifacts.isEmpty()){
+            addCvfcArtifacts(cvfcArtifacts, user, pair.right);
+        }
+        prepareVspForUse(user, pair.right, true);
+        return pair;
+    }
+
+    public static Pair<String, VendorSoftwareProductObject> createVendorSoftwareProduct(ResourceReqDetails resourceReqDetails, String heatFileName, String filepath, User user, AmdocsLicenseMembers amdocsLicenseMembers)
+            throws Exception {
+
+        Map<CvfcTypeEnum, String> cvfcArtifacts = new HashMap<>();
+        return createVendorSoftwareProduct(resourceReqDetails, heatFileName, filepath, user, amdocsLicenseMembers, cvfcArtifacts);
+    }
+
+    /**
+     * @param user user
+     * @param vendorSoftwareProductObject vendorSoftwareProductObject
+     * @param isVspUpdated - in case isVspUpdated = false the commit API should not be issued
+     * the method do commit, submit and create package
+     * @throws Exception
+     */
+    public static void prepareVspForUse(User user, VendorSoftwareProductObject vendorSoftwareProductObject, Boolean isVspUpdated) throws Exception {
+
+        if(isVspUpdated) {
+            RestResponse commit = commitVendorSoftwareProduct(vendorSoftwareProductObject, user);
+            assertEquals("did not succeed to commit new VSP", 200, commit.getErrorCode().intValue());
+        }
+        RestResponse submit = submitVendorSoftwareProduct(vendorSoftwareProductObject.getVspId(), user, vendorSoftwareProductObject.getComponentId());
+        assertEquals("did not succeed to submit new VSP", 200, submit.getErrorCode().intValue());
+
+        RestResponse createPackage = createPackageOfVendorSoftwareProduct(vendorSoftwareProductObject.getVspId(), user, vendorSoftwareProductObject.getComponentId());
+        assertEquals("did not succeed to create package of new VSP ", 200, createPackage.getErrorCode().intValue());
+
+    }
+
+    public static VendorSoftwareProductObject createAndFillVendorSoftwareProduct(ResourceReqDetails resourceReqDetails, String heatFileName, String filePath, User user, AmdocsLicenseMembers amdocsLicenseMembers, Map<CvfcTypeEnum, String> cvfcArtifacts)
+            throws Exception {
+
+        Pair<String, VendorSoftwareProductObject> createVendorSoftwareProduct = createVendorSoftwareProduct(resourceReqDetails, heatFileName, filePath, user, amdocsLicenseMembers, cvfcArtifacts);
+        VendorSoftwareProductObject vendorSoftwareProductObject = fillVendorSoftwareProductObjectWithMetaData(heatFileName, createVendorSoftwareProduct);
+        return vendorSoftwareProductObject;
+
+    }
+
+
+    public static Pair<String, VendorSoftwareProductObject> createVSP(ResourceReqDetails resourceReqDetails, String heatFileName, String filepath, User user, AmdocsLicenseMembers amdocsLicenseMembers) throws Exception {
+        String vspName = handleFilename(heatFileName);
+
+        if(ComponentBaseTest.getExtendTest() != null){
+            ComponentBaseTest.getExtendTest().log(Status.INFO, "Starting to create the vendor software product");
+        }
+
+        Pair<RestResponse, VendorSoftwareProductObject> createNewVspPair = createNewVendorSoftwareProduct(resourceReqDetails, vspName, amdocsLicenseMembers, user);
+        assertEquals("did not succeed to create new VSP", 200,createNewVspPair.left.getErrorCode().intValue());
+
+        RestResponse uploadHeatPackage = uploadHeatPackage(filepath, heatFileName,  createNewVspPair.right, user);
+        assertEquals("did not succeed to upload HEAT package", 200, uploadHeatPackage.getErrorCode().intValue());
+
+        RestResponse validateUpload = validateUpload(createNewVspPair.right, user);
+        assertEquals("did not succeed to validate upload process, reason: " + validateUpload.getResponse(), 200, validateUpload.getErrorCode().intValue());
+
+        Pair<String, VendorSoftwareProductObject> pair = new Pair<>(vspName, createNewVspPair.right);
+        return pair;
+    }
+
+    public static void updateVspWithVfcArtifacts(String filepath, String updatedSnmpPoll, String updatedSnmpTrap, String componentInstanceId, User user, VendorSoftwareProductObject vendorSoftwareProductObject) throws Exception{
+        RestResponse checkout = creationMethodVendorSoftwareProduct(vendorSoftwareProductObject, user);
+        assertEquals("did not succeed to checkout new VSP", 200, checkout.getErrorCode().intValue());
+//		ExtentTestActions.log(Status.INFO, "Deleting SNMP POLL");
+        deleteArtifactByType(componentInstanceId, vendorSoftwareProductObject, user, CvfcTypeEnum.SNMP_POLL);
+//		ExtentTestActions.log(Status.INFO, "Deleting SNMP TRAP");
+        deleteArtifactByType(componentInstanceId, vendorSoftwareProductObject, user, CvfcTypeEnum.SNMP_TRAP);
+        addVFCArtifacts(filepath, updatedSnmpPoll, updatedSnmpTrap, vendorSoftwareProductObject, user, componentInstanceId);
+        prepareVspForUse(user, vendorSoftwareProductObject, true);
+    }
+
+    private static RestResponse deleteArtifactByType(String componentInstanceId, VendorSoftwareProductObject vendorSoftwareProductObject, User user, CvfcTypeEnum snmpType) throws Exception
+    {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.DELETE_AMDOCS_ARTIFACT_BY_TYPE, config.getCatalogBeHost(), config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId(), componentInstanceId, snmpType.getValue());
+        String userId = user.getUserId();
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendDelete(url, headersMap);
+        return response;
+    }
+
+    public static void updateVendorSoftwareProductToNextVersion(VendorSoftwareProductObject vendorSoftwareProductObject, User user, Boolean isVspUpdated) throws Throwable {
+
+        RestResponse createMethod = creationMethodVendorSoftwareProduct(vendorSoftwareProductObject, user);
+        assertEquals("did not succeed to createMethod for new VSP", 200, createMethod.getErrorCode().intValue());
+        prepareVspForUse(user,vendorSoftwareProductObject, isVspUpdated);
+
+    }
+
+    public static String handleFilename(String heatFileName) {
+        final String namePrefix = String.format("%sVF%s", ElementFactory.getResourcePrefix(), "Onboarded-");
+        final String nameSuffix = "-" + OnboardingUtils.getShortUUID();
+
+        String subHeatFileName = heatFileName.substring(0, heatFileName.lastIndexOf("."));
+
+        if ((namePrefix + subHeatFileName + nameSuffix).length() >= 50) {
+            subHeatFileName = subHeatFileName.substring(0, 50 - namePrefix.length() - nameSuffix.length());
+        }
+
+        if (subHeatFileName.contains("(") || subHeatFileName.contains(")")) {
+            subHeatFileName = subHeatFileName.replace("(", "-");
+            subHeatFileName = subHeatFileName.replace(")", "-");
+        }
+
+        String vnfName = namePrefix + subHeatFileName + nameSuffix;
+        return vnfName;
+    }
+
+    public static String addVFCArtifacts(String filepath, String snmpPoll, String snmpTrap, VendorSoftwareProductObject vendorSoftwareProductObject, User user, String componentInstanceId) throws Exception{
+        componentInstanceId = (componentInstanceId == null) ? getVspComponentId(vendorSoftwareProductObject, user) : componentInstanceId;
+        if (componentInstanceId != null){
+            if (snmpPoll != null){
+//				ExtentTestActions.log(Status.INFO, "Adding VFC artifact of type SNMP POLL with the file " + snmpPoll);
+                RestResponse uploadSnmpPollArtifact = uploadSnmpPollArtifact(filepath, snmpPoll, vendorSoftwareProductObject, user, componentInstanceId);
+                assertEquals("Did not succeed to add SNMP POLL", 200, uploadSnmpPollArtifact.getErrorCode().intValue());
+            }
+            if (snmpTrap != null){
+//				ExtentTestActions.log(Status.INFO, "Adding VFC artifact of type SNMP TRAP with the file " + snmpTrap);
+                RestResponse uploadSnmpTrapArtifact = uploadSnmpTrapArtifact(filepath, snmpTrap, vendorSoftwareProductObject, user, componentInstanceId);
+                assertEquals("Did not succeed to add SNMP TRAP", 200, uploadSnmpTrapArtifact.getErrorCode().intValue());
+            }
+        }
+
+        return componentInstanceId;
+    }
+
+    public static String addCvfcArtifacts(Map<CvfcTypeEnum, String> componentVfcArtifacts, User user, VendorSoftwareProductObject vendorSoftwareProductObject) throws Exception{
+        String componentInstanceId = getVspComponentId(vendorSoftwareProductObject, user);
+        if (componentInstanceId != null){
+            for(Map.Entry<CvfcTypeEnum, String> entry : componentVfcArtifacts.entrySet()){
+//				ExtentTestActions.log(Status.INFO, "Adding VFC artifact of type " + entry.getKey().getValue() + " with the file " + entry.getValue());
+                RestResponse uploadSnmpPollArtifact = uploadCvfcArtifact(entry.getValue(), entry.getKey().getValue(), user, vendorSoftwareProductObject, componentInstanceId);
+                assertEquals("Did not succeed to add " + entry.getKey().getValue(), BaseRestUtils.STATUS_CODE_SUCCESS, uploadSnmpPollArtifact.getErrorCode().intValue());
+            }
+        }
+        return componentInstanceId;
+    }
+
+    public static String addVFCArtifacts(String filepath, String snmpPoll, String snmpTrap, VendorSoftwareProductObject vendorSoftwareProductObject, User user) throws Exception{
+        return addVFCArtifacts(filepath, snmpPoll, snmpTrap, vendorSoftwareProductObject, user, null);
+    }
+
+    public static RestResponse uploadCvfcArtifact(String filepath, String cvfcType, User user, VendorSoftwareProductObject vendorSoftwareProductObject, String componentInstanceId) throws IOException {
+        Config config = Utils.getConfig();
+        String snmpPollUrl = String.format(Urls.UPLOAD_AMDOCS_ARTIFACT, config.getCatalogBeHost(),config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId(), componentInstanceId, cvfcType);
+        return uploadFile(filepath, null, snmpPollUrl, user);
+    }
+
+
+    private static RestResponse uploadSnmpPollArtifact(String filepath, String zipArtifact, VendorSoftwareProductObject vendorSoftwareProductObject, User user, String componentInstanceId) throws IOException {
+        Config config = Utils.getConfig();
+        String snmpPollUrl = String.format(Urls.UPLOAD_SNMP_POLL_ARTIFACT, config.getCatalogBeHost(),config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId(), componentInstanceId);
+        return uploadFile(filepath, zipArtifact, snmpPollUrl, user);
+    }
+
+    private static RestResponse uploadSnmpTrapArtifact(String filepath, String zipArtifact, VendorSoftwareProductObject vendorSoftwareProductObject, User user, String vspComponentId) throws IOException {
+        Config config = Utils.getConfig();
+        String snmpTrapUrl = String.format(Urls.UPLOAD_SNMP_POLL_ARTIFACT, config.getCatalogBeHost(),config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId(), vspComponentId);
+        return uploadFile(filepath, zipArtifact, snmpTrapUrl, user);
+    }
+
+    private static RestResponse deleteSnmpArtifact(String componentId, String vspId, User user, SnmpTypeEnum snmpType) throws Exception
+    {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.DELETE_AMDOCS_ARTIFACT_BY_TYPE, config.getCatalogBeHost(),config.getCatalogBePort(), vspId, componentId, snmpType.getValue());
+        String userId = user.getUserId();
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendDelete(url, headersMap);
+        return response;
+    }
+
+
+    /**
+     * @param vendorSoftwareProductObject VendorSoftwareProductObject
+     * @param user user object
+     * @return return first found component instance Id from list
+     * @throws Exception Exception
+     */
+    private static String getVspComponentId(VendorSoftwareProductObject vendorSoftwareProductObject, User user) throws Exception {
+        RestResponse componentList = getVSPComponents(vendorSoftwareProductObject, user);
+        String response = componentList.getResponse();
+        Map<String, Object> responseMap = (Map<String, Object>) JSONValue.parse(response);
+        JSONArray results = (JSONArray)responseMap.get("results");
+        for (Object res : results){
+            Map<String, Object> componentMap = (Map<String, Object>) JSONValue.parse(res.toString());
+            String componentInstanceId = componentMap.get("id").toString();
+            return componentInstanceId;
+        }
+        return null;
+    }
+
+    private static RestResponse getVSPComponents(VendorSoftwareProductObject vendorSoftwareProductObject, User user) throws Exception{
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.GET_VSP_COMPONENTS, config.getCatalogBeHost(),config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId());
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(user.getUserId());
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendGet(url, headersMap);
+        return response;
+    }
+
+
+
+    public static boolean validateVspExist(VendorSoftwareProductObject vendorSoftwareProductObject, User user) throws Exception {
+        RestResponse restResponse = getVSPComponentByVersion(vendorSoftwareProductObject, user);
+        assertEquals(String.format("Vsp version not updated, reponse message: %s", restResponse.getResponse()),restResponse.getErrorCode().intValue(),200);
+        return (restResponse.getErrorCode()==200);
+    }
+
+
+    private static RestResponse getVSPComponentByVersion(VendorSoftwareProductObject vendorSoftwareProductObject, User user) throws Exception{
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.GET_VSP_COMPONENT_BY_VERSION, config.getCatalogBeHost(),config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId());
+        String userId = user.getUserId();
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendGet(url, headersMap);
+        return response;
+    }
+
+    private static RestResponse actionOnComponent(String vspid, String body, String onboardComponent, User user, String componentVersion) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.ACTION_ON_COMPONENT, config.getCatalogBeHost(), config.getCatalogBePort(), onboardComponent, vspid, componentVersion);
+        String userId = user.getUserId();
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPut(url, body, headersMap);
+        return response;
+    }
+
+    public static Pair<RestResponse, VendorSoftwareProductObject> createNewVendorSoftwareProduct(ResourceReqDetails resourceReqDetails, String vspName, AmdocsLicenseMembers amdocsLicenseMembers, User user) throws Exception {
+
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.CREATE_VENDOR_SOFTWARE_PRODUCT, config.getCatalogBeHost(), config.getCatalogBePort());
+        String userId = user.getUserId();
+        VendorSoftwareProductObject vendorSoftwareProductObject = new VendorSoftwareProductObject();
+        LicensingData licensingData = new LicensingData(amdocsLicenseMembers.getVendorLicenseAgreementId(), Arrays.asList(amdocsLicenseMembers.getFeatureGroupId()));
+        ResourceCategoryEnum resourceCategoryEnum = ResourceCategoryEnum.findEnumNameByValues(resourceReqDetails.getCategories().get(0).getName(), resourceReqDetails.getCategories().get(0).getSubcategories().get(0).getName());
+
+        vendorSoftwareProductObject.setName(vspName);
+        vendorSoftwareProductObject.setDescription(resourceReqDetails.getDescription());
+        vendorSoftwareProductObject.setCategory(resourceCategoryEnum.getCategoryUniqeId());
+        vendorSoftwareProductObject.setSubCategory(resourceCategoryEnum.getSubCategoryUniqeId());
+        vendorSoftwareProductObject.setOnboardingMethod("NetworkPackage");
+        vendorSoftwareProductObject.setVendorName(amdocsLicenseMembers.getVendorLicenseName());
+        vendorSoftwareProductObject.setVendorId(amdocsLicenseMembers.getVendorId());
+        vendorSoftwareProductObject.setIcon("icon");
+        vendorSoftwareProductObject.setLicensingData(licensingData);
+        vendorSoftwareProductObject.setLicensingVersion(amdocsLicenseMembers.getVersion());
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+        HttpRequest http = new HttpRequest();
+        Gson gson = new Gson();
+        String body = gson.toJson(vendorSoftwareProductObject);
+
+        RestResponse response = http.httpSendPost(url, body, headersMap);
+
+        vendorSoftwareProductObject.setVspId(ResponseParser.getValueFromJsonResponse(response.getResponse(), "itemId"));
+        vendorSoftwareProductObject.setComponentId(ResponseParser.getValueFromJsonResponse(response.getResponse(), "version:id"));
+//		vendorSoftwareProductObject.setVersion(ResponseParser.getValueFromJsonResponse(response.getResponse(), "version:name"));
+        vendorSoftwareProductObject.setAttContact(user.getUserId());
+
+        return new Pair<>(response, vendorSoftwareProductObject);
+    }
+
+    public static RestResponse validateUpload(VendorSoftwareProductObject vendorSoftwareProductObject, User user) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.VALIDATE_UPLOAD, config.getCatalogBeHost(), config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId());
+        String userId = user.getUserId();
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPut(url, null, headersMap);
+
+        return response;
+    }
+
+    public static RestResponse uploadHeatPackage(String filepath, String filename, VendorSoftwareProductObject vendorSoftwareProductObject, User user) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.UPLOAD_HEAT_PACKAGE, config.getCatalogBeHost(), config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId());
+        return uploadFile(filepath, filename, url, user);
+    }
+
+    private static RestResponse uploadFile(String filepath, String filename, String url, User user) throws IOException{
+        CloseableHttpResponse response = null;
+
+        MultipartEntityBuilder mpBuilder = MultipartEntityBuilder.create();
+        mpBuilder.addPart("upload", new FileBody(getTestZipFile(filepath, filename)));
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(user.getUserId());
+        headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "multipart/form-data");
+
+        CloseableHttpClient client = HttpClients.createDefault();
+        try {
+            HttpPost httpPost = new HttpPost(url);
+            RestResponse restResponse = new RestResponse();
+
+            Iterator<String> iterator = headersMap.keySet().iterator();
+            while (iterator.hasNext()) {
+                String key = iterator.next();
+                String value = headersMap.get(key);
+                httpPost.addHeader(key, value);
+            }
+            httpPost.setEntity(mpBuilder.build());
+            response = client.execute(httpPost);
+            HttpEntity entity = response.getEntity();
+            String responseBody = null;
+            if (entity != null) {
+                InputStream instream = entity.getContent();
+                try {
+                    StringWriter writer = new StringWriter();
+                    IOUtils.copy(instream, writer);
+                    responseBody = writer.toString();
+                } finally {
+                    instream.close();
+                }
+            }
+
+            restResponse.setErrorCode(response.getStatusLine().getStatusCode());
+            restResponse.setResponse(responseBody);
+
+            return restResponse;
+
+        } finally {
+            closeResponse(response);
+            closeHttpClient(client);
+
+        }
+    }
+
+    private static void closeResponse(CloseableHttpResponse response) {
+        try {
+            if (response != null) {
+                response.close();
+            }
+        } catch (IOException e) {
+            System.out.println(String.format("failed to close client or response: %s", e.getMessage()));
+        }
+    }
+
+    private static void closeHttpClient(CloseableHttpClient client) {
+        try {
+            if (client != null) {
+                client.close();
+            }
+        } catch (IOException e) {
+            System.out.println(String.format("failed to close client or response: %s", e.getMessage()));
+        }
+    }
+
+    private static File getTestZipFile(String filepath, String filename) throws IOException {
+        Config config = Utils.getConfig();
+        String sourceDir = config.getImportResourceTestsConfigDir();
+        java.nio.file.Path filePath;
+        if(filename == null){
+            filePath = FileSystems.getDefault().getPath(filepath);
+        }else{
+            filePath = FileSystems.getDefault().getPath(filepath + File.separator + filename);
+        }
+        return filePath.toFile();
+    }
+
+    public static RestResponse checkinVendorSoftwareProduct(User user, VendorSoftwareProductObject vendorSoftwareProductObject) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.UPDATE_VSP, config.getCatalogBeHost(), config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId());
+
+        String userId = user.getUserId();
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+//		unset vspId, componentId, attContact, onboardingMethod
+        String vspId = vendorSoftwareProductObject.getVspId();
+        String componentId = vendorSoftwareProductObject.getComponentId();
+        String attContact = vendorSoftwareProductObject.getAttContact();
+        String onboardingMethod = vendorSoftwareProductObject.getOnboardingMethod();
+        vendorSoftwareProductObject.setVspId(null);
+        vendorSoftwareProductObject.setComponentId(null);
+        vendorSoftwareProductObject.setAttContact(null);
+        vendorSoftwareProductObject.setOnboardingMethod(null);
+        Gson gson = new Gson();
+        String body = gson.toJson(vendorSoftwareProductObject);
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPut(url, body, headersMap);
+//		set back vspId, componentId, attContact, onboardingMethod
+        vendorSoftwareProductObject.setVspId(vspId);
+        vendorSoftwareProductObject.setComponentId(componentId);
+        vendorSoftwareProductObject.setAttContact(attContact);
+        vendorSoftwareProductObject.setOnboardingMethod(onboardingMethod);
+
+        return response;
+    }
+
+    public static RestResponse commitVendorSoftwareProduct(VendorSoftwareProductObject vendorSoftwareProductObject, User user) throws Exception {
+        String messageBody = "{\"action\":\"Commit\",\"commitRequest\":{\"message\":\"commit\"}}";
+        return actionOnComponent(vendorSoftwareProductObject.getVspId(), messageBody, "items", user, vendorSoftwareProductObject.getComponentId());
+    }
+
+    public static RestResponse submitVendorSoftwareProduct(String vspid, User user, String componentId) throws Exception {
+        return actionOnComponent(vspid, "{\"action\":\"Submit\"}", "vendor-software-products", user, componentId);
+    }
+
+    public static RestResponse createPackageOfVendorSoftwareProduct(String vspid, User user, String componentId) throws Exception {
+        return actionOnComponent(vspid, "{\"action\":\"Create_Package\"}", "vendor-software-products", user, componentId);
+    }
+
+    public static RestResponse creationMethodVendorSoftwareProduct(VendorSoftwareProductObject vendorSoftwareProductObject, User user) throws Exception {
+        String messageBody = "{\"description\":\"2.0\",\"creationMethod\":\"major\"}";
+        return createMethodVendorSoftwareProduct(vendorSoftwareProductObject, messageBody, "items", user);
+    }
+
+    private static RestResponse createMethodVendorSoftwareProduct(VendorSoftwareProductObject vendorSoftwareProductObject, String body, String onboardComponent, User user) throws Exception {
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.CREATE_METHOD, config.getCatalogBeHost(), config.getCatalogBePort(), onboardComponent, vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId());
+        String userId = user.getUserId();
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+
+        HttpRequest http = new HttpRequest();
+        RestResponse response = http.httpSendPost(url, body, headersMap);
+        if(response.getErrorCode().intValue() == 200) {
+            vendorSoftwareProductObject.setComponentId(ResponseParser.getValueFromJsonResponse(response.getResponse(), "id"));
+        }
+        return response;
+    }
+
+    public static VendorSoftwareProductObject updateVSPWithNewVLMParameters(VendorSoftwareProductObject vendorSoftwareProductObject, AmdocsLicenseMembers amdocsLicenseMembers, User user) throws Exception {
+
+        RestResponse createMethod = creationMethodVendorSoftwareProduct(vendorSoftwareProductObject, user);
+        assertEquals("did not succeed to checkout new VSP", 200, createMethod.getErrorCode().intValue());
+//        vendorSoftwareProductObject.setComponentId(ResponseParser.getValueFromJsonResponse(createMethod.getResponse(), "id"));
+
+        String licensingVersion = amdocsLicenseMembers.getVersion();
+        LicensingData licensingData = new LicensingData(amdocsLicenseMembers.getVendorLicenseAgreementId(), Arrays.asList(amdocsLicenseMembers.getFeatureGroupId()));
+        vendorSoftwareProductObject.setVendorId(amdocsLicenseMembers.getVendorId());
+        vendorSoftwareProductObject.setVendorName(amdocsLicenseMembers.getVendorLicenseName());
+        vendorSoftwareProductObject.setLicensingVersion(licensingVersion);
+        vendorSoftwareProductObject.setLicensingData(licensingData);
+
+        VendorSoftwareProductObjectReqDetails vendorSoftwareProductObjectReqDetails = new VendorSoftwareProductObjectReqDetails(
+                vendorSoftwareProductObject.getName(), vendorSoftwareProductObject.getDescription(), vendorSoftwareProductObject.getCategory(),
+                vendorSoftwareProductObject.getSubCategory(), vendorSoftwareProductObject.getVendorId(), vendorSoftwareProductObject.getVendorName(),
+                vendorSoftwareProductObject.getLicensingVersion(), vendorSoftwareProductObject.getLicensingData(),
+                null, null, null, vendorSoftwareProductObject.getIcon()	);
+
+        Gson gson = new Gson();
+        String body = gson.toJson(vendorSoftwareProductObjectReqDetails);
+        RestResponse updateResponse = updateVendorSoftwareProduct(vendorSoftwareProductObject, body, user);
+        assertEquals("did not succeed to update VSP", 200, updateResponse.getErrorCode().intValue());
+
+        prepareVspForUse(user, vendorSoftwareProductObject, true);
+
+        return vendorSoftwareProductObject;
+    }
+
+    public static RestResponse updateVendorSoftwareProduct(VendorSoftwareProductObject vendorSoftwareProductObject, String body, User user) throws Exception {
+
+        Config config = Utils.getConfig();
+        String url = String.format(Urls.UPDATE_VSP, config.getCatalogBeHost(), config.getCatalogBePort(), vendorSoftwareProductObject.getVspId(), vendorSoftwareProductObject.getComponentId());
+        String userId = user.getUserId();
+
+        Map<String, String> headersMap = OnboardingUtils.prepareHeadersMap(userId);
+        HttpRequest http = new HttpRequest();
+
+        RestResponse response = http.httpSendPut(url, body, headersMap);
+        return response;
+    }
+
+//	private static void importUpdateVSP(Pair<String, Map<String, String>> vsp, boolean isUpdate) throws Exception{
+//		String vspName = vsp.left;
+//		Map<String, String> vspMetadata = vsp.right;
+//		boolean vspFound = HomePage.searchForVSP(vspName);
+//
+//		if (vspFound){
+//
+//			List<WebElement> elemenetsFromTable = HomePage.getElemenetsFromTable();
+////			WebDriverWait wait = new WebDriverWait(GeneralUIUtils.getDriver(), 30);
+////			WebElement findElement = wait.until(ExpectedConditions.visibilityOf(elemenetsFromTable.get(1)));
+////			findElement.click();
+//			elemenetsFromTable.get(1).click();
+//			GeneralUIUtils.waitForLoader();
+//
+//			if (isUpdate){
+//				GeneralUIUtils.clickOnElementByTestId(DataTestIdEnum.ImportVfRepository.UPDATE_VSP.getValue());
+//
+//			}
+//			else{
+//				GeneralUIUtils.clickOnElementByTestId(DataTestIdEnum.ImportVfRepository.IMPORT_VSP.getValue());
+//			}
+//
+//			String lifeCycleState = ResourceGeneralPage.getLifeCycleState();
+//			boolean needCheckout = lifeCycleState.equals(LifeCycleStateEnum.CHECKIN.getValue()) || lifeCycleState.equals(LifeCycleStateEnum.CERTIFIED.getValue());
+//			if (needCheckout)
+//			{
+//				try {
+//					ResourceGeneralPage.clickCheckoutButton();
+//					Assert.assertTrue(ResourceGeneralPage.getLifeCycleState().equals(LifeCycleStateEnum.CHECKOUT.getValue()), "Did not succeed to checkout");
+//
+//				} catch (Exception e) {
+//					ExtentTestActions.log(Status.ERROR, "Did not succeed to checkout");
+//					e.printStackTrace();
+//				}
+//				GeneralUIUtils.waitForLoader();
+//			}
+//
+//			//Metadata verification
+//			VfVerificator.verifyOnboardedVnfMetadata(vspName, vspMetadata);
+//
+//			ExtentTestActions.log(Status.INFO, "Clicking create/update VNF");
+//			String duration = GeneralUIUtils.getActionDuration(() -> waitUntilVnfCreated());
+//		    ExtentTestActions.log(Status.INFO, "Succeeded in importing/updating " + vspName, duration);
+//		}
+//		else{
+//			Assert.fail("Did not find VSP named " + vspName);
+//		}
+//	}
+
+//	private static void waitUntilVnfCreated() {
+//		GeneralUIUtils.clickOnElementByTestIdWithoutWait(DataTestIdEnum.GeneralElementsEnum.CREATE_BUTTON.getValue());
+//		GeneralUIUtils.waitForLoader(60*10);
+//		GeneralUIUtils.waitForAngular();
+//		GeneralUIUtils.getWebElementByTestID(DataTestIdEnum.GeneralElementsEnum.CHECKIN_BUTTON.getValue());
+//	}
+//
+//	public static void updateVSP(Pair<String, Map<String, String>> vsp) throws Exception{
+//		ExtentTestActions.log(Status.INFO, "Updating VSP " + vsp.left);
+//		importUpdateVSP(vsp, true);
+//	}
+//
+//	public static void importVSP(Pair<String, Map<String, String>> vsp) throws Exception{
+//		ExtentTestActions.log(Status.INFO, "Importing VSP " + vsp.left);
+//		importUpdateVSP(vsp, false);
+//	}
+//
+//	public static void updateVnfAndValidate(String filepath, Pair<String, Map<String, String>> vsp, String updatedVnfFile, User user) throws Exception, Throwable {
+//		ExtentTestActions.log(Status.INFO, String.format("Going to update the VNF with %s......", updatedVnfFile));
+//		System.out.println(String.format("Going to update the VNF with %s......", updatedVnfFile));
+//
+//		Map<String, String> vspMap = vsp.right;
+//		String vspId = vspMap.get("vspId");
+//
+//		updateVendorSoftwareProduct(vspId, updatedVnfFile, filepath, user);
+//		HomePage.showVspRepository();
+//		updateVSP(vsp);
+//		ResourceGeneralPage.getLeftMenu().moveToDeploymentArtifactScreen();
+//		DeploymentArtifactPage.verifyArtifactsExistInTable(filepath, updatedVnfFile);
+//	}
+//
+//	public static Pair<String, Map<String, String>> onboardAndValidate(String filepath, String vnfFile, User user) throws Exception {
+//		ExtentTestActions.log(Status.INFO, String.format("Going to onboard the VNF %s", vnfFile));
+//		System.out.println(String.format("Going to onboard the VNF %s", vnfFile));
+//
+//		AmdocsLicenseMembers amdocsLicenseMembers = createVendorLicense(user);
+//		Pair<String, Map<String, String>> createVendorSoftwareProduct = createVendorSoftwareProduct(vnfFile, filepath, user, amdocsLicenseMembers);
+//		String vspName = createVendorSoftwareProduct.left;
+//
+//		DownloadManager.downloadCsarByNameFromVSPRepository(vspName, createVendorSoftwareProduct.right.get("vspId"));
+//		File latestFilefromDir = FileHandling.getLastModifiedFileNameFromDir();
+//
+//		ExtentTestActions.log(Status.INFO, String.format("Searching for onboarded %s", vnfFile));
+//		HomePage.showVspRepository();
+//		ExtentTestActions.log(Status.INFO,String.format("Going to import %s", vnfFile.substring(0, vnfFile.indexOf("."))));
+//		importVSP(createVendorSoftwareProduct);
+//
+//		ResourceGeneralPage.getLeftMenu().moveToDeploymentArtifactScreen();
+//
+//		// Verify deployment artifacts
+//		Map<String, Object> combinedMap = ArtifactFromCsar.combineHeatArtifacstWithFolderArtifacsToMap(latestFilefromDir.getAbsolutePath());
+//
+//		LinkedList<HeatMetaFirstLevelDefinition> deploymentArtifacts = ((LinkedList<HeatMetaFirstLevelDefinition>) combinedMap.get("Deployment"));
+//		ArtifactsCorrelationManager.addVNFartifactDetails(vspName, deploymentArtifacts);
+//
+//		List<String> heatEnvFilesFromCSAR = deploymentArtifacts.stream().filter(e -> e.getType().equals("HEAT_ENV")).
+//																		 map(e -> e.getFileName()).
+//																		 collect(Collectors.toList());
+//
+//		validateDeploymentArtifactsVersion(deploymentArtifacts, heatEnvFilesFromCSAR);
+//
+//		DeploymentArtifactPage.verifyArtifactsExistInTable(filepath, vnfFile);
+//		return createVendorSoftwareProduct;
+//	}
+//
+//	public static void validateDeploymentArtifactsVersion(LinkedList<HeatMetaFirstLevelDefinition> deploymentArtifacts,
+//			List<String> heatEnvFilesFromCSAR) {
+//		String artifactVersion;
+//		String artifactName;
+//
+//		for(HeatMetaFirstLevelDefinition deploymentArtifact: deploymentArtifacts) {
+//			artifactVersion = "1";
+//
+//			if(deploymentArtifact.getType().equals("HEAT_ENV")) {
+//				continue;
+//			} else if(deploymentArtifact.getFileName().contains(".")) {
+//				artifactName = deploymentArtifact.getFileName().trim().substring(0, deploymentArtifact.getFileName().lastIndexOf("."));
+//			} else {
+//				artifactName = deploymentArtifact.getFileName().trim();
+//			}
+//
+//			if (heatEnvFilesFromCSAR.contains(artifactName + ".env")){
+//				artifactVersion = "2";
+//			}
+//			ArtifactUIUtils.validateArtifactNameVersionType(artifactName, artifactVersion, deploymentArtifact.getType());
+//		}
+//	}
+
+
+    public static VendorSoftwareProductObject fillVendorSoftwareProductObjectWithMetaData(String vnfFile, Pair<String, VendorSoftwareProductObject> createVendorSoftwareProduct) {
+        VendorSoftwareProductObject vendorSoftwareProductObject = new VendorSoftwareProductObject();
+        VendorSoftwareProductObject map = createVendorSoftwareProduct.right;
+        vendorSoftwareProductObject.setAttContact(map.getAttContact());
+        vendorSoftwareProductObject.setCategory(map.getCategory());
+        vendorSoftwareProductObject.setComponentId(map.getComponentId());
+        vendorSoftwareProductObject.setDescription(map.getDescription());
+        vendorSoftwareProductObject.setSubCategory(map.getSubCategory());
+        vendorSoftwareProductObject.setVendorName(map.getVendorName());
+        vendorSoftwareProductObject.setVspId(map.getVspId());
+        vendorSoftwareProductObject.setName(createVendorSoftwareProduct.left);
+        String[] arrFileNameAndExtension = vnfFile.split("\\.");
+        vendorSoftwareProductObject.setOnboardingMethod("NetworkPackage");
+        vendorSoftwareProductObject.setNetworkPackageName(arrFileNameAndExtension[0]);
+        vendorSoftwareProductObject.setOnboardingOrigin(arrFileNameAndExtension[1]);
+
+        return vendorSoftwareProductObject;
+    }
+
+    public static void updateVendorSoftwareProductToNextVersion(VendorSoftwareProductObject vendorSoftwareProductObject, User user, String filepath, String heatFileName) throws Throwable {
+
+        RestResponse createMethod = creationMethodVendorSoftwareProduct(vendorSoftwareProductObject, user);
+        assertEquals("did not succeed to createMethod for new VSP", 200, createMethod.getErrorCode().intValue());
+
+        RestResponse uploadHeatPackage = uploadHeatPackage(filepath, heatFileName, vendorSoftwareProductObject, user);
+        assertEquals("did not succeed to upload HEAT package", 200, uploadHeatPackage.getErrorCode().intValue());
+
+        RestResponse validateUpload = validateUpload(vendorSoftwareProductObject, user);
+        assertEquals("did not succeed to validate upload process, reason: " + validateUpload.getResponse(), 200, validateUpload.getErrorCode().intValue());
+
+        prepareVspForUse(user,vendorSoftwareProductObject, true);
+    }
+
+
+}
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ArtifactRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ArtifactRestUtils.java
index a7ab544..448442e 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ArtifactRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ArtifactRestUtils.java
@@ -50,15 +50,12 @@
 import org.openecomp.sdc.ci.tests.utils.Utils;
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
-import org.openecomp.sdc.common.api.Constants;
 import org.openecomp.sdc.common.util.ValidationUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.AssertJUnit;
 
 import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
 
 public class ArtifactRestUtils extends BaseRestUtils {
 	private static Logger logger = LoggerFactory.getLogger(ArtifactRestUtils.class.getName());
@@ -68,7 +65,7 @@
 	// Delete Artifact on rI of the asset 
 	public static RestResponse externalAPIDeleteArtifactOfComponentInstanceOnAsset(Component component, User user, ComponentInstance resourceInstance, String artifactUUID) throws IOException {
 		Config config = Utils.getConfig();
-		String resourceType = null;
+		String resourceType;
 		String resourceUUID = component.getUUID();
 		String resourceInstanceName = resourceInstance.getNormalizedName();
 		
@@ -88,7 +85,7 @@
 	// Delete Artifact of the asset 
 	public static RestResponse externalAPIDeleteArtifactOfTheAsset(Component component, User user, String artifactUUID) throws IOException {
 		Config config = Utils.getConfig();
-		String resourceType = null;
+		String resourceType;
 		String resourceUUID = component.getUUID();
 		
 		System.out.println(component.getComponentType());
@@ -110,7 +107,7 @@
 	// Update Artifact on rI of the asset 
 	public static RestResponse externalAPIUpdateArtifactOfComponentInstanceOnAsset(Component component, User user, ArtifactReqDetails artifactReqDetails, ComponentInstance resourceInstance, String artifactUUID) throws IOException {
 		Config config = Utils.getConfig();
-		String resourceType = null;
+		String resourceType;
 		String resourceUUID = component.getUUID();
 		String resourceInstanceName = resourceInstance.getNormalizedName();
 		
@@ -130,7 +127,7 @@
 	// Update Artifact of the asset 
 	public static RestResponse externalAPIUpdateArtifactOfTheAsset(Component component, User user, ArtifactReqDetails artifactReqDetails, String artifactUUID) throws IOException {
 		Config config = Utils.getConfig();
-		String resourceType = null;
+		String resourceType;
 		String resourceUUID = component.getUUID();
 		
 		System.out.println(component.getComponentType());
@@ -150,7 +147,7 @@
 	// Upload Artifact on rI of the asset 
 	public static RestResponse externalAPIUploadArtifactOfComponentInstanceOnAsset(Component component, User user, ArtifactReqDetails artifactReqDetails, ComponentInstance resourceInstance) throws IOException {
 		Config config = Utils.getConfig();
-		String resourceType = null;
+		String resourceType;
 		String resourceUUID = component.getUUID();
 		String resourceInstanceName = resourceInstance.getNormalizedName();
 		
@@ -170,7 +167,7 @@
 	// Upload Artifact of the asset 
 	public static RestResponse externalAPIUploadArtifactOfTheAsset(Component component, User user, ArtifactReqDetails artifactReqDetails) throws IOException {
 		Config config = Utils.getConfig();
-		String resourceType = null;
+		String resourceType;
 		String resourceUUID = component.getUUID();
 		
 		System.out.println(component.getComponentType());
@@ -190,7 +187,7 @@
 	// Upload Artifact of the asset with invalid checksum
 	public static RestResponse externalAPIUploadArtifactWithInvalidCheckSumOfComponentInstanceOnAsset(Component component, User user, ArtifactReqDetails artifactReqDetails, ComponentInstance resourceInstance) throws IOException {
 		Config config = Utils.getConfig();
-		String resourceType = null;
+		String resourceType;
 		String resourceUUID = component.getUUID();
 		String resourceInstanceName = resourceInstance.getNormalizedName();
 		
@@ -210,7 +207,7 @@
 	// Upload Artifact of the asset with invalid checksum
 	public static RestResponse externalAPIUploadArtifactWithInvalidCheckSumOfTheAsset(Component component, User user, ArtifactReqDetails artifactReqDetails) throws IOException {
 		Config config = Utils.getConfig();
-		String resourceType = null;
+		String resourceType;
 		String resourceUUID = component.getUUID();
 		
 		System.out.println(component.getComponentType());
@@ -232,7 +229,7 @@
 	//
 	public static RestResponse getResourceDeploymentArtifactExternalAPI(String resourceUUID, String artifactUUID,User sdncModifierDetails, String resourceType) throws IOException {
 		Config config = Utils.getConfig();
-		String url = null;
+		String url;
 		
 		if (resourceType.toUpperCase().equals("SERVICE")) {
 			url = String.format(Urls.GET_DOWNLOAD_SERVICE_ARTIFACT_OF_ASSET, config.getCatalogBeHost(), config.getCatalogBePort(), resourceUUID, artifactUUID);
@@ -241,11 +238,12 @@
 			url = String.format(Urls.GET_DOWNLOAD_RESOURCE_ARTIFACT_OF_ASSET, config.getCatalogBeHost(), config.getCatalogBePort(), resourceUUID, artifactUUID);
 		}
 		
-		Map<String, String> headersMap = new HashMap<String,String>();
+		Map<String, String> headersMap = new HashMap<>();
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), sdncModifierDetails.getUserId());
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), authorizationHeader);
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(),acceptMultipartHeader);
 		
 		HttpRequest http = new HttpRequest();
 
@@ -265,7 +263,7 @@
 	
 	public static RestResponse getComponentInstanceDeploymentArtifactExternalAPI(String resourceUUID, String componentNormalizedName, String artifactUUID,User sdncModifierDetails, String resourceType) throws IOException {
 		Config config = Utils.getConfig();
-		String url = null;
+		String url;
 		
 		if (resourceType.toLowerCase().equals("service")) {
 			url = String.format(Urls.GET_DOWNLOAD_SERVICE_ARTIFACT_OF_COMPONENT_INSTANCE, config.getCatalogBeHost(), config.getCatalogBePort(), resourceUUID, componentNormalizedName, artifactUUID);
@@ -274,11 +272,12 @@
 			url = String.format(Urls.GET_DOWNLOAD_RESOURCE_ARTIFACT_OF_COMPONENT_INSTANCE, config.getCatalogBeHost(), config.getCatalogBePort(), resourceUUID, componentNormalizedName, artifactUUID);
 		}
 		
-		Map<String, String> headersMap = new HashMap<String,String>();
+		Map<String, String> headersMap = new HashMap<>();
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), sdncModifierDetails.getUserId());
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), authorizationHeader);
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(),acceptMultipartHeader);
 		
 		HttpRequest http = new HttpRequest();
 
@@ -443,7 +442,7 @@
 	
 	
 	public static Map<String, String> getHeadersMap(User sdncModifierDetails) {
-		Map<String, String> headersMap = new HashMap<String,String>();	
+		Map<String, String> headersMap = new HashMap<>();
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptJsonHeader);
 		
@@ -602,9 +601,9 @@
 	
 	public static RestResponse uploadDeploymentArtifact(ArtifactReqDetails artifactDetails, Component component, User sdncModifierDetails) throws IOException {
 		Config config = Utils.getConfig();
-		Map<String, String> additionalHeaders = null;
+		Map<String, String> additionalHeaders;
 		String checksum = ResponseParser.calculateMD5Header(artifactDetails);
-		additionalHeaders = new HashMap<String, String>();
+		additionalHeaders = new HashMap<>();
 		additionalHeaders.put(HttpHeaderEnum.Content_MD5.getValue(), checksum);
 		
 		ComponentTypeEnum componentType = component.getComponentType();
@@ -614,26 +613,26 @@
 		switch (componentType){
 
 		case RESOURCE:
-		{
-			url = String.format(Urls.UPDATE_OR_DELETE_ARTIFACT_OF_SERVICE, config.getCatalogBeHost(),config.getCatalogBePort(), component.getUniqueId(), artifactDetails.getUniqueId());
-			
-			break;
-		}
-		case SERVICE: {
-			
-			break;
-		}
-		
-		case PRODUCT: {
-			
-			break;
-		}
-		
-		default: {//dummy
-			assertTrue("failed on enum selection", false);
-			
-			break;
-		}
+			{
+				url = String.format(Urls.UPDATE_OR_DELETE_ARTIFACT_OF_SERVICE, config.getCatalogBeHost(),config.getCatalogBePort(), component.getUniqueId(), artifactDetails.getUniqueId());
+
+				break;
+			}
+			case SERVICE: {
+
+				break;
+			}
+
+			case PRODUCT: {
+
+				break;
+			}
+
+			default: {//dummy
+				assertTrue("failed on enum selection", false);
+
+				break;
+			}
 		}
 		
 		
@@ -654,9 +653,9 @@
 	public static RestResponse uploadArtifact(ArtifactReqDetails artifactDetails, Component component, User sdncModifierDetails) throws IOException {
 		Config config = Utils.getConfig();
 		List<String> placeHolderlst = Utils.getListOfResPlaceHoldersDepArtTypes();
-		Map<String, String> additionalHeaders = null;
-		String checksum = null;	
-		String url= null;
+		Map<String, String> additionalHeaders;
+		String checksum;
+		String url;
 //
 //		
 //		if (artifactDetails.getArtifactGroupType() != null
@@ -676,7 +675,7 @@
 //
 //		else {
 			checksum = ResponseParser.calculateMD5Header(artifactDetails);
-			additionalHeaders = new HashMap<String, String>();
+			additionalHeaders = new HashMap<>();
 			additionalHeaders.put(HttpHeaderEnum.Content_MD5.getValue(), checksum);
 			url = String.format(Urls.UPLOAD_DELETE_ARTIFACT_OF_COMPONENT, config.getCatalogBeHost(),
 					config.getCatalogBePort(), ComponentTypeEnum.findParamByType(component.getComponentType()),
@@ -700,13 +699,13 @@
 	
 	//*************** PRIVATE **************
 	private static RestResponse deleteInformationalArtifact(User sdncModifierDetails, String url) throws IOException {
-		Map<String, String> additionalHeaders = null;
+		Map<String, String> additionalHeaders;
 
-			additionalHeaders = new HashMap<String, String>();
+			additionalHeaders = new HashMap<>();
 		
 		
 		additionalHeaders.put(HttpHeaderEnum.AUTHORIZATION.getValue(), authorizationHeader);
-		additionalHeaders.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		additionalHeaders.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 		
 		return sendDelete(url, sdncModifierDetails.getUserId(), additionalHeaders);
 
@@ -729,12 +728,12 @@
 	private static RestResponse uploadInformationalArtifact(ArtifactReqDetails artifactDetails, User sdncModifierDetails, String checksum, String url) throws IOException {
 		Map<String, String> additionalHeaders = null;
 		if (checksum != null && !checksum.isEmpty()) {
-			additionalHeaders = new HashMap<String, String>();
+			additionalHeaders = new HashMap<>();
 			additionalHeaders.put(HttpHeaderEnum.Content_MD5.getValue(), checksum);
 		}
 		
 		additionalHeaders.put(HttpHeaderEnum.AUTHORIZATION.getValue(), authorizationHeader);
-		additionalHeaders.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		additionalHeaders.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 
 		Gson gson = new Gson();
 //		System.out.println("ArtifactDetails: "+ jsonBody);
@@ -749,10 +748,10 @@
 	}
 	
 	private static RestResponse addArtifactToInstance(ArtifactReqDetails artifactDetails, User sdncModifierDetails, String checksum, String url) throws IOException {
-		Map<String, String> additionalHeaders = null;
-		additionalHeaders = new HashMap<String, String>();
+		Map<String, String> additionalHeaders;
+		additionalHeaders = new HashMap<>();
 		if (checksum != null && !checksum.isEmpty()) {
-			additionalHeaders = new HashMap<String, String>();
+			additionalHeaders = new HashMap<>();
 			additionalHeaders.put(HttpHeaderEnum.Content_MD5.getValue(), checksum);
 		}
 		additionalHeaders.put(HttpHeaderEnum.ACCEPT.getValue(), "application/json, text/plain, */*");
@@ -769,8 +768,8 @@
 	}
 	
 	private static RestResponse updateDeploymentArtifact(ArtifactDefinition artifactDefinition, User sdncModifierDetails, String url) throws IOException {
-		Map<String, String> additionalHeaders = null;
-		additionalHeaders = new HashMap<String, String>();
+		Map<String, String> additionalHeaders;
+		additionalHeaders = new HashMap<>();
 		additionalHeaders.put(HttpHeaderEnum.ACCEPT.getValue(), "application/json, text/plain, */*");
 		additionalHeaders.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json;charset=UTF-8");
 		
@@ -782,9 +781,9 @@
 	}
 	
 	private static RestResponse updateDeploymentArtifact(ArtifactReqDetails artifactDetails, User sdncModifierDetails, String url) throws IOException {
-		Map<String, String> additionalHeaders = null;
+		Map<String, String> additionalHeaders;
 		
-			additionalHeaders = new HashMap<String, String>();
+			additionalHeaders = new HashMap<>();
 			additionalHeaders.put(HttpHeaderEnum.ACCEPT.getValue(), "application/json, text/plain, */*");
 			additionalHeaders.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json;charset=UTF-8");
 //			additionalHeaders.put(HttpHeaderEnum..getValue(), "application/json;charset=UTF-8");
@@ -805,7 +804,7 @@
 	private static RestResponse downloadArtifact(String url, User user, Map<String, String> addionalHeaders,boolean addEcompHeader) throws IOException
 	{	
 		if(addEcompHeader){
-			addionalHeaders.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), ecomp);
+			addionalHeaders.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 		}
 		return downloadArtifact(url, user, addionalHeaders, acceptOctetStream);
 	}
@@ -906,29 +905,5 @@
 
 	}
 
-	
-	public static ArtifactDefinition getArtifactDataFromJson(String json) {
-		Gson gson = new Gson();
-		JsonObject jsonElement = new JsonObject();
-		jsonElement = gson.fromJson(json, jsonElement.getClass());
-		ArtifactDefinition artifact = new ArtifactDefinition(); 
-		String payload = null;
-		JsonElement artifactPayload = jsonElement.get(Constants.ARTIFACT_PAYLOAD_DATA);
-		if (artifactPayload != null && !artifactPayload.isJsonNull()) {
-			payload = artifactPayload.getAsString();
-		}
-		jsonElement.remove(Constants.ARTIFACT_PAYLOAD_DATA);
-		artifact = gson.fromJson(jsonElement, ArtifactDefinition.class);
-		artifact.setPayloadData(payload);
-		
-		/*atifact.setArtifactName(UPLOAD_ARTIFACT_NAME);
-artifact.setArtifactDisplayName("configure");
-artifact.setArtifactType("SHELL");
-artifact.setMandatory(false);
-artifact.setDescription("ff");
-artifact.setPayloadData(UPLOAD_ARTIFACT_PAYLOAD);
-artifact.setArtifactLabel("configure");*/
-		return artifact;
-	}
 
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/AssetRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/AssetRestUtils.java
index 4ade9eb..13cfb8f 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/AssetRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/AssetRestUtils.java
@@ -31,7 +31,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.UUID;
 
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
@@ -39,7 +38,7 @@
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
@@ -78,8 +77,6 @@
 	static ObjectMapper objectMapper = new ObjectMapper();
 
 	static Logger logger = LoggerFactory.getLogger(AssetRestUtils.class.getName());
-	static final String contentTypeHeaderData = "application/json";
-	static final String acceptHeaderDate = "application/json";
 	static final String basicAuthentication = "Basic Y2k6MTIzNDU2";
 	// /sdc/v1/catalog/{services/resources}/{componentUUID}/artifacts/{artifactUUID}
 	static final String COMPONENT_ARTIFACT_URL = "/sdc/v1/catalog/%s/%s/artifacts/%s";
@@ -93,7 +90,7 @@
 				assetType.getValue(), uuid);
 		HttpGet httpGet = new HttpGet(url);
 
-		httpGet.addHeader(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		httpGet.addHeader(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 		httpGet.addHeader(HttpHeaderEnum.AUTHORIZATION.getValue(), basicAuthentication);
 
 		logger.debug("Send GET request to get Tosca model: {}", url);
@@ -101,18 +98,27 @@
 		return httpclient.execute(httpGet);
 	}
 	
+	public static File getToscaModelCsarFile(AssetTypeEnum assetType, String uuid) throws IOException {
+		return getToscaModelCsarFile(assetType, uuid, "");
+	}
+	
 	public static File getToscaModelCsarFile(AssetTypeEnum assetType, String uuid, String fileName) throws IOException {
+		File myFile;
 		Config config = Utils.getConfig();
 		CloseableHttpClient httpclient = HttpClients.createDefault();
 		String url = String.format(Urls.GET_TOSCA_MODEL, config.getCatalogBeHost(), config.getCatalogBePort(),
 				assetType.getValue(), uuid);
 		HttpGet httpGet = new HttpGet(url);
-
-		String csarDir = FileHandling.getCreateDirByName("outputCsar");
-		File myFile = new File(csarDir+ File.separator + "tmpCSAR_" + fileName + ".csar");
+		
+		if(fileName.isEmpty()) {
+			myFile = new File("tmpCSAR");			
+		} else {
+			String csarDir = FileHandling.getCreateDirByName("outputCsar");
+			myFile = new File(csarDir+ File.separator + "tmpCSAR_" + fileName + ".csar");
+		}
 
 		
-		httpGet.addHeader(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		httpGet.addHeader(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 		httpGet.addHeader(HttpHeaderEnum.AUTHORIZATION.getValue(), basicAuthentication);
 
 		logger.debug("Send GET request to get Tosca model: {}", url);
@@ -127,19 +133,17 @@
 	    }
 		return myFile;
 	}
-
-
-
+	
 	public static RestResponse getRestResponseComponentToscaModel(AssetTypeEnum assetType, String uuid) throws IOException {
 		Config config = Utils.getConfig();
 		
 		String url = String.format(Urls.GET_TOSCA_MODEL, config.getCatalogBeHost(), config.getCatalogBePort(),
 				assetType.getValue(), uuid);
 		
-		Map<String, String> headersMap = new HashMap<String,String>();
+		Map<String, String> headersMap = new HashMap<>();
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), authorizationHeader);
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 		
 		HttpRequest http = new HttpRequest();
 
@@ -158,16 +162,16 @@
 	public static RestResponse getComponentListByAssetType(boolean isBasicAuthentication, AssetTypeEnum assetType,
 			String... filterArrayString) throws IOException {
 		Config config = Utils.getConfig();
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		if (isBasicAuthentication) {
 			headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), basicAuthentication);
 		}
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 
 		HttpRequest http = new HttpRequest();
-		String url = String.format(Urls.GET_ASSET_LIST, config.getCatalogBeHost(), config.getCatalogBePort(),
+			String url = String.format(Urls.GET_ASSET_LIST, config.getCatalogBeHost(), config.getCatalogBePort(),
 				assetType.getValue());
 		if (filterArrayString != null && filterArrayString.length > 0) {
 			url = buildUrlWithFilter(url, filterArrayString);
@@ -180,11 +184,11 @@
 
 	public static RestResponse getFilteredComponentList(AssetTypeEnum assetType, String query) throws IOException {
 		Config config = Utils.getConfig();
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), basicAuthentication);
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 
 		HttpRequest http = new HttpRequest();
 
@@ -217,13 +221,13 @@
 			AssetTypeEnum assetType, String uuid) throws IOException {
 
 		Config config = Utils.getConfig();
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		if (isBasicAuthentication) {
 			headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), basicAuthentication);
 		}
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 
 		HttpRequest http = new HttpRequest();
 		String url = String.format(Urls.GET_ASSET_METADATA, config.getCatalogBeHost(), config.getCatalogBePort(),
@@ -628,8 +632,5 @@
 		}
 		return null;
 	}
-	private static String getShortUUID() {
-		return UUID.randomUUID().toString().split("-")[0];
-	}
 	
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/AutomationUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/AutomationUtils.java
index 2e27907..65ab6c9 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/AutomationUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/AutomationUtils.java
@@ -61,11 +61,19 @@
 	
 	
 	
-	public static void createVersionsInfoFile(String filepath, String onboardVersion, String osVersion, String envData, String suiteName)
-			throws FileNotFoundException, IOException {
+	public static void createVersionsInfoFile(String filepath, String onboardVersion, String osVersion, String envData, String suiteName) throws IOException {
 		File myFoo = new File(filepath);
 		FileOutputStream fooStream = new FileOutputStream(myFoo, false); // true to append
-		String versions =  ("onboardVesrion=\""+ onboardVersion+ "\"\n" + "osVersion=\"" + osVersion + "\"\n" + "env=\""+ envData + "\"\n" + "suiteName=\""+ suiteName+ "\"\n");
+		String versions =  ("onboardVersion=\""+ onboardVersion+ "\"\n" + "osVersion=\"" + osVersion + "\"\n" + "env=\""+ envData + "\"\n" + "suiteName=\""+ suiteName+ "\"\n");
+		byte[] myBytes = versions.getBytes();
+		fooStream.write(myBytes);
+		fooStream.close();
+	}
+
+	public static void createVersionsInfoFile(String filepath, String onboardVersion, String osVersion, String envData, String suiteName, String reportStartTime) throws IOException {
+		File myFoo = new File(filepath);
+		FileOutputStream fooStream = new FileOutputStream(myFoo, false); // true to append
+		String versions =  ("onboardVersion=\""+ onboardVersion+ "\"\n" + "osVersion=\"" + osVersion + "\"\n" + "env=\""+ envData + "\"\n" + "suiteName=\""+ suiteName+ "\"\n" + "reportStartTime=\""+ reportStartTime+ "\"\n");
 		byte[] myBytes = versions.getBytes();
 		fooStream.write(myBytes);
 		fooStream.close();
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/BaseRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/BaseRestUtils.java
index 4ea4047..4ec0353 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/BaseRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/BaseRestUtils.java
@@ -45,10 +45,13 @@
 	public static final String acceptHeaderData = "application/json";
 	public static final String acceptJsonHeader = "application/json";
 	public static final String acceptOctetHeader = "application/octet-stream";
+	public static final String acceptMultipartHeader = "application/octet-stream";
 	public static final String authorizationHeader = "Basic " + Base64.encodeBase64String("ci:123456".getBytes());
 	public static final String acceptOctetStream = "application/octet-stream";
 	public static final String ecomp = "ecomp";
 	public static final String authorizationPrefixString = "Basic ";
+	public static final String xEcompInstanceId = "a1bd39f6-d55e-45b2-9207-156216af5cb5";
+	public static final String cacheControlHeader = "no-cache";
 
 	public static final String RESOURCE_COMPONENT_TYPE = "resources";
 	public static final String PRODUCT_COMPONENT_TYPE = "products";
@@ -86,7 +89,7 @@
 	}
 
 	protected static Map<String, String> prepareHeadersMap(String userId, String accept) {
-		Map<String, String> headersMap = new HashMap<String, String>();
+		Map<String, String> headersMap = new HashMap<>();
 		if (contentTypeHeaderData != null) {
 			headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		}
@@ -257,7 +260,7 @@
 		String userCredentials = userName + ":" + password;
 		encodeBase64 = Base64.encodeBase64(userCredentials.getBytes());
 		String encodedUserCredentials = authorizationPrefixString + new String(encodeBase64);
-		Map<String, String> authorizationHeader = new HashMap<String, String>();
+		Map<String, String> authorizationHeader = new HashMap<>();
 		authorizationHeader.put(HttpHeaderEnum.AUTHORIZATION.getValue(), encodedUserCredentials);
 		return authorizationHeader;
 	}
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/CatalogRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/CatalogRestUtils.java
index 449b6be..b09ba10 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/CatalogRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/CatalogRestUtils.java
@@ -67,7 +67,7 @@
 		String url = String.format(Urls.GET_ALL_CATEGORIES_FE, config.getCatalogFeHost(), config.getCatalogFePort(),
 				BaseRestUtils.RESOURCE_COMPONENT_TYPE);
 
-		Map<String, String> additionalHeaders = new HashMap<String, String>();
+		Map<String, String> additionalHeaders = new HashMap<>();
 		additionalHeaders.put(HttpHeaderEnum.X_ECOMP_REQUEST_ID_HEADER.getValue(), uuid);
 
 		return sendGet(url, UserRoleEnum.DESIGNER.getUserId(), additionalHeaders);
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ComponentInstanceRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ComponentInstanceRestUtils.java
index 1b550e4..64b576e 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ComponentInstanceRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ComponentInstanceRestUtils.java
@@ -43,7 +43,7 @@
 import com.google.gson.Gson;
 
 public class ComponentInstanceRestUtils extends BaseRestUtils {
-	public static String acceptHeaderDate = "application/json";
+//	public static String acceptHeaderDate = "application/json";
 	static Config config = Config.instance();
 	public static Gson gson = new Gson();
 
@@ -87,7 +87,7 @@
 
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
+		Map<String, String> headersMap = new HashMap<>();
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), user.getUserId());
@@ -207,7 +207,7 @@
 
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
+		Map<String, String> headersMap = new HashMap<>();
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), user.getUserId());
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ConsumerRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ConsumerRestUtils.java
index 0aadfdb..5e35327 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ConsumerRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ConsumerRestUtils.java
@@ -20,12 +20,9 @@
 
 package org.openecomp.sdc.ci.tests.utils.rest;
 
-import static org.testng.AssertJUnit.assertEquals;
-
-import java.util.Map;
-
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
 import org.openecomp.sdc.be.datatypes.elements.ConsumerDataDefinition;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.ci.tests.api.Urls;
@@ -34,7 +31,9 @@
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.Utils;
 
-import com.google.gson.Gson;
+import java.util.Map;
+
+import static org.testng.AssertJUnit.assertEquals;
 
 public class ConsumerRestUtils extends BaseRestUtils {
 
@@ -123,9 +122,8 @@
 
 		String bodyToParse = restResponse.getResponse();
 		ObjectMapper mapper = new ObjectMapper();
-		mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 		try {
-			mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 			ConsumerDataDefinition component = mapper.readValue(bodyToParse, ConsumerDataDefinition.class);
 			return component;
 		} catch (Exception e) {
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/EcompUserRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/EcompUserRestUtils.java
index 458aa4a..9fdab02 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/EcompUserRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/EcompUserRestUtils.java
@@ -44,8 +44,6 @@
 	static Gson gson = new Gson();
 
 	static Logger logger = LoggerFactory.getLogger(EcompUserRestUtils.class.getName());
-	static String contentTypeHeaderData = "application/json";
-	static String acceptHeaderDate = "application/json";
 	static String ecompUsername = "12345";
 	static String ecompPassword = "12345";
 
@@ -58,9 +56,9 @@
 	public static RestResponse pushUser(EcompUser ecompUser) throws IOException {
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.ECOMP_USERNAME.getValue(), ecompUsername);
 		headersMap.put(HttpHeaderEnum.ECOMP_PASSWORD.getValue(), ecompPassword);
 
@@ -84,9 +82,9 @@
 	public static RestResponse editUser(String loginId, EcompUser ecompUser) throws IOException {
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.ECOMP_USERNAME.getValue(), ecompUsername);
 		headersMap.put(HttpHeaderEnum.ECOMP_PASSWORD.getValue(), ecompPassword);
 
@@ -110,9 +108,9 @@
 	public static RestResponse getUser(String loginId) throws IOException {
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.ECOMP_USERNAME.getValue(), ecompUsername);
 		headersMap.put(HttpHeaderEnum.ECOMP_PASSWORD.getValue(), ecompPassword);
 
@@ -130,9 +128,9 @@
 	public static RestResponse getAllUsers() throws IOException {
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.ECOMP_USERNAME.getValue(), ecompUsername);
 		headersMap.put(HttpHeaderEnum.ECOMP_PASSWORD.getValue(), ecompPassword);
 
@@ -150,9 +148,9 @@
 	public static RestResponse getAllAvailableRoles() throws IOException {
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.ECOMP_USERNAME.getValue(), ecompUsername);
 		headersMap.put(HttpHeaderEnum.ECOMP_PASSWORD.getValue(), ecompPassword);
 
@@ -174,9 +172,9 @@
 	public static RestResponse pushUserRoles(String loginId, List<EcompRole> roles) throws IOException {
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.ECOMP_USERNAME.getValue(), ecompUsername);
 		headersMap.put(HttpHeaderEnum.ECOMP_PASSWORD.getValue(), ecompPassword);
 
@@ -204,9 +202,9 @@
 	public static RestResponse getUserRoles(String loginId) throws IOException {
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.ECOMP_USERNAME.getValue(), ecompUsername);
 		headersMap.put(HttpHeaderEnum.ECOMP_PASSWORD.getValue(), ecompPassword);
 
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/GroupRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/GroupRestUtils.java
index d79c8e0..f55cdbd 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/GroupRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/GroupRestUtils.java
@@ -36,7 +36,6 @@
 import com.google.gson.Gson;
 
 public class GroupRestUtils extends BaseRestUtils {
-	public static String acceptHeaderDate = "application/json";
 	static Config config = Config.instance();
 	public static Gson gson = new Gson();
 
@@ -44,7 +43,7 @@
 
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
+		Map<String, String> headersMap = new HashMap<>();
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), user.getUserId());
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ImportRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ImportRestUtils.java
index 0be4384..40dc060 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ImportRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ImportRestUtils.java
@@ -48,7 +48,6 @@
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.codehaus.jettison.json.JSONException;
-import org.openecomp.sdc.be.dao.rest.HttpRestClient;
 import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.ci.tests.api.Urls;
 import org.openecomp.sdc.ci.tests.config.Config;
@@ -61,7 +60,7 @@
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.Utils;
 import org.openecomp.sdc.ci.tests.utils.validation.ErrorValidationUtils;
-import org.openecomp.sdc.common.rest.api.RestResponseAsByteArray;
+import org.openecomp.sdc.common.http.client.api.HttpResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -351,7 +350,7 @@
 		}
 	}
 
-	public static RestResponseAsByteArray getCsar(String csarUid, User sdncModifierDetails) throws Exception {
+	public static HttpResponse<byte []> getCsar(String csarUid, User sdncModifierDetails) throws Exception {
 
 		Config config = Utils.getConfig();
 		String url = String.format(Urls.GET_CSAR_USING_SIMULATOR, config.getCatalogBeHost(), config.getCatalogBePort(),
@@ -367,17 +366,11 @@
 		// System.out.println(url);
 		// System.out.println(userBodyJson);
 
-		HttpRestClient httpRestClient = new HttpRestClient();
-
 		for (Map.Entry<String, String> mapEntry : headersMap.entrySet()) {
 
 			downloadCsarHeaders.put(mapEntry.getKey(), mapEntry.getValue());
 		}
-		RestResponseAsByteArray doGetAsByteArray = httpRestClient.doGetAsByteArray(url, downloadCsarHeaders);
-		// RestResponse getCsar = http.httpSendGet(url, headersMap);
-
-		return doGetAsByteArray;
-
+		return org.openecomp.sdc.common.http.client.api.HttpRequest.getAsByteArray(url, downloadCsarHeaders);
 	}
 
 	private static File getGroupTypeZipFile(String elementName) throws IOException {
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/LifecycleRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/LifecycleRestUtils.java
index 39afff9..9c0b7a8 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/LifecycleRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/LifecycleRestUtils.java
@@ -111,10 +111,10 @@
 		Config config = Utils.getConfig();
 		String url = String.format(Urls.POST_EXTERNAL_API_CHANGE_LIFE_CYCLE_OF_ASSET, config.getCatalogBeHost(), config.getCatalogBePort(), assetTypeEnum.getValue(), assetUUID, lifeCycleStatesEnum.getState());
 		
-		Map<String, String> additionalHeaders = new HashMap<String, String>();
+		Map<String, String> additionalHeaders = new HashMap<>();
 		
 		additionalHeaders.put(HttpHeaderEnum.AUTHORIZATION.getValue(), authorizationHeader);
-		additionalHeaders.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		additionalHeaders.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 
 		String jsonBody = "{\"userRemarks\": \"" + comment + "\"}";
 
@@ -361,7 +361,7 @@
 	}
 
 	private static Map<String, String> prepareHeadersMap(User sdncModifierDetails) {
-		Map<String, String> headersMap = new HashMap<String, String>();
+		Map<String, String> headersMap = new HashMap<>();
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), sdncModifierDetails.getUserId());
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/PropertyRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/PropertyRestUtils.java
index 33704a5..d507c2c 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/PropertyRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/PropertyRestUtils.java
@@ -20,32 +20,28 @@
 
 package org.openecomp.sdc.ci.tests.utils.rest;
 
-import static org.testng.AssertJUnit.assertNotNull;
-import static org.testng.AssertJUnit.assertNull;
-import static org.testng.AssertJUnit.assertTrue;
+import com.google.gson.Gson;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.model.*;
+import org.openecomp.sdc.ci.tests.api.Urls;
+import org.openecomp.sdc.ci.tests.config.Config;
+import org.openecomp.sdc.ci.tests.datatypes.PropertyObject;
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpHeaderEnum;
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpHeaderEnum;
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpRequest;
+import org.openecomp.sdc.ci.tests.datatypes.http.HttpRequest;
+import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
+import org.openecomp.sdc.common.util.GeneralUtility;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.openecomp.sdc.ci.tests.datatypes.PropertyObject;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
-import org.openecomp.sdc.be.model.Component;
-import org.openecomp.sdc.be.model.ComponentInstance;
-import org.openecomp.sdc.be.model.ComponentInstanceInput;
-import org.openecomp.sdc.be.model.ComponentInstanceProperty;
-import org.openecomp.sdc.be.model.PropertyDefinition;
-import org.openecomp.sdc.be.model.Resource;
-import org.openecomp.sdc.be.model.Service;
-import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.ci.tests.api.Urls;
-import org.openecomp.sdc.ci.tests.config.Config;
-import org.openecomp.sdc.ci.tests.datatypes.http.HttpHeaderEnum;
-import org.openecomp.sdc.ci.tests.datatypes.http.HttpRequest;
-import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
-import org.openecomp.sdc.common.util.GeneralUtility;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import static org.testng.AssertJUnit.*;
 
 import com.google.gson.Gson;
 
@@ -69,6 +65,14 @@
 		return sendPut(url, body, user.getUserId(), acceptHeaderData);
 	}
 
+	public static RestResponse updateGroupProperty(Component component, String groupId, String body, User user)
+			throws Exception {
+		Config config = Config.instance();
+
+		String url = String.format(Urls.RESOURCE_GROUP_PROPERTY, config.getCatalogBeHost(), config.getCatalogBePort(), component.getUniqueId(), groupId);
+		return sendPut(url, body, user.getUserId(), acceptHeaderData);
+	}
+
 	public static RestResponse getProperty(String resourceId, String propertyId, User user) throws Exception {
 		Config config = Config.instance();
 		String url = String.format(Urls.GET_PROPERTY, config.getCatalogBeHost(), config.getCatalogBePort(), resourceId,
@@ -337,4 +341,24 @@
 		}
 		return declareProportiesResponse;
 	}
+
+	public static RestResponse updateInput(Component componentObject, PropertyObject componentInput, User sdncModifierDetails)
+			throws Exception {
+		Config config = Config.instance();
+		String url = String.format(Urls.UPDATE_INPUT, config.getCatalogBeHost(), config.getCatalogBePort(), componentObject.getUniqueId());
+		String userId = sdncModifierDetails.getUserId();
+		Map<String, String> headersMap = prepareHeadersMap(userId);
+		Gson gson = new Gson();
+		String userBodyJson = gson.toJson(componentInput);
+		String calculateMD5 = GeneralUtility.calculateMD5Base64EncodedByString(userBodyJson);
+		headersMap.put(HttpHeaderEnum.Content_MD5.getValue(), calculateMD5);
+		HttpRequest http = new HttpRequest();
+		// System.out.println(url);
+		// System.out.println(userBodyJson);
+		RestResponse declareProportiesResponse = http.httpSendPost(url, userBodyJson, headersMap);
+		if (declareProportiesResponse.getErrorCode() == STATUS_CODE_GET_SUCCESS) {
+
+		}
+		return declareProportiesResponse;
+	}
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResourceRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResourceRestUtils.java
index 2f33273..5f8eeca 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResourceRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResourceRestUtils.java
@@ -113,15 +113,12 @@
 		Gson gson = new Gson();
 		String resourceImportBodyJson = gson.toJson(importReqDetails);
 		HttpRequest http = new HttpRequest();
-		// System.out.println(url);
-		// System.out.println(resourceImportBodyJson);
 
 		Map<String, String> headersMap = prepareHeadersMap(userId);
 		if (additionalHeaders != null) {
 			headersMap.putAll(additionalHeaders);
 		} else {
-			headersMap.put(HttpHeaderEnum.Content_MD5.getValue(),
-					ArtifactRestUtils.calculateMD5(resourceImportBodyJson));
+			headersMap.put(HttpHeaderEnum.Content_MD5.getValue(), ArtifactRestUtils.calculateMD5(resourceImportBodyJson));
 		}
 
 		RestResponse createResourceResponse = http.httpSendPost(url, resourceImportBodyJson, headersMap);
@@ -272,7 +269,7 @@
 		
 		Map<String, String> headersMap =  prepareHeadersMap(sdncModifierDetails.getUserId());
 		headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), authorizationHeader);
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 
 		return sendGet(url, sdncModifierDetails.getUserId(), headersMap);
 
@@ -285,7 +282,7 @@
 		
 		Map<String, String> headersMap =  prepareHeadersMap(sdncModifierDetails.getUserId());
 		headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), authorizationHeader);
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 
 		return sendGet(url, sdncModifierDetails.getUserId(), headersMap);
 
@@ -298,7 +295,7 @@
 		
 		Map<String, String> headersMap =  prepareHeadersMap(sdncModifierDetails.getUserId());
 		headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), authorizationHeader);
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 
 		return sendGet(url, sdncModifierDetails.getUserId(), headersMap);
 
@@ -359,9 +356,9 @@
 		HttpRequest http = new HttpRequest();
 		String url = String.format(Urls.GET_PROPERTY_SCOPES_LIST, config.getCatalogBeHost(), config.getCatalogBePort());
 
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json");
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), "application/json");
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), "cs0008");
 
 		return http.httpSendGet(url, headersMap);
@@ -374,10 +371,10 @@
 		HttpRequest http = new HttpRequest();
 		String url = String.format(Urls.GET_ALL_ARTIFACTS, config.getCatalogBeHost(), config.getCatalogBePort());
 
-		Map<String, String> headersMap = new HashMap<String, String>();
+		Map<String, String> headersMap = new HashMap<>();
 
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json");
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), "application/json");
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), acceptJsonHeader);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptJsonHeader);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), "cs0008");
 
 		return http.httpSendGet(url, headersMap);
@@ -390,9 +387,9 @@
 		HttpRequest http = new HttpRequest();
 		String url = String.format(Urls.GET_CONFIGURATION, config.getCatalogBeHost(), config.getCatalogBePort());
 
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json");
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), "application/json");
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), acceptJsonHeader);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptJsonHeader);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), "cs0008");
 
 		return http.httpSendGet(url, headersMap);
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResourceRestUtilsExternalAPI.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResourceRestUtilsExternalAPI.java
index d9b8ec3..76d2ede 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResourceRestUtilsExternalAPI.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResourceRestUtilsExternalAPI.java
@@ -50,7 +50,7 @@
 		String calculateMD5 = GeneralUtility.calculateMD5Base64EncodedByString(userBodyJson);
 		headersMap.put(HttpHeaderEnum.Content_MD5.getValue(), calculateMD5);
 		headersMap.put(HttpHeaderEnum.AUTHORIZATION.getValue(), authorizationHeader);
-		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), "ci");
+		headersMap.put(HttpHeaderEnum.X_ECOMP_INSTANCE_ID.getValue(), BaseRestUtils.xEcompInstanceId);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), sdncModifierDetails.getUserId());
 		
 		HttpRequest http = new HttpRequest();
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResponseParser.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResponseParser.java
index 6f83ec9..d78a6c9 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResponseParser.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ResponseParser.java
@@ -20,22 +20,16 @@
 
 package org.openecomp.sdc.ci.tests.utils.rest;
 
-import java.io.IOException;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
-import org.codehaus.jackson.Version;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.JsonDeserializer;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.module.SimpleModule;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.simple.JSONObject;
@@ -44,12 +38,13 @@
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
+import org.openecomp.sdc.be.model.GroupDefinition;
 import org.openecomp.sdc.be.model.Product;
 import org.openecomp.sdc.be.model.PropertyConstraint;
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.category.CategoryDefinition;
-import org.openecomp.sdc.be.model.operations.impl.PropertyOperation.PropertyConstraintJacksonDeserialiser;
+import org.openecomp.sdc.be.model.operations.impl.PropertyOperation.PropertyConstraintJacksonDeserializer;
 import org.openecomp.sdc.ci.tests.datatypes.ArtifactReqDetails;
 import org.openecomp.sdc.ci.tests.datatypes.ResourceAssetStructure;
 import org.openecomp.sdc.ci.tests.datatypes.ResourceRespJavaObject;
@@ -57,11 +52,16 @@
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.Utils;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.List;
+import java.util.Map;
 
 public class ResponseParser {
 
@@ -104,16 +104,25 @@
 
 	public static String getValueFromJsonResponse(String response, String fieldName) {
 		try {
-			JSONObject jsonResp = (JSONObject) JSONValue.parse(response);
-			Object fieldValue = jsonResp.get(fieldName);
-			return fieldValue.toString();
+//			JSONObject jsonResp = (JSONObject) JSONValue.parse(response);
+			String[] split = fieldName.split(":");
+			String fieldValue = response;
 
+			for(int i=0; i<split.length; i++) {
+				fieldValue = parser(fieldValue, split[i]);
+			}
+			return fieldValue;
 		} catch (Exception e) {
 			return null;
 		}
 
 	}
 
+	private static String parser(String response, String field){
+		JSONObject fieldValue = (JSONObject) JSONValue.parse(response);
+		return fieldValue.get(field).toString();
+	}
+
 	public static String getUniqueIdFromResponse(RestResponse response) {
 		return getValueFromJsonResponse(response.getResponse(), UNIQUE_ID);
 	}
@@ -152,7 +161,7 @@
 		JsonObject jObject = jElement.getAsJsonObject();
 		JsonArray arrayOfObjects = (JsonArray) jObject.get(resourceType);
 		Gson gson = new Gson();
-		Map<String, Object> map = new HashMap<String, Object>();
+		Map<String, Object> map = new HashMap<>();
 		ResourceRespJavaObject jsonToJavaObject = new ResourceRespJavaObject();
 
 		for (int counter = 0; counter < arrayOfObjects.size(); counter++) {
@@ -169,19 +178,19 @@
 
 	}
 
+	private static ObjectMapper newObjectMapper() {
+		SimpleModule module = new SimpleModule("customDeserializationModule");
+		module.addDeserializer(PropertyConstraint.class, new PropertyConstraintJacksonDeserializer());
+		return new ObjectMapper()
+			.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
+			.registerModule(module);
+	}
+
 	public static Resource convertResourceResponseToJavaObject(String response) {
-
-		ObjectMapper mapper = new ObjectMapper();
-		final SimpleModule module = new SimpleModule("customerSerializationModule",
-				new Version(1, 0, 0, "static version"));
-		JsonDeserializer<PropertyConstraint> deserializer = new PropertyConstraintJacksonDeserialiser();
-		addDeserializer(module, PropertyConstraint.class, deserializer);
-
-		mapper.registerModule(module);
+		ObjectMapper mapper = newObjectMapper();
 		Resource resource = null;
 		try {
-//			TODO Andrey L. uncomment line below in case to ignore on unknown properties, not recommended  
-			mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 			resource = mapper.readValue(response, Resource.class);
 			
 			logger.debug(resource.toString());
@@ -199,15 +208,9 @@
 
 	public static ComponentInstanceProperty convertPropertyResponseToJavaObject(String response) {
 
-		ObjectMapper mapper = new ObjectMapper();
-		final SimpleModule module = new SimpleModule("customerSerializationModule",	new Version(1, 0, 0, "static version"));
-		JsonDeserializer<PropertyConstraint> desrializer = new PropertyConstraintJacksonDeserialiser();
-		addDeserializer(module, PropertyConstraint.class, desrializer);
-
-		mapper.registerModule(module);
+		ObjectMapper mapper = newObjectMapper();
 		ComponentInstanceProperty propertyDefinition = null;
 		try {
-			mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 			propertyDefinition = mapper.readValue(response, ComponentInstanceProperty.class);
 			logger.debug(propertyDefinition.toString());
 		} catch (IOException e) {
@@ -216,6 +219,19 @@
 		return propertyDefinition;
 	}
 
+	public static GroupDefinition convertPropertyResponseToObject(String response) {
+
+		ObjectMapper mapper = newObjectMapper();
+		GroupDefinition groupDefinition = null;
+		try {
+			groupDefinition = mapper.readValue(response, GroupDefinition.class);
+			logger.debug(groupDefinition.toString());
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return groupDefinition;
+	}
+
 	public static String toJson(Object object) {
 		Gson gson = new Gson();
 		return gson.toJson(object);
@@ -225,7 +241,7 @@
 		ObjectMapper mapper = new ObjectMapper();
 		ArtifactDefinition artifactDefinition = null;
 		try {
-			mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 			artifactDefinition = mapper.readValue(response, ArtifactDefinition.class);
 			logger.debug(artifactDefinition.toString());
 		} catch (IOException e) {
@@ -257,18 +273,10 @@
 
 	public static <T> T parseToObjectUsingMapper(String json, Class<T> clazz) {
 		// Generic convert
-		ObjectMapper mapper = new ObjectMapper();
+		ObjectMapper mapper = newObjectMapper();
 		T object = null;
-		final SimpleModule module = new SimpleModule("customerSerializationModule",
-				new Version(1, 0, 0, "static version"));
-		JsonDeserializer<PropertyConstraint> desrializer = new PropertyConstraintJacksonDeserialiser();
-		addDeserializer(module, PropertyConstraint.class, desrializer);
-		mapper.registerModule(module);
-		mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 		try {
 			object = mapper.readValue(json, clazz);
-			// System.out.println("Class: "+clazz.getSimpleName()+", json:
-			// "+json);
 		} catch (IOException e) {
 			e.printStackTrace();
 		}
@@ -286,25 +294,11 @@
 		return artifactReqDetails;
 	}
 
-	public static <T> void addDeserializer(SimpleModule module, Class<T> clazz,
-			final JsonDeserializer<T> deserializer) {
-		module.addDeserializer(clazz, deserializer);
-	}
-
 	public static Service convertServiceResponseToJavaObject(String response) {
 
-		ObjectMapper mapper = new ObjectMapper();
-		final SimpleModule module = new SimpleModule("customerSerializationModule",
-				new Version(1, 0, 0, "static version"));
-		JsonDeserializer<PropertyConstraint> deserializer = new PropertyConstraintJacksonDeserialiser();
-		addDeserializer(module, PropertyConstraint.class, deserializer);
-
-		mapper.registerModule(module);
+		ObjectMapper mapper = newObjectMapper();
 		Service service = null;
 		try {
-//			TODO Andrey L. uncomment line below in case to ignore on unknown properties, not recommended, added by Matvey 
-			mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-			
 			service = mapper.readValue(response, Service.class);
 			logger.debug(service.toString());
 		} catch (IOException e) {
@@ -316,18 +310,9 @@
 
 	public static Product convertProductResponseToJavaObject(String response) {
 
-		ObjectMapper mapper = new ObjectMapper();
-		
-		final SimpleModule module = new SimpleModule("customerSerializationModule",
-				new Version(1, 0, 0, "static version"));
-		JsonDeserializer<PropertyConstraint> desrializer = new PropertyConstraintJacksonDeserialiser();
-		addDeserializer(module, PropertyConstraint.class, desrializer);
-
-		mapper.registerModule(module);
-		
+		ObjectMapper mapper = newObjectMapper();
 		Product product = null;
 		try {
-			mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 			product = mapper.readValue(response, Product.class);
 			logger.debug(product.toString());
 		} catch (IOException e) {
@@ -339,16 +324,9 @@
 
 	public static ComponentInstance convertComponentInstanceResponseToJavaObject(String response) {
 
-		ObjectMapper mapper = new ObjectMapper();
-		final SimpleModule module = new SimpleModule("customerSerializationModule",
-				new Version(1, 0, 0, "static version"));
-		JsonDeserializer<PropertyConstraint> desrializer = new PropertyConstraintJacksonDeserialiser();
-		addDeserializer(module, PropertyConstraint.class, desrializer);
-
-		mapper.registerModule(module);
+		ObjectMapper mapper = newObjectMapper();
 		ComponentInstance componentInstance = null;
 		try {
-			mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 			componentInstance = mapper.readValue(response, ComponentInstance.class);
 			logger.debug(componentInstance.toString());
 		} catch (IOException e) {
@@ -360,7 +338,7 @@
 	}
 
 	public static List<String> getValuesFromJsonArray(RestResponse message) throws Exception {
-		List<String> artifactTypesArrayFromApi = new ArrayList<String>();
+		List<String> artifactTypesArrayFromApi = new ArrayList<>();
 
 		org.json.JSONObject responseObject = new org.json.JSONObject(message.getResponse());
 		JSONArray jArr = responseObject.getJSONArray("artifactTypes");
@@ -392,7 +370,7 @@
 	}
 
 	public static List<Map<String, Object>> getAuditFromMessage(Map<String, Object> auditingMessage) {
-		List<Map<String, Object>> auditList = new ArrayList<Map<String, Object>>();
+		List<Map<String, Object>> auditList = new ArrayList<>();
 		auditList.add(auditingMessage);
 		return auditList;
 	}
@@ -425,8 +403,8 @@
 	}
 
 	public static List<String> getDerivedListFromJson(RestResponse res) throws JSONException {
-		JSONArray listFromJson = getListFromJson(res, "derivedList");
-		List<String> lst = new ArrayList<String>();
+		JSONArray listFromJson = getListFromJson(res, "derivedFrom");
+		List<String> lst = new ArrayList<>();
 		for (int i = 0; i < listFromJson.length(); i++) {
 			lst.add(listFromJson.getString(i));
 		}
@@ -440,7 +418,7 @@
 	}
 
 	public static List<Map<String, Object>> getListOfMapsFromJson(RestResponse res, String field) throws Exception {
-		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+		List<Map<String, Object>> list = new ArrayList<>();
 		JSONArray listFromJson = getListFromJson(res, field);
 		for (int i = 0; i < listFromJson.length(); i++) {
 			Map<String, Object> convertStringToMap = convertStringToMap(listFromJson.getString(i));
@@ -472,7 +450,7 @@
 
 		// Map<String, ArrayList<Component>> map = new HashMap<String,
 		// ArrayList<Component>>();
-		Map<String, List<Component>> map = new HashMap<String, List<Component>>();
+		Map<String, List<Component>> map = new HashMap<>();
 
 		JsonElement jElement = new JsonParser().parse(response);
 		JsonObject jObject = jElement.getAsJsonObject();
@@ -531,7 +509,7 @@
 	
 	public static Map<Long, ServiceDistributionStatus> convertServiceDistributionStatusToObject(String response) throws ParseException {
 
-		Map<Long, ServiceDistributionStatus> serviceDistributionStatusMap = new HashMap<Long, ServiceDistributionStatus>();
+		Map<Long, ServiceDistributionStatus> serviceDistributionStatusMap = new HashMap<>();
 		ServiceDistributionStatus serviceDistributionStatusObject = null;
 		
 		JsonElement jElement = new JsonParser().parse(response);
@@ -551,7 +529,7 @@
 	
 	public static Map<String, String> getPropertiesNameType(RestResponse restResponse)
 			throws JSONException {
-		Map<String, String> propertiesMap = new HashMap<String, String>();
+		Map<String, String> propertiesMap = new HashMap<>();
 		JSONArray propertiesList = getListFromJson(restResponse, "properties");
 		for (int i = 0; i < propertiesList.length() ; i ++){
 			JSONObject  prop = (JSONObject) JSONValue.parse(propertiesList.get(i).toString());
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ServiceRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ServiceRestUtils.java
index 9ba4a90..1d8aef6 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ServiceRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/ServiceRestUtils.java
@@ -45,9 +45,6 @@
 
 public class ServiceRestUtils extends BaseRestUtils {
 	private static Logger logger = LoggerFactory.getLogger(ServiceRestUtils.class.getName());
-	private final static String cacheControl = "no-cache";
-	private final static String contentTypeHeaderData = "application/json";
-	private final static String acceptHeaderDate = "application/json";
 	// ****** CREATE *******
 
 	private static Gson gson = new Gson();
@@ -68,8 +65,7 @@
 	public static RestResponse markServiceToDelete(String resourceId, String userId) throws IOException {
 
 		Config config = Utils.getConfig();
-		String url = String.format(Urls.DELETE_SERVICE, config.getCatalogBeHost(), config.getCatalogBePort(),
-				resourceId);
+		String url = String.format(Urls.DELETE_SERVICE, config.getCatalogBeHost(), config.getCatalogBePort(), resourceId);
 		RestResponse sendDelete = sendDelete(url, userId);
 
 		return sendDelete;
@@ -79,8 +75,7 @@
 	public static RestResponse deleteServiceById(String serviceId, String userId) throws IOException {
 
 		Config config = Utils.getConfig();
-		String url = String.format(Urls.DELETE_SERVICE, config.getCatalogBeHost(), config.getCatalogBePort(),
-				serviceId);
+		String url = String.format(Urls.DELETE_SERVICE, config.getCatalogBeHost(), config.getCatalogBePort(), serviceId);
 		RestResponse sendDelete = sendDelete(url, userId);
 		deleteMarkedServices(userId);
 		return sendDelete;
@@ -177,12 +172,12 @@
 	}
 
 	public static Map<String, String> prepareHeadersMap(User sdncModifierDetails, boolean isCached) {
-		Map<String, String> headersMap = new HashMap<String, String>();
+		Map<String, String> headersMap = new HashMap<>();
 		if (isCached)
-			headersMap.put(HttpHeaderEnum.CACHE_CONTROL.getValue(), cacheControl);
+			headersMap.put(HttpHeaderEnum.CACHE_CONTROL.getValue(), BaseRestUtils.cacheControlHeader);
 
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), sdncModifierDetails.getUserId());
 		return headersMap;
 	}
@@ -202,7 +197,7 @@
 		String url = String.format(Urls.REJECT_DISTRIBUTION, config.getCatalogBeHost(), config.getCatalogBePort(),
 				serviceId);
 		String userBodyJson = gson.toJson(comment);
-		return sendPost(url, userBodyJson, userId, acceptHeaderData);
+		return sendPost(url, userBodyJson, userId, BaseRestUtils.acceptHeaderData);
 
 	}
 
@@ -268,9 +263,9 @@
 
 		String url = String.format(Urls.GET_FOLLWED_LIST, config.getCatalogBeHost(), config.getCatalogBePort());
 
-		Map<String, String> headersMap = new HashMap<String, String>();
-		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), "application/json");
-		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), "application/json");
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), BaseRestUtils.contentTypeHeaderData);
+		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), BaseRestUtils.acceptHeaderData);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), user.getUserId());
 
 		RestResponse getResourceNotAbstarctResponse = httpRequest.httpSendGet(url, headersMap);
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/UserRestUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/UserRestUtils.java
index 881e946..5031391 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/UserRestUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/rest/UserRestUtils.java
@@ -171,7 +171,7 @@
 
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
+		Map<String, String> headersMap = new HashMap<>();
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), sdncModifierDetails.getUserId());
@@ -189,7 +189,7 @@
 
 		Config config = Utils.getConfig();
 
-		Map<String, String> headersMap = new HashMap<String, String>();
+		Map<String, String> headersMap = new HashMap<>();
 		headersMap.put(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
 		headersMap.put(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
 		headersMap.put(HttpHeaderEnum.USER_ID.getValue(), sdncModifierDetails.getUserId());
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/validation/ArtifactValidationUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/validation/ArtifactValidationUtils.java
index a073006..61d3400 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/validation/ArtifactValidationUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/validation/ArtifactValidationUtils.java
@@ -20,17 +20,9 @@
 
 package org.openecomp.sdc.ci.tests.utils.validation;
 
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
 import org.openecomp.sdc.be.model.ArtifactDefinition;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstance;
@@ -44,8 +36,14 @@
 import org.openecomp.sdc.ci.tests.utils.general.FileUtils;
 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
 
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.AssertJUnit.assertTrue;
 
 public class ArtifactValidationUtils {
 
@@ -109,16 +107,14 @@
 				counter);
 	}
 
-	public static ESArtifactData parseArtifactRespFromES(RestResponse resResponse)
-			throws JsonParseException, JsonProcessingException, Exception {
+	public static ESArtifactData parseArtifactRespFromES(RestResponse resResponse) throws Exception {
 		String bodyToParse = resResponse.getResponse();
 		JsonElement jElement = new JsonParser().parse(bodyToParse);
 		JsonElement jsourceElement = jElement.getAsJsonObject().get("_source");
 
 		ObjectMapper mapper = new ObjectMapper();
-		ESArtifactData esArtifactObject = mapper.readValue(jsourceElement.toString(), ESArtifactData.class);
 
-		return esArtifactObject;
+		return mapper.readValue(jsourceElement.toString(), ESArtifactData.class);
 
 	}
 
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/validation/AuditValidationUtils.java b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/validation/AuditValidationUtils.java
index 4cf712f..5f5afb2 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/validation/AuditValidationUtils.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/ci/tests/utils/validation/AuditValidationUtils.java
@@ -48,7 +48,6 @@
 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
 import org.openecomp.sdc.ci.tests.api.Urls;
 import org.openecomp.sdc.ci.tests.config.Config;
-import org.openecomp.sdc.ci.tests.datatypes.ArtifactReqDetails;
 import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
 import org.openecomp.sdc.ci.tests.datatypes.enums.AuditEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.AuditJsonKeysEnum;
@@ -66,7 +65,6 @@
 import org.openecomp.sdc.ci.tests.datatypes.http.HttpRequest;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.run.StartTest;
-import org.openecomp.sdc.ci.tests.utils.ArtifactUtils;
 import org.openecomp.sdc.ci.tests.utils.Utils;
 import org.openecomp.sdc.ci.tests.utils.cassandra.CassandraUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
@@ -129,41 +127,18 @@
 
 	public static void validateAuditDownloadExternalAPI(ExpectedResourceAuditJavaObject resourceAuditJavaObject,
 			String action, String body, boolean checkAllFields) throws Exception {
-		Map<String, Object> actualAuditRecords = new HashMap<String, Object>();
-		// Andrey's comment
-		// actualAuditRecords = parseAuditResourceByAction(action, body);
-		actualAuditRecords = parseAuditResourceByAction(action, null);
-
-		// List<Map<String, Object>> actualAuditRecords = new
-		// ArrayList<Map<String, Object>>();
-		// actualAuditRecords = parseAuditResourceByActionToList(action, body);
+		Map<String, Object> actualAuditRecords = parseAuditResourceByAction(action, null);
 
 		validateField(actualAuditRecords, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(actualAuditRecords, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceName());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceType());
-
-		validateField(actualAuditRecords, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getStatus());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getDesc());
-
-		// validateField(actualAuditRecords,
-		// AuditJsonKeysEnum.CONSUMER_ID.getAuditJsonKeyName(),
-		// resourceAuditJavaObject.getCONSUMER_ID());
-		// validateField(actualAuditRecords,
-		// AuditJsonKeysEnum.RESOURCE_URL.getAuditJsonKeyName(),
-		// resourceAuditJavaObject.getRESOURCE_URL());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceName());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceType());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), resourceAuditJavaObject.getStatus());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), resourceAuditJavaObject.getDesc());
 
 	}
 
-	public static void validateAudit(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action,
-			String body, boolean checkAllFields) throws Exception {
-		Map<String, Object> actualAuditRecords = new HashMap<String, Object>();
-		// Andrey's comment
-		// actualAuditRecords = parseAuditResourceByAction(action, body);
-		actualAuditRecords = parseAuditResourceByAction(action, null);
+	public static void validateAudit(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action, String body, boolean checkAllFields) throws Exception {
+		Map<String, Object> actualAuditRecords = parseAuditResourceByAction(action, null);
 
 		if ((resourceAuditJavaObject.getModifierName() != null) && (resourceAuditJavaObject.getModifierUid() != null)) {
 			resourceAuditJavaObject.setModifierUid(getModifierString(resourceAuditJavaObject.getModifierName(),
@@ -171,77 +146,45 @@
 		}
 
 		validateField(actualAuditRecords, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(actualAuditRecords, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceName());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceType());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.PREV_VERSION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getPrevVersion());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getCurrVersion());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceName());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceType());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.PREV_VERSION.getAuditJsonKeyName(),	resourceAuditJavaObject.getPrevVersion());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(),	resourceAuditJavaObject.getCurrVersion());
 
-		validateField(actualAuditRecords, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getModifierUid());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.PREV_STATE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getPrevState());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.CURR_STATE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getCurrState());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getStatus());
-		// validateField(map2, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(),
-		// Double.parseDouble(resourceAuditJavaObject.getStatus()));
-		validateField(actualAuditRecords, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getDesc());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.COMMENT.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getComment());
-		// validateField(map2,
-		// AuditJsonKeysEnum.ARTIFACT_DATA.getAuditJsonKeyName(),
-		// resourceAuditJavaObject.getArtifactData());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.TOSCA_NODE_TYPE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getToscaNodeType());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.CURR_ARTIFACT_UUID.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getCurrArtifactUuid());
-		validateField(actualAuditRecords, AuditJsonKeysEnum.PREV_ARTIFACT_UUID.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getPrevArtifactUuid());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), resourceAuditJavaObject.getModifierUid());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.PREV_STATE.getAuditJsonKeyName(), resourceAuditJavaObject.getPrevState());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.CURR_STATE.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrState());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), resourceAuditJavaObject.getStatus());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), resourceAuditJavaObject.getDesc());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.COMMENT.getAuditJsonKeyName(), resourceAuditJavaObject.getComment());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.TOSCA_NODE_TYPE.getAuditJsonKeyName(), resourceAuditJavaObject.getToscaNodeType());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.CURR_ARTIFACT_UUID.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrArtifactUuid());
+		validateField(actualAuditRecords, AuditJsonKeysEnum.PREV_ARTIFACT_UUID.getAuditJsonKeyName(), resourceAuditJavaObject.getPrevArtifactUuid());
 
-		validateAtifactDataField(actualAuditRecords, AuditJsonKeysEnum.ARTIFACT_DATA.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getArtifactData(), checkAllFields);
+		validateAtifactDataField(actualAuditRecords, AuditJsonKeysEnum.ARTIFACT_DATA.getAuditJsonKeyName(), resourceAuditJavaObject.getArtifactData(), checkAllFields);
 	}
 
-	public static void validateExternalAudit(ExpectedExternalAudit externalAuditObject, String action,
-			Map<AuditingFieldsKeysEnum, String> body) throws Exception {
+	public static void validateExternalAudit(ExpectedExternalAudit externalAuditObject, String action, Map<AuditingFieldsKeysEnum, String> body) throws Exception {
 
-		Map<String, Object> actualAuditRecord = new HashMap<String, Object>();
-		actualAuditRecord = parseAuditResourceByAction(action, body);
+		Map<String, Object> actualAuditRecord = parseAuditResourceByAction(action, body);
 
 		validateField(actualAuditRecord, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(actualAuditRecord, AuditJsonKeysEnum.CONSUMER_ID.getAuditJsonKeyName(),
-				externalAuditObject.getCONSUMER_ID());
+		validateField(actualAuditRecord, AuditJsonKeysEnum.CONSUMER_ID.getAuditJsonKeyName(), externalAuditObject.getCONSUMER_ID());
 		// TODO
-		validateField(actualAuditRecord, AuditJsonKeysEnum.RESOURCE_URL.getAuditJsonKeyName(),
-				externalAuditObject.getRESOURCE_URL());
+		validateField(actualAuditRecord, AuditJsonKeysEnum.RESOURCE_URL.getAuditJsonKeyName(), externalAuditObject.getRESOURCE_URL());
 		//TODO
-		validateField(actualAuditRecord, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(),
-				externalAuditObject.getRESOURCE_NAME());
-		validateField(actualAuditRecord, AuditJsonKeysEnum.SERVICE_INSTANCE_ID.getAuditJsonKeyName(),
-				externalAuditObject.getSERVICE_INSTANCE_ID());
+		validateField(actualAuditRecord, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(), externalAuditObject.getRESOURCE_NAME());
+		validateField(actualAuditRecord, AuditJsonKeysEnum.SERVICE_INSTANCE_ID.getAuditJsonKeyName(), externalAuditObject.getSERVICE_INSTANCE_ID());
 		//TODO
-		validateField(actualAuditRecord, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				externalAuditObject.getRESOURCE_TYPE());
-		validateField(actualAuditRecord, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(),
-				externalAuditObject.getSTATUS());
-		validateField(actualAuditRecord, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(),
-				externalAuditObject.getDESC());
+		validateField(actualAuditRecord, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), externalAuditObject.getRESOURCE_TYPE());
+		validateField(actualAuditRecord, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), externalAuditObject.getSTATUS());
+		validateField(actualAuditRecord, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), externalAuditObject.getDESC());
 		//TODO
-//		validateField(actualAuditRecord, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(),
-//				externalAuditObject.getMODIFIER());
-		validateField(actualAuditRecord, AuditJsonKeysEnum.PREV_ARTIFACT_UUID.getAuditJsonKeyName(),
-				externalAuditObject.getPREV_ARTIFACT_UUID());
-		validateField(actualAuditRecord, AuditJsonKeysEnum.CURR_ARTIFACT_UUID.getAuditJsonKeyName(),
-				externalAuditObject.getCURR_ARTIFACT_UUID());
+//		validateField(actualAuditRecord, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), externalAuditObject.getMODIFIER());
+		validateField(actualAuditRecord, AuditJsonKeysEnum.PREV_ARTIFACT_UUID.getAuditJsonKeyName(), externalAuditObject.getPREV_ARTIFACT_UUID());
+		validateField(actualAuditRecord, AuditJsonKeysEnum.CURR_ARTIFACT_UUID.getAuditJsonKeyName(), externalAuditObject.getCURR_ARTIFACT_UUID());
 		//TODO
-		validateField(actualAuditRecord, AuditJsonKeysEnum.ARTIFACT_DATA.getAuditJsonKeyName(),
-				externalAuditObject.getARTIFACT_DATA());
+		validateField(actualAuditRecord, AuditJsonKeysEnum.ARTIFACT_DATA.getAuditJsonKeyName(), externalAuditObject.getARTIFACT_DATA());
 
 	}
 
@@ -288,26 +231,19 @@
 	}
 
 	// //Benny
-	public static void validateEcompConsumerAudit(ExpectedEcomConsumerAudit ecompConsumerAuditJavaObject, String action)
-			throws Exception {
+	public static void validateEcompConsumerAudit(ExpectedEcomConsumerAudit ecompConsumerAuditJavaObject, String action) throws Exception {
 
 		String fixedAction = BaseRestUtils.encodeUrlForDownload(action);
-		Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(fixedAction, null);
+		Map<String, Object> map2 = parseAuditResourceByAction(fixedAction, null);
 
-		validateField(map2, EcompConsumerAuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(),
-				ecompConsumerAuditJavaObject.getModifier());
-		validateField(map2, EcompConsumerAuditJsonKeysEnum.ECOMP_USER.getAuditJsonKeyName(),
-				ecompConsumerAuditJavaObject.getEcomUser());
-		validateField(map2, EcompConsumerAuditJsonKeysEnum.STATUS.getAuditJsonKeyName(),
-				ecompConsumerAuditJavaObject.getStatus());
-		validateField(map2, EcompConsumerAuditJsonKeysEnum.DESC.getAuditJsonKeyName(),
-				ecompConsumerAuditJavaObject.getDesc());
+		validateField(map2, EcompConsumerAuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), ecompConsumerAuditJavaObject.getModifier());
+		validateField(map2, EcompConsumerAuditJsonKeysEnum.ECOMP_USER.getAuditJsonKeyName(), ecompConsumerAuditJavaObject.getEcomUser());
+		validateField(map2, EcompConsumerAuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), ecompConsumerAuditJavaObject.getStatus());
+		validateField(map2, EcompConsumerAuditJsonKeysEnum.DESC.getAuditJsonKeyName(), ecompConsumerAuditJavaObject.getDesc());
 		validateField(map2, EcompConsumerAuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
 	}
 
-	public static void ecompConsumerAuditSuccess(String action, ConsumerDataDefinition consumerDataDefinition,
-			User user, int status) throws Exception {
+	public static void ecompConsumerAuditSuccess(String action, ConsumerDataDefinition consumerDataDefinition, User user, int status) throws Exception {
 		ExpectedEcomConsumerAudit expectedEcomConsumerAuditJavaObject = new ExpectedEcomConsumerAudit();
 		expectedEcomConsumerAuditJavaObject.setAction(action);
 		expectedEcomConsumerAuditJavaObject.setEcomUser(
@@ -384,34 +320,24 @@
 	public static void validateAuditGetListOfUsersByRoles(ExpectedGetUserListAudit GetListOfUsersAuditJavaObject,
 			String action) throws Exception {
 
-		Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(action, null);
+		Map<String, Object> map2 = parseAuditResourceByAction(action, null);
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
 		validateField(map2, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), GetListOfUsersAuditJavaObject.getStatus());
-		validateField(map2, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(),
-				GetListOfUsersAuditJavaObject.getModifier());
-		validateField(map2, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(),
-				GetListOfUsersAuditJavaObject.getDesc());
-		validateField(map2, AuditJsonKeysEnum.DETAILS.getAuditJsonKeyName(),
-				GetListOfUsersAuditJavaObject.getDetails());
+		validateField(map2, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), GetListOfUsersAuditJavaObject.getModifier());
+		validateField(map2, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), GetListOfUsersAuditJavaObject.getDesc());
+		validateField(map2, AuditJsonKeysEnum.DETAILS.getAuditJsonKeyName(), GetListOfUsersAuditJavaObject.getDetails());
 	}
 
-	public static void validateAuditImport(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action)
-			throws Exception {
+	public static void validateAuditImport(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action) throws Exception {
 
-		Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(action, null);
+		Map<String, Object> map2 = parseAuditResourceByAction(action, null);
 
-		resourceAuditJavaObject.setModifierUid(
-				getModifierString(resourceAuditJavaObject.getModifierName(), resourceAuditJavaObject.getModifierUid()));
+		resourceAuditJavaObject.setModifierUid(getModifierString(resourceAuditJavaObject.getModifierName(), resourceAuditJavaObject.getModifierUid()));
 
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceType());
-		validateField(map2, AuditJsonKeysEnum.PREV_VERSION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getPrevVersion());
-		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getCurrVersion());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceType());
+		validateField(map2, AuditJsonKeysEnum.PREV_VERSION.getAuditJsonKeyName(), resourceAuditJavaObject.getPrevVersion());
+		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrVersion());
 		validateField(map2, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), resourceAuditJavaObject.getModifierUid());
 		validateField(map2, AuditJsonKeysEnum.PREV_STATE.getAuditJsonKeyName(), resourceAuditJavaObject.getPrevState());
 		validateField(map2, AuditJsonKeysEnum.CURR_STATE.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrState());
@@ -420,28 +346,20 @@
 
 	}
 
-	public static void validateAuditDistribution(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action)
-			throws Exception {
+	public static void validateAuditDistribution(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action) throws Exception {
 
-		Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(action, null);
+		Map<String, Object> map2 = parseAuditResourceByAction(action, null);
 
-		resourceAuditJavaObject.setModifierUid(
-				getModifierString(resourceAuditJavaObject.getModifierName(), resourceAuditJavaObject.getModifierUid()));
+		resourceAuditJavaObject.setModifierUid(getModifierString(resourceAuditJavaObject.getModifierName(), resourceAuditJavaObject.getModifierUid()));
 
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceName());
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceType());
-		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getCurrVersion());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceName());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceType());
+		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrVersion());
 		validateField(map2, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), resourceAuditJavaObject.getModifierUid());
 		validateField(map2, AuditJsonKeysEnum.CURR_STATE.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrState());
-		validateField(map2, AuditJsonKeysEnum.DPREV_STATUS.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getDprevStatus());
-		validateField(map2, AuditJsonKeysEnum.DCURR_STATUS.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getDcurrStatus());
+		validateField(map2, AuditJsonKeysEnum.DPREV_STATUS.getAuditJsonKeyName(), resourceAuditJavaObject.getDprevStatus());
+		validateField(map2, AuditJsonKeysEnum.DCURR_STATUS.getAuditJsonKeyName(), resourceAuditJavaObject.getDcurrStatus());
 		validateField(map2, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), resourceAuditJavaObject.getStatus());
 		validateField(map2, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), resourceAuditJavaObject.getDesc());
 		validateField(map2, AuditJsonKeysEnum.COMMENT.getAuditJsonKeyName(), resourceAuditJavaObject.getComment());
@@ -450,46 +368,34 @@
 	}
 
 	// Benny
-	public static void validateAudit_Distribution(ExpectedResourceAuditJavaObject resourceAuditJavaObject,
-			String action) throws Exception {
+	public static void validateAudit_Distribution(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action) throws Exception {
 
 		List<Map<String, Object>> actionToList = getAuditListByAction(resourceAuditJavaObject.getAction(), 1);
 		Map<String, Object> map2 = actionToList.get(0);
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceName());
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceType());
-		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getCurrVersion());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceName());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceType());
+		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrVersion());
 		validateField(map2, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), resourceAuditJavaObject.getMODIFIER());
 		validateField(map2, AuditJsonKeysEnum.CURR_STATE.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrState());
-		validateField(map2, AuditJsonKeysEnum.DPREV_STATUS.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getDprevStatus());
-		validateField(map2, AuditJsonKeysEnum.DCURR_STATUS.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getDcurrStatus());
+		validateField(map2, AuditJsonKeysEnum.DPREV_STATUS.getAuditJsonKeyName(), resourceAuditJavaObject.getDprevStatus());
+		validateField(map2, AuditJsonKeysEnum.DCURR_STATUS.getAuditJsonKeyName(), resourceAuditJavaObject.getDcurrStatus());
 		validateField(map2, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), resourceAuditJavaObject.getStatus());
 		validateField(map2, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), resourceAuditJavaObject.getDesc());
 		validateField(map2, AuditJsonKeysEnum.COMMENT.getAuditJsonKeyName(), resourceAuditJavaObject.getComment());
 
 	}
 
-	public void validateAuditNotification(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action)
-			throws Exception {
+	public void validateAuditNotification(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action) throws Exception {
 
-		Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(action, null);
+		Map<String, Object> map2 = parseAuditResourceByAction(action, null);
 
-		resourceAuditJavaObject.setModifierUid(
-				getModifierString(resourceAuditJavaObject.getModifierName(), resourceAuditJavaObject.getModifierUid()));
+		resourceAuditJavaObject.setModifierUid(getModifierString(resourceAuditJavaObject.getModifierName(), resourceAuditJavaObject.getModifierUid()));
 
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceName());
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceType());
-		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getCurrVersion());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceName());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceType());
+		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrVersion());
 		validateField(map2, AuditJsonKeysEnum.CURR_STATE.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrState());
 		validateField(map2, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), resourceAuditJavaObject.getStatus());
 		validateField(map2, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), resourceAuditJavaObject.getDesc());
@@ -498,39 +404,31 @@
 
 	}
 
-	public static void validateAudit(ExpectedDistDownloadAudit expectedDistDownloadAudit, String action)
-			throws Exception {
+	public static void validateAudit(ExpectedDistDownloadAudit expectedDistDownloadAudit, String action) throws Exception {
 
-		Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(action, null);
+		Map<String, Object> map2 = parseAuditResourceByAction(action, null);
 
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
 		validateField(map2, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), expectedDistDownloadAudit.getStatus());
 		validateField(map2, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), expectedDistDownloadAudit.getDesc());
-		validateField(map2, AuditJsonKeysEnum.CONSUMER_ID.getAuditJsonKeyName(),
-				expectedDistDownloadAudit.getConsumerId());
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_URL.getAuditJsonKeyName(),
-				expectedDistDownloadAudit.getResourceUrl());
+		validateField(map2, AuditJsonKeysEnum.CONSUMER_ID.getAuditJsonKeyName(), expectedDistDownloadAudit.getConsumerId());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_URL.getAuditJsonKeyName(), expectedDistDownloadAudit.getResourceUrl());
 	}
 	
 	public static void validateAuditExternalSearchAPI(ExpectedExternalAudit expectedDistDownloadAudit, String action, Map<AuditingFieldsKeysEnum, String> body)
 			throws Exception {
 
-		Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(action, body);
+		Map<String, Object> map2 = parseAuditResourceByAction(action, body);
 
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
 		validateField(map2, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), expectedDistDownloadAudit.getSTATUS());
 		validateField(map2, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), expectedDistDownloadAudit.getDESC());
-		validateField(map2, AuditJsonKeysEnum.CONSUMER_ID.getAuditJsonKeyName(),
-				expectedDistDownloadAudit.getCONSUMER_ID());
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_URL.getAuditJsonKeyName(),
-				expectedDistDownloadAudit.getRESOURCE_URL());
+		validateField(map2, AuditJsonKeysEnum.CONSUMER_ID.getAuditJsonKeyName(), expectedDistDownloadAudit.getCONSUMER_ID());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_URL.getAuditJsonKeyName(), expectedDistDownloadAudit.getRESOURCE_URL());
 	}
 	
 	public static void validateAuditExternalCreateResource(ExpectedResourceAuditJavaObject expectedExternalAudit, String action, Map<AuditingFieldsKeysEnum, String> body) throws Exception {
-	Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(action, body);
+	Map<String, Object>	map2 = parseAuditResourceByAction(action, body);
 
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
 		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(), expectedExternalAudit.getResourceName());
@@ -549,8 +447,7 @@
 	}
 	
 	public static void validateAuditExternalChangeAssetLifeCycle(ExpectedResourceAuditJavaObject expectedExternalAudit, String action, Map<AuditingFieldsKeysEnum, String> body) throws Exception {
-		Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(action, body);
+		Map<String, Object> map2 = parseAuditResourceByAction(action, body);
 
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
 		validateField(map2, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), expectedExternalAudit.getDesc());
@@ -566,28 +463,20 @@
 		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(), expectedExternalAudit.getCurrVersion());
 		validateField(map2, AuditJsonKeysEnum.PREV_STATE.getAuditJsonKeyName(), expectedExternalAudit.getPrevState());
 		validateField(map2, AuditJsonKeysEnum.CURR_STATE.getAuditJsonKeyName(), expectedExternalAudit.getCurrState());
-		
-		
-		// TODO: Remove comment
-//		validateField(map2, AuditJsonKeysEnum.INVARIANT_UUID.getAuditJsonKeyName(), expectedExternalAudit.getINVARIANT_UUID());
+
 	}
 
 	public void validateAuditDeploy(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action)
 			throws Exception {
 
-		Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(action, null);
+		Map<String, Object> map2 = parseAuditResourceByAction(action, null);
 
-		resourceAuditJavaObject.setModifierUid(
-				getModifierString(resourceAuditJavaObject.getModifierName(), resourceAuditJavaObject.getModifierUid()));
+		resourceAuditJavaObject.setModifierUid(getModifierString(resourceAuditJavaObject.getModifierName(), resourceAuditJavaObject.getModifierUid()));
 
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceName());
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceType());
-		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getCurrVersion());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceName());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceType());
+		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrVersion());
 		validateField(map2, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), resourceAuditJavaObject.getModifierUid());
 		validateField(map2, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), resourceAuditJavaObject.getStatus());
 		validateField(map2, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), resourceAuditJavaObject.getDesc());
@@ -598,25 +487,19 @@
 	public static void validateAuditProduct(ExpectedProductAudit productExpectedAudit, String action,
 			AuditJsonKeysEnum... additionalFields) throws Exception {
 
-		Map<String, Object> map2 = new HashMap<String, Object>();
-		map2 = parseAuditResourceByAction(action, null);
+		Map<String, Object> map2 = parseAuditResourceByAction(action, null);
 
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(),
-				productExpectedAudit.getRESOURCE_NAME());
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				productExpectedAudit.getRESOURCE_TYPE());
-		validateField(map2, AuditJsonKeysEnum.PREV_VERSION.getAuditJsonKeyName(),
-				productExpectedAudit.getPREV_VERSION());
-		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(),
-				productExpectedAudit.getCURR_VERSION());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(), productExpectedAudit.getRESOURCE_NAME());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), productExpectedAudit.getRESOURCE_TYPE());
+		validateField(map2, AuditJsonKeysEnum.PREV_VERSION.getAuditJsonKeyName(), productExpectedAudit.getPREV_VERSION());
+		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(), productExpectedAudit.getCURR_VERSION());
 		validateField(map2, AuditJsonKeysEnum.PREV_STATE.getAuditJsonKeyName(), productExpectedAudit.getPREV_STATE());
 		validateField(map2, AuditJsonKeysEnum.CURR_STATE.getAuditJsonKeyName(), productExpectedAudit.getCURR_STATE());
 		validateField(map2, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), productExpectedAudit.getMODIFIER());
 		validateField(map2, AuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), productExpectedAudit.getSTATUS());
 		validateField(map2, AuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), productExpectedAudit.getDESC());
-		validateField(map2, AuditJsonKeysEnum.SERVICE_INSTANCE_ID.getAuditJsonKeyName(),
-				productExpectedAudit.getSERVICE_INSTANCE_ID());
+		validateField(map2, AuditJsonKeysEnum.SERVICE_INSTANCE_ID.getAuditJsonKeyName(), productExpectedAudit.getSERVICE_INSTANCE_ID());
 		if (additionalFields != null) {
 			List<AuditJsonKeysEnum> fieldsList = Arrays.asList(additionalFields);
 			if (fieldsList.contains(AuditJsonKeysEnum.COMMENT)) {
@@ -837,76 +720,6 @@
 		return resultsMap;
 	}
 
-	// public static Map retrieveAuditMessagesByPattern(String pattern) throws
-	// IOException {
-	//
-	//// Config config = Utils.getConfig();
-	//// HttpRequest getAuditingMessage = new HttpRequest();
-	//// String url = String.format(Urls.GET_SEARCH_DATA_FROM_ES,
-	// config.getEsHost(), config.getEsPort(), pattern);
-	//// RestResponse restResponse = getAuditingMessage.httpSendGet(url, null);
-	//
-	//// get cassandra table name by action
-	// String esType =
-	// AuditingActionEnum.getActionByName(pattern).getAuditingEsType();
-	//// AuditingActionEnum actionByName =
-	// AuditingActionEnum.getActionByName(pattern);
-	//
-	//// Map<AuditingFieldsKeysEnum, String> myFields= new
-	// HashMap<AuditingFieldsKeysEnum, String>();
-	//// myFields.put(AuditingFieldsKeysEnum.AUDIT_ACTION , pattern);
-	//
-	// List<Pair<AuditingFieldsKeysEnum, String>> myFields = new
-	// ArrayList<Pair<AuditingFieldsKeysEnum, String>>();
-	// Pair<AuditingFieldsKeysEnum, String> myPair = new
-	// Pair<AuditingFieldsKeysEnum, String>(AuditingFieldsKeysEnum.AUDIT_ACTION
-	// , pattern);
-	// myFields.add(0, myPair);
-	//
-	//
-	// List<Row> fetchFromTable = CassandraUtils.fetchFromTable("sdcaudit",
-	// esType, myFields);
-	// Row row = fetchFromTable.get(0);
-	//
-	//
-	// ColumnDefinitions columnDefinitions = row.getColumnDefinitions();
-	//// String string = row.getString(columnDefinitions.getName(1));
-	//
-	//// String metaData = row.getColumnDefinitions().toString();
-	//// metaData =metaData.replaceAll("\\((.*?)\\)|\\[|\\]|Columns", "");
-	//// List<String> metaDataList = new
-	// ArrayList<String>(Arrays.asList(metaData.split(", ")));
-	//
-	//
-	//
-	// Map<String, String> resultsMap = new HashMap<String, String>();
-	//
-	//
-	// for (int i=0 ; i < columnDefinitions.size() ; i++){
-	// resultsMap.put(columnDefinitions.getName(i) ,
-	// row.getObject(columnDefinitions.getName(i)) == null ? "null" :
-	// row.getObject(columnDefinitions.getName(i)).toString());
-	// }
-	//// for (String string : metaDataList) {
-	//// resultsMap.put(string , row.getString(string));
-	//// }
-	////
-	//
-	//// String dataString = fetchFromTable.toString();
-	//// dataString = dataString.replaceAll("\\[|\\]|Row", "");
-	//// List<String> dataArray = new
-	// ArrayList<String>(Arrays.asList(dataString.split(", ")));
-	////
-	////
-	//// Map<String, String> resultsMap = new HashMap<String, String>();
-	//// for (int i=0 ; i<metaDataList.size() ; i++) {
-	//// resultsMap.put(metaDataList.get(i), dataArray.get(i));
-	//// }
-	////
-	//// return restResponse.getResponse();
-	// return resultsMap;
-	// }
-
 	public static void categoryAuditSuccess(String action, CategoryDefinition categoryDefinition, User user, int status,
 			String resourceType) throws Exception {
 		categoryAuditSuccessInternal(action, categoryDefinition, null, null, user, status, resourceType);
@@ -955,8 +768,7 @@
 		expectedCatrgoryAuditJavaObject.setAction(action);
 		expectedCatrgoryAuditJavaObject.setModifier(user.getFullName() + "(" + user.getUserId() + ")");
 		expectedCatrgoryAuditJavaObject.setCategoryName(categoryDataDefinition.getName());
-		String subCategoryName = (subCategoryDefinition != null ? subCategoryDefinition.getName()
-				: Constants.EMPTY_STRING);
+		String subCategoryName = (subCategoryDefinition != null ? subCategoryDefinition.getName() : Constants.EMPTY_STRING);
 		expectedCatrgoryAuditJavaObject.setSubCategoryName(subCategoryName);
 		String groupingName = (groupingDefinition != null ? groupingDefinition.getName() : Constants.EMPTY_STRING);
 		expectedCatrgoryAuditJavaObject.setGroupingName(groupingName);
@@ -989,8 +801,7 @@
 	///////////////////////////
 	///// BENNNNNNNNY
 	public enum UserAuditJsonKeysEnum {
-		ACTION("ACTION"), MODIFIER("MODIFIER"), STATUS("STATUS"), DESC("DESCRIPTION"), USER_AFTER(
-				"USER_AFTER"), USER_BEFORE("USER_BEFORE");
+		ACTION("ACTION"), MODIFIER("MODIFIER"), STATUS("STATUS"), DESC("DESCRIPTION"), USER_AFTER("USER_AFTER"), USER_BEFORE("USER_BEFORE");
 		private String auditJsonKeyName;
 
 		private UserAuditJsonKeysEnum(String auditJsonKeyName) {
@@ -1002,20 +813,15 @@
 		}
 	}
 
-	public static void validateAddUserAudit(ExpectedUserCRUDAudit expectedAddUserAuditJavaObject, String action)
-			throws Exception {
+	public static void validateAddUserAudit(ExpectedUserCRUDAudit expectedAddUserAuditJavaObject, String action) throws Exception {
 
 		List<Map<String, Object>> actionToList = getAuditListByAction(expectedAddUserAuditJavaObject.getAction(), 1);
 		Map<String, Object> map = actionToList.get(0);
 		validateField(map, UserAuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(map, UserAuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(),
-				expectedAddUserAuditJavaObject.getModifier());
-		validateField(map, UserAuditJsonKeysEnum.USER_AFTER.getAuditJsonKeyName(),
-				expectedAddUserAuditJavaObject.getUserAfter());
-		validateField(map, UserAuditJsonKeysEnum.USER_BEFORE.getAuditJsonKeyName(),
-				expectedAddUserAuditJavaObject.getUserBefore());
-		validateField(map, UserAuditJsonKeysEnum.STATUS.getAuditJsonKeyName(),
-				expectedAddUserAuditJavaObject.getStatus());
+		validateField(map, UserAuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), expectedAddUserAuditJavaObject.getModifier());
+		validateField(map, UserAuditJsonKeysEnum.USER_AFTER.getAuditJsonKeyName(), expectedAddUserAuditJavaObject.getUserAfter());
+		validateField(map, UserAuditJsonKeysEnum.USER_BEFORE.getAuditJsonKeyName(), expectedAddUserAuditJavaObject.getUserBefore());
+		validateField(map, UserAuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), expectedAddUserAuditJavaObject.getStatus());
 		validateField(map, UserAuditJsonKeysEnum.DESC.getAuditJsonKeyName(), expectedAddUserAuditJavaObject.getDesc());
 
 	}
@@ -1029,8 +835,7 @@
 		expectedCatrgoryAuditJavaObject.setAction(action);
 		expectedCatrgoryAuditJavaObject.setModifier(user.getFullName() + "(" + user.getUserId() + ")");
 		expectedCatrgoryAuditJavaObject.setCategoryName(categoryDataDefinition.getName());
-		String subCategoryName = (subCategoryDefinition != null ? subCategoryDefinition.getName()
-				: Constants.EMPTY_STRING);
+		String subCategoryName = (subCategoryDefinition != null ? subCategoryDefinition.getName() : Constants.EMPTY_STRING);
 		expectedCatrgoryAuditJavaObject.setSubCategoryName(subCategoryName);
 		String groupingName = (groupingDefinition != null ? groupingDefinition.getName() : Constants.EMPTY_STRING);
 		expectedCatrgoryAuditJavaObject.setGroupingName(groupingName);
@@ -1049,14 +854,10 @@
 		expectedCatrgoryAuditJavaObject.setModifier(getModifierString(expectedCatrgoryAuditJavaObject.getModifierName(),
 				expectedCatrgoryAuditJavaObject.getModifierUid()));
 		validateField(map, CategoryAuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(map, CategoryAuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getModifier());
-		validateField(map, CategoryAuditJsonKeysEnum.DETAILS.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getDetails());
-		validateField(map, CategoryAuditJsonKeysEnum.STATUS.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getStatus());
-		validateField(map, CategoryAuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getDesc());
+		validateField(map, CategoryAuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getModifier());
+		validateField(map, CategoryAuditJsonKeysEnum.DETAILS.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getDetails());
+		validateField(map, CategoryAuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getStatus());
+		validateField(map, CategoryAuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getDesc());
 
 	}
 
@@ -1066,20 +867,13 @@
 		List<Map<String, Object>> actionToList = getAuditListByAction(expectedCatrgoryAuditJavaObject.getAction(), 1);
 		Map<String, Object> map = actionToList.get(0);
 		validateField(map, CategoryAuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(map, CategoryAuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getModifier());
-		validateField(map, CategoryAuditJsonKeysEnum.CATEGORY_NAME.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getCategoryName());
-		validateField(map, CategoryAuditJsonKeysEnum.SUB_CATEGORY_NAME.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getSubCategoryName());
-		validateField(map, CategoryAuditJsonKeysEnum.GROUPING_NAME.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getGroupingName());
-		validateField(map, CategoryAuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getResourceType());
-		validateField(map, CategoryAuditJsonKeysEnum.STATUS.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getStatus());
-		validateField(map, CategoryAuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(),
-				expectedCatrgoryAuditJavaObject.getDesc());
+		validateField(map, CategoryAuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getModifier());
+		validateField(map, CategoryAuditJsonKeysEnum.CATEGORY_NAME.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getCategoryName());
+		validateField(map, CategoryAuditJsonKeysEnum.SUB_CATEGORY_NAME.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getSubCategoryName());
+		validateField(map, CategoryAuditJsonKeysEnum.GROUPING_NAME.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getGroupingName());
+		validateField(map, CategoryAuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getResourceType());
+		validateField(map, CategoryAuditJsonKeysEnum.STATUS.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getStatus());
+		validateField(map, CategoryAuditJsonKeysEnum.DESCRIPTION.getAuditJsonKeyName(), expectedCatrgoryAuditJavaObject.getDesc());
 	}
 
 	public static void GetCategoryHierarchyAuditSuccess(String action, String componentType, User user, int status)
@@ -1122,60 +916,6 @@
 		return sb.toString();
 	}
 
-	public static ExpectedResourceAuditJavaObject expectedMissingInformationAuditObject(String Action,
-			String resourceUid, ComponentType resourceType) throws FileNotFoundException {
-		ExpectedResourceAuditJavaObject expectedAudit = new ExpectedResourceAuditJavaObject();
-		expectedAudit.setAction(Action);
-		expectedAudit.setResourceName(resourceUid);
-		expectedAudit.setResourceType(resourceType.getValue());
-		expectedAudit.setPrevVersion("");
-		expectedAudit.setCurrVersion("");
-		expectedAudit.setModifierName("");
-		expectedAudit.setModifierUid("");
-		expectedAudit.setPrevState("");
-		expectedAudit.setCurrState("");
-		expectedAudit.setPrevArtifactUuid("");
-		expectedAudit.setCurrArtifactUuid("");
-		expectedAudit.setArtifactData("");
-		expectedAudit.setStatus("403");
-		expectedAudit.setDesc(buildAuditDescription(
-				new ErrorValidationUtils().parseErrorConfigYaml(ActionStatus.MISSING_INFORMATION.name()),
-				new ArrayList<String>()));
-		return expectedAudit;
-	}
-
-	public static ExpectedResourceAuditJavaObject expectedComponentNotFoundAuditObject(String Action,
-			String resourceUid, ComponentType resourceType, String artifactUid, User user,
-			ArrayList<String> notFoundComponent) throws FileNotFoundException {
-		String desc = null;
-
-		ExpectedResourceAuditJavaObject expectedAudit = new ExpectedResourceAuditJavaObject();
-		expectedAudit.setAction(Action);
-		expectedAudit.setResourceName(resourceUid);
-		expectedAudit.setResourceType(resourceType.getValue());
-		expectedAudit.setPrevVersion("");
-		expectedAudit.setCurrVersion("");
-		expectedAudit.setModifierName(user.getFirstName() + " " + user.getLastName());
-		expectedAudit.setModifierUid(user.getUserId());
-		expectedAudit.setPrevState("");
-		expectedAudit.setCurrState("");
-		expectedAudit.setPrevArtifactUuid("");
-		expectedAudit.setCurrArtifactUuid(artifactUid);
-		expectedAudit.setArtifactData("");
-		expectedAudit.setStatus("404");
-
-		if (resourceType.getValue() == ComponentType.SERVICE.getValue()) {
-			desc = buildAuditDescription(
-					new ErrorValidationUtils().parseErrorConfigYaml(ActionStatus.SERVICE_NOT_FOUND.name()),
-					notFoundComponent);
-		} else if (resourceType.getValue() == ComponentType.RESOURCE.getValue())
-			desc = buildAuditDescription(
-					new ErrorValidationUtils().parseErrorConfigYaml(ActionStatus.RESOURCE_NOT_FOUND.name()),
-					notFoundComponent);
-
-		expectedAudit.setDesc(desc);
-		return expectedAudit;
-	}
 
 	public static ExpectedResourceAuditJavaObject expectedArtifactNotFoundAuditObject(String Action, String resourceUid,
 			ComponentType resourceType, String artifactUid, User user, String currState, String currVersion)
@@ -1205,144 +945,27 @@
 		return expectedAudit;
 	}
 
-	public static ExpectedResourceAuditJavaObject expectedArtifactNotFoundAuditObject(String Action,
-			String resourceName, ComponentType resourceType, String artifactUid, LifecycleStateEnum lifecycle,
-			User user, String currVersion) throws FileNotFoundException {
-		String desc = null;
-
-		ExpectedResourceAuditJavaObject expectedAudit = new ExpectedResourceAuditJavaObject();
-		expectedAudit.setAction(Action);
-		expectedAudit.setResourceName(resourceName);
-		expectedAudit.setResourceType(resourceType.getValue());
-		expectedAudit.setPrevVersion("");
-		expectedAudit.setCurrVersion(currVersion);
-		expectedAudit.setModifierName(user.getFirstName() + " " + user.getLastName());
-		expectedAudit.setModifierUid(user.getUserId());
-		expectedAudit.setPrevState("");
-		expectedAudit.setCurrState(lifecycle.name());
-		expectedAudit.setPrevArtifactUuid("");
-		expectedAudit.setCurrArtifactUuid(artifactUid);
-		expectedAudit.setArtifactData("");
-		expectedAudit.setStatus("404");
-
-		desc = buildAuditDescription(
-				new ErrorValidationUtils().parseErrorConfigYaml(ActionStatus.ARTIFACT_NOT_FOUND.name()),
-				new ArrayList<String>());
-
-		expectedAudit.setDesc(desc);
-		return expectedAudit;
-	}
-
-	public static ExpectedResourceAuditJavaObject expectedRestrictedOperationAuditObject(String Action,
-			String resourceNameOrUid, ComponentType resourceType, String artifactUid, User user, String currVersion,
-			String currState) throws FileNotFoundException {
-		String desc = null;
-
-		ExpectedResourceAuditJavaObject expectedAudit = new ExpectedResourceAuditJavaObject();
-		expectedAudit.setAction(Action);
-		expectedAudit.setResourceName(resourceNameOrUid);
-		expectedAudit.setResourceType(resourceType.getValue());
-		expectedAudit.setPrevVersion("");
-		expectedAudit.setCurrVersion(currVersion);
-		expectedAudit.setModifierName(user.getFirstName() + " " + user.getLastName());
-		expectedAudit.setModifierUid(user.getUserId());
-		expectedAudit.setPrevState("");
-		expectedAudit.setCurrState(currState);
-		expectedAudit.setPrevArtifactUuid("");
-		expectedAudit.setCurrArtifactUuid(artifactUid);
-		expectedAudit.setArtifactData("");
-		expectedAudit.setStatus("409");
-
-		desc = buildAuditDescription(
-				new ErrorValidationUtils().parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name()),
-				new ArrayList<String>());
-
-		expectedAudit.setDesc(desc);
-		return expectedAudit;
-	}
-
-	public static ExpectedResourceAuditJavaObject expectedInvalidContentAuditObject(String Action, String resourceName,
-			ComponentType resourceType, String artifactUid, User user, String currVersion, String currState,
-			ArrayList<String> invalidContentList) throws FileNotFoundException {
-		return expectedInvalidContentAuditObject(ActionStatus.INVALID_CONTENT, Action, resourceName, resourceType,
-				artifactUid, user, currVersion, currState, invalidContentList);
-	}
-
-	public static ExpectedResourceAuditJavaObject expectedInvalidContentAuditObject(ActionStatus actionStatus,
-			String Action, String resourceName, ComponentType resourceType, String artifactUid, User user,
-			String currVersion, String currState, ArrayList<String> invalidContentList) throws FileNotFoundException {
-		String desc = null;
-
-		ExpectedResourceAuditJavaObject expectedAudit = new ExpectedResourceAuditJavaObject();
-		expectedAudit.setAction(Action);
-		expectedAudit.setResourceName(resourceName);
-		expectedAudit.setResourceType(resourceType.getValue());
-		expectedAudit.setPrevVersion("");
-		expectedAudit.setCurrVersion(currVersion);
-		expectedAudit.setModifierName(user.getFirstName() + " " + user.getLastName());
-		expectedAudit.setModifierUid(user.getUserId());
-		expectedAudit.setPrevState("");
-		expectedAudit.setCurrState(currState);
-		expectedAudit.setPrevArtifactUuid("");
-		expectedAudit.setCurrArtifactUuid(artifactUid);
-		expectedAudit.setArtifactData("");
-		expectedAudit.setStatus("400");
-
-		desc = buildAuditDescription(new ErrorValidationUtils().parseErrorConfigYaml(actionStatus.name()),
-				invalidContentList);
-
-		expectedAudit.setDesc(desc);
-		return expectedAudit;
-	}
-
-	public static ExpectedResourceAuditJavaObject expectedSuccessAuditObject(String Action, String resourceName,
-			ComponentType resourceType, ArtifactReqDetails artifactReq, User user, String currVersion, String currState,
-			String prevArtifactUuid) throws FileNotFoundException {
-		ExpectedResourceAuditJavaObject expectedAudit = new ExpectedResourceAuditJavaObject();
-		expectedAudit.setAction(Action);
-		expectedAudit.setResourceName(resourceName);
-		expectedAudit.setResourceType(resourceType.getValue());
-		expectedAudit.setPrevVersion("");
-		expectedAudit.setCurrVersion(currVersion);
-		expectedAudit.setModifierName(user.getFirstName() + " " + user.getLastName());
-		expectedAudit.setModifierUid(user.getUserId());
-		expectedAudit.setPrevState("");
-		expectedAudit.setCurrState(currState);
-		expectedAudit.setPrevArtifactUuid(prevArtifactUuid);
-		expectedAudit.setCurrArtifactUuid(artifactReq.getUniqueId());
-		expectedAudit
-				.setArtifactData(buildArtifactDataAudit(ArtifactUtils.convertArtifactReqToDefinition(artifactReq)));
-		expectedAudit.setStatus("200");
-		expectedAudit.setDesc("OK");
-		return expectedAudit;
-	}
-
 	public static JSONObject filterAuditByUuid(String action, String uuid) throws Exception {
-		Map<String, String> actionMap = new HashMap<String, String>();
+		Map<String, String> actionMap = new HashMap<>();
 		actionMap.put("ACTION", action);
 		JSONObject actionJsonObject = new JSONObject(actionMap);
-		Map<String, String> uuidMap = new HashMap<String, String>();
+		Map<String, String> uuidMap = new HashMap<>();
 		uuidMap.put("SERVICE_INSTANCE_ID", uuid);
 		JSONObject uuidJsonObject = new JSONObject(uuidMap);
 
-		List<JSONObject> filters = new ArrayList<JSONObject>(Arrays.asList(actionJsonObject, uuidJsonObject));
+		List<JSONObject> filters = new ArrayList<>(Arrays.asList(actionJsonObject, uuidJsonObject));
 		JSONObject body = buildElasticQueryBody(filters);
 		return body;
 	}
 
-	public static void validateAudit(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action)
-			throws Exception {
+	public static void validateAudit(ExpectedResourceAuditJavaObject resourceAuditJavaObject, String action) throws Exception {
 		List<Map<String, Object>> actionToList = getAuditListByAction(resourceAuditJavaObject.getAction(), 1);
 		Map<String, Object> map2 = actionToList.get(0);
 		validateField(map2, AuditJsonKeysEnum.ACTION.getAuditJsonKeyName(), action);
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceName());
-		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getResourceType());
-		validateField(map2, AuditJsonKeysEnum.PREV_VERSION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getPrevVersion());
-		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(),
-				resourceAuditJavaObject.getCurrVersion());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_NAME.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceName());
+		validateField(map2, AuditJsonKeysEnum.RESOURCE_TYPE.getAuditJsonKeyName(), resourceAuditJavaObject.getResourceType());
+		validateField(map2, AuditJsonKeysEnum.PREV_VERSION.getAuditJsonKeyName(), resourceAuditJavaObject.getPrevVersion());
+		validateField(map2, AuditJsonKeysEnum.CURR_VERSION.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrVersion());
 		validateField(map2, AuditJsonKeysEnum.MODIFIER.getAuditJsonKeyName(), resourceAuditJavaObject.getMODIFIER());
 		validateField(map2, AuditJsonKeysEnum.PREV_STATE.getAuditJsonKeyName(), resourceAuditJavaObject.getPrevState());
 		validateField(map2, AuditJsonKeysEnum.CURR_STATE.getAuditJsonKeyName(), resourceAuditJavaObject.getCurrState());
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/AssetLifeCycle.java b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/AssetLifeCycle.java
index 2d50ebf..91effad 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/AssetLifeCycle.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/AssetLifeCycle.java
@@ -20,12 +20,9 @@
 
 package org.openecomp.sdc.externalApis;
 
-import static java.util.Arrays.asList;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import com.aventstack.extentreports.Status;
+import com.google.gson.Gson;
+import fj.data.Either;
 import org.json.simple.parser.JSONParser;
 import org.junit.Rule;
 import org.junit.rules.TestName;
@@ -33,41 +30,16 @@
 import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
-import org.openecomp.sdc.be.model.ArtifactDefinition;
-import org.openecomp.sdc.be.model.Component;
-import org.openecomp.sdc.be.model.LifecycleStateEnum;
-import org.openecomp.sdc.be.model.Resource;
-import org.openecomp.sdc.be.model.Service;
-import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.model.*;
 import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
 import org.openecomp.sdc.ci.tests.config.Config;
-import org.openecomp.sdc.ci.tests.datatypes.ArtifactReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceAssetStructure;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceDetailedAssetStructure;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceExternalReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ErrorInfo;
-import org.openecomp.sdc.ci.tests.datatypes.enums.LifeCycleStatesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.NormativeTypesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ResourceCategoryEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.SearchCriteriaEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
-import org.openecomp.sdc.ci.tests.datatypes.expected.ExpectedResourceAuditJavaObject;
+import org.openecomp.sdc.ci.tests.datatypes.*;
+import org.openecomp.sdc.ci.tests.datatypes.enums.*;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.general.AtomicOperationUtils;
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
-import org.openecomp.sdc.ci.tests.utils.rest.ArtifactRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.AssetRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.LifecycleRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtilsExternalAPI;
-import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
-import org.openecomp.sdc.ci.tests.utils.validation.AuditValidationUtils;
+import org.openecomp.sdc.ci.tests.utils.rest.*;
 import org.openecomp.sdc.ci.tests.utils.validation.ErrorValidationUtils;
-import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
@@ -75,11 +47,6 @@
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
-import com.aventstack.extentreports.Status;
-import com.google.gson.Gson;
-
-import fj.data.Either;
-
 public class AssetLifeCycle extends ComponentBaseTest {
 
 	private static Logger log = LoggerFactory.getLogger(CRUDExternalAPI.class.getName());
@@ -153,12 +120,12 @@
 		Component resourceDetails = AtomicOperationUtils.getResourceObjectByNameAndVersion(UserRoleEnum.DESIGNER, defaultResource.getName(), defaultResource.getVersion());
 		Assert.assertEquals(resourceDetails.getLifecycleState().toString(), LifeCycleStatesEnum.CHECKIN.getComponentState().toString(), "Life cycle state not changed.");
 		
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, parsedCreatedResponse.getName());
 		ExpectedResourceAuditJavaObject expectedResourceAuditJavaObject = ElementFactory.getDefaultChangeAssetLifeCycleExternalAPI(resourceDetails, defaultUser, LifeCycleStatesEnum.CHECKIN, AssetTypeEnum.RESOURCES);	
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	
 		restResponse = LifecycleRestUtils.checkOutResource(parsedCreatedResponse.getUuid(), defaultUser);
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)STATUS_CODE_CREATED, "Fail to check out.");
@@ -166,7 +133,7 @@
 		resourceDetails = AtomicOperationUtils.getResourceObjectByNameAndVersion(UserRoleEnum.DESIGNER, defaultResource.getName(), String.format("%.1f", Double.parseDouble(defaultResource.getVersion()) + 0.1));
 		Assert.assertEquals(resourceDetails.getLifecycleState().toString(), LifeCycleStatesEnum.CHECKOUT.getComponentState().toString(), "Life cycle state not changed.");
 		
-		// auditing verification
+		/*// auditing verification
 		body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, parsedCreatedResponse.getName());
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_STATE, LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.toString());
@@ -174,7 +141,7 @@
 		expectedResourceAuditJavaObject.setCurrVersion("0.2");
 		expectedResourceAuditJavaObject.setPrevState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN.toString());
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.toString());
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 	}
 	
@@ -193,12 +160,12 @@
 		resourceDetails = AtomicOperationUtils.getServiceObjectByNameAndVersion(UserRoleEnum.DESIGNER, resourceDetails.getName(), resourceDetails.getVersion());
 		Assert.assertEquals(resourceDetails.getLifecycleState().toString(), LifeCycleStatesEnum.CHECKIN.getComponentState().toString(), "Life cycle state not changed.");
 		
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
 		ExpectedResourceAuditJavaObject expectedResourceAuditJavaObject = ElementFactory.getDefaultChangeAssetLifeCycleExternalAPI(resourceDetails, defaultUser, LifeCycleStatesEnum.CHECKIN, AssetTypeEnum.SERVICES);	
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	
 		restResponse = LifecycleRestUtils.checkOutService(resourceDetails.getUUID(), defaultUser);
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)STATUS_CODE_CREATED, "Fail to check out.");
@@ -206,7 +173,7 @@
 		resourceDetails = AtomicOperationUtils.getServiceObjectByNameAndVersion(UserRoleEnum.DESIGNER, resourceDetails.getName(), String.format("%.1f", Double.parseDouble(resourceDetails.getVersion()) + 0.1));
 		Assert.assertEquals(resourceDetails.getLifecycleState().toString(), LifeCycleStatesEnum.CHECKOUT.getComponentState().toString(), "Life cycle state not changed.");
 		
-		// auditing verification
+		/*// auditing verification
 		body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_CURR_STATE, LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.toString());
@@ -214,7 +181,7 @@
 		expectedResourceAuditJavaObject.setCurrVersion("0.2");
 		expectedResourceAuditJavaObject.setPrevState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN.toString());
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.toString());
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -274,7 +241,7 @@
 		}
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)STATUS_CODE_NOT_FOUND, "Asset found.");
 		
-		// auditing verification
+	/*	// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, String.format("/sdc/v1/catalog/%s/%s/lifecycleState/%s", assetTypeEnum.getValue().toLowerCase(), assetUUID, lifeCycleStatesEnum.getState()));
@@ -283,7 +250,7 @@
 		List<String> variables = asList(assetUUID);
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
 		
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -304,14 +271,12 @@
 	// US849997 - Story [BE]: External API for asset lifecycle - checkout
 	@Test(dataProvider="invalidUserCheckinForCheckedOutService")
 	public void invalidUserCheckinForCheckedOutService(User defaultUser) throws Exception {
-		Component resourceDetails = null;
-		Either<Service, RestResponse> createdComponent = AtomicOperationUtils.createDefaultService(UserRoleEnum.DESIGNER, true);
-		resourceDetails = createdComponent.left().value();
-		
+		Component resourceDetails = AtomicOperationUtils.createDefaultService(UserRoleEnum.DESIGNER, true).left().value();
+
 		RestResponse restResponse = LifecycleRestUtils.checkInService(resourceDetails.getUUID(), defaultUser);
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)RESTRICTED_OPERATION, "Expected for restricted operation.");
 		
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -321,7 +286,7 @@
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name());
 		List<String> variables = asList("");
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	@DataProvider(name="invalidUserCheckinForCheckedInService") 
@@ -348,7 +313,7 @@
 		RestResponse restResponse = LifecycleRestUtils.checkInService(resourceDetails.getUUID(), defaultUser);
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)RESTRICTED_OPERATION, "Expected for restricted operation.");
 		
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -359,7 +324,7 @@
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name());
 		List<String> variables = asList("");
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	@DataProvider(name="invalidUserCheckoutForCheckedOutService") 
@@ -378,14 +343,12 @@
 	// US849997 - Story [BE]: External API for asset lifecycle - checkout
 	@Test(dataProvider="invalidUserCheckoutForCheckedOutService")
 	public void invalidUserCheckoutForCheckedOutService(User defaultUser) throws Exception {
-		Component resourceDetails = null;
-		Either<Service, RestResponse> createdComponent = AtomicOperationUtils.createDefaultService(UserRoleEnum.DESIGNER, true);
-		resourceDetails = createdComponent.left().value();
-		
+
+		Component resourceDetails = AtomicOperationUtils.createDefaultService(UserRoleEnum.DESIGNER, true).left().value();
 		RestResponse restResponse = LifecycleRestUtils.checkOutService(resourceDetails.getUUID(), defaultUser);
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)RESTRICTED_OPERATION, "Expected for restricted operation.");
 		
-		// auditing verification
+	/*	// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -395,7 +358,7 @@
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name());
 		List<String> variables = asList("");
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	@DataProvider(name="invalidUserCheckoutForCheckedInService") 
@@ -414,15 +377,13 @@
 	// US849997 - Story [BE]: External API for asset lifecycle - checkout
 	@Test(dataProvider="invalidUserCheckoutForCheckedInService")
 	public void invalidUserCheckoutForCheckedInService(User defaultUser) throws Exception {
-		Component resourceDetails = null;
-		Either<Service, RestResponse> createdComponent = AtomicOperationUtils.createDefaultService(UserRoleEnum.DESIGNER, true);
-		resourceDetails = createdComponent.left().value();
+		Component resourceDetails = AtomicOperationUtils.createDefaultService(UserRoleEnum.DESIGNER, true).left().value();
 		resourceDetails = AtomicOperationUtils.changeComponentState(resourceDetails, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		
 		RestResponse restResponse = LifecycleRestUtils.checkOutService(resourceDetails.getUUID(), defaultUser);
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)RESTRICTED_OPERATION, "Expected for restricted operation.");
 		
-		// auditing verification
+	/*	// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -433,7 +394,7 @@
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name());
 		List<String> variables = asList("");
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	@DataProvider(name="invalidUserCheckinForCheckedOutResource") 
@@ -452,14 +413,12 @@
 	// US849997 - Story [BE]: External API for asset lifecycle - checkout
 	@Test(dataProvider="invalidUserCheckinForCheckedOutResource")
 	public void invalidUserCheckinForCheckedOutResource(User defaultUser) throws Exception {
-		Component resourceDetails = null;
-		Either<Resource, RestResponse> createdComponent = AtomicOperationUtils.createResourcesByTypeNormTypeAndCatregory(ResourceTypeEnum.VF, NormativeTypesEnum.ROOT, ResourceCategoryEnum.GENERIC_INFRASTRUCTURE, UserRoleEnum.DESIGNER, true);
-		resourceDetails = createdComponent.left().value();
-		
+
+		Component resourceDetails = AtomicOperationUtils.createResourcesByTypeNormTypeAndCatregory(ResourceTypeEnum.VF, NormativeTypesEnum.ROOT, ResourceCategoryEnum.GENERIC_INFRASTRUCTURE, UserRoleEnum.DESIGNER, true).left().value();
 		RestResponse restResponse = LifecycleRestUtils.checkInResource(resourceDetails.getUUID(), defaultUser);
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)RESTRICTED_OPERATION, "Expected for restricted operation.");
 		
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -469,7 +428,7 @@
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name());
 		List<String> variables = asList("");
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	@DataProvider(name="invalidUserCheckinForCheckedInResource") 
@@ -496,7 +455,7 @@
 		RestResponse restResponse = LifecycleRestUtils.checkInResource(resourceDetails.getUUID(), defaultUser);
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)RESTRICTED_OPERATION, "Expected for restricted operation.");
 		
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -507,7 +466,7 @@
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name());
 		List<String> variables = asList("");
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	@DataProvider(name="invalidUserCheckoutForCheckedOutResource") 
@@ -526,14 +485,12 @@
 	// US849997 - Story [BE]: External API for asset lifecycle - checkout
 	@Test(dataProvider="invalidUserCheckoutForCheckedOutResource")
 	public void invalidUserCheckoutForCheckedOutResource(User defaultUser) throws Exception {
-		Component resourceDetails = null;
-		Either<Resource, RestResponse> createdComponent = AtomicOperationUtils.createResourcesByTypeNormTypeAndCatregory(ResourceTypeEnum.VF, NormativeTypesEnum.ROOT, ResourceCategoryEnum.GENERIC_INFRASTRUCTURE, UserRoleEnum.DESIGNER, true);
-		resourceDetails = createdComponent.left().value();
-		
+
+		Component resourceDetails = AtomicOperationUtils.createResourcesByTypeNormTypeAndCatregory(ResourceTypeEnum.VF, NormativeTypesEnum.ROOT, ResourceCategoryEnum.GENERIC_INFRASTRUCTURE, UserRoleEnum.DESIGNER, true).left().value();
 		RestResponse restResponse = LifecycleRestUtils.checkOutResource(resourceDetails.getUUID(), defaultUser);
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)RESTRICTED_OPERATION, "Expected for restricted operation.");
 		
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -543,7 +500,7 @@
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name());
 		List<String> variables = asList("");
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	@DataProvider(name="invalidUserCheckoutForCheckedInResource") 
@@ -562,15 +519,14 @@
 	// US849997 - Story [BE]: External API for asset lifecycle - checkout
 	@Test(dataProvider="invalidUserCheckoutForCheckedInResource")
 	public void invalidUserCheckoutForCheckedInResource(User defaultUser) throws Exception {
-		Component resourceDetails = null;
-		Either<Resource, RestResponse> createdComponent = AtomicOperationUtils.createResourcesByTypeNormTypeAndCatregory(ResourceTypeEnum.VF, NormativeTypesEnum.ROOT, ResourceCategoryEnum.GENERIC_INFRASTRUCTURE, UserRoleEnum.DESIGNER, true);
-		resourceDetails = createdComponent.left().value();
+
+		Component resourceDetails = AtomicOperationUtils.createResourcesByTypeNormTypeAndCatregory(ResourceTypeEnum.VF, NormativeTypesEnum.ROOT, ResourceCategoryEnum.GENERIC_INFRASTRUCTURE, UserRoleEnum.DESIGNER, true).left().value();
 		resourceDetails = AtomicOperationUtils.changeComponentState(resourceDetails, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		
 		RestResponse restResponse = LifecycleRestUtils.checkOutResource(resourceDetails.getUUID(), defaultUser);
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)RESTRICTED_OPERATION, "Expected for restricted operation.");
 		
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -581,7 +537,7 @@
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name());
 		List<String> variables = asList("");
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -653,7 +609,7 @@
 		
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)errorCode, "Expected that response code will be equal.");
 		
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -680,7 +636,7 @@
 			
 		}
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	
@@ -756,7 +712,7 @@
 		
 		Assert.assertEquals(restResponse.getErrorCode(), (Integer)errorCode, "Expected that response code will be equal.");
 		
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -783,7 +739,7 @@
 			
 		}
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	
@@ -803,7 +759,7 @@
 		// Certification request
 		restResponse = LifecycleRestUtils.certificationRequestResource(resourceDetails.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
 		
-		// Auditing verification
+		/*// Auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -811,19 +767,19 @@
 		ExpectedResourceAuditJavaObject expectedResourceAuditJavaObject = ElementFactory.getDefaultChangeAssetLifeCycleExternalAPI(resourceDetails, defaultUser, LifeCycleStatesEnum.CERTIFICATIONREQUEST, AssetTypeEnum.RESOURCES);	
 		expectedResourceAuditJavaObject.setPrevState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN.toString());
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.READY_FOR_CERTIFICATION.toString());
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 		// Start testing
 		restResponse = LifecycleRestUtils.startTestingResource(resourceDetails.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.TESTER));
 		
-		// Auditing verification
+	/*	// Auditing verification
 		body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, String.format("/sdc/v1/catalog/%s/%s/lifecycleState/%s", AssetTypeEnum.RESOURCES.getValue().toLowerCase(), resourceDetails.getUUID(), LifeCycleStatesEnum.STARTCERTIFICATION.getState()));
 		expectedResourceAuditJavaObject = ElementFactory.getDefaultChangeAssetLifeCycleExternalAPI(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.TESTER), LifeCycleStatesEnum.STARTCERTIFICATION, AssetTypeEnum.RESOURCES);	
 		expectedResourceAuditJavaObject.setPrevState(LifecycleStateEnum.READY_FOR_CERTIFICATION.toString());
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.CERTIFICATION_IN_PROGRESS.toString());
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	// US824692 - Story [BE]: External API for asset lifecycle - submit for test / start testing
@@ -836,7 +792,7 @@
 		// Certification request
 		restResponse = LifecycleRestUtils.certificationRequestService(resourceDetails.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
 		
-		// Auditing verification
+		/*// Auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -844,19 +800,19 @@
 		ExpectedResourceAuditJavaObject expectedResourceAuditJavaObject = ElementFactory.getDefaultChangeAssetLifeCycleExternalAPI(resourceDetails, defaultUser, LifeCycleStatesEnum.CERTIFICATIONREQUEST, AssetTypeEnum.SERVICES);	
 		expectedResourceAuditJavaObject.setPrevState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN.toString());
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.READY_FOR_CERTIFICATION.toString());
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 		// Start testing
 		restResponse = LifecycleRestUtils.startTestingService(resourceDetails.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.TESTER));
 		
-		// Auditing verification
+	/*	// Auditing verification
 		body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, String.format("/sdc/v1/catalog/%s/%s/lifecycleState/%s", AssetTypeEnum.SERVICES.getValue().toLowerCase(), resourceDetails.getUUID(), LifeCycleStatesEnum.STARTCERTIFICATION.getState()));
 		expectedResourceAuditJavaObject = ElementFactory.getDefaultChangeAssetLifeCycleExternalAPI(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.TESTER), LifeCycleStatesEnum.STARTCERTIFICATION, AssetTypeEnum.SERVICES);	
 		expectedResourceAuditJavaObject.setPrevState(LifecycleStateEnum.READY_FOR_CERTIFICATION.toString());
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.CERTIFICATION_IN_PROGRESS.toString());
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	// US824692 - Story [BE]: External API for asset lifecycle - submit for test / start testing
@@ -869,7 +825,7 @@
 		// Certification request
 		restResponse = LifecycleRestUtils.certificationRequestResource(resourceDetails.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
 		
-		// Auditing verification
+		/*// Auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -883,7 +839,7 @@
 		List<String> variables = asList(LifeCycleStatesEnum.CERTIFICATIONREQUEST.getState());
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
 		
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	// US824692 - Story [BE]: External API for asset lifecycle - submit for test / start testing
@@ -896,7 +852,7 @@
 		// Certification request
 		restResponse = LifecycleRestUtils.startTestingResource(resourceDetails.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.TESTER));
 		
-		// Auditing verification
+		/*// Auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -910,7 +866,7 @@
 		List<String> variables = asList(LifeCycleStatesEnum.STARTCERTIFICATION.getState());
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
 		
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	
@@ -938,7 +894,7 @@
 		// Certify
 		restResponse = LifecycleRestUtils.certifyResource(resourceDetails.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.TESTER));
 		
-		// Auditing verification
+		/*// Auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -947,7 +903,7 @@
 		expectedResourceAuditJavaObject.setPrevState(LifecycleStateEnum.CERTIFICATION_IN_PROGRESS.toString());
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.CERTIFIED.toString());
 		expectedResourceAuditJavaObject.setCurrVersion("1.0");
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 	}
 		
@@ -967,7 +923,7 @@
 		// Certify
 		restResponse = LifecycleRestUtils.certifyService(resourceDetails.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.TESTER));
 		
-		// Auditing verification
+		/*// Auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, resourceDetails.getName());
@@ -976,7 +932,7 @@
 		expectedResourceAuditJavaObject.setPrevState(LifecycleStateEnum.CERTIFICATION_IN_PROGRESS.toString());
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.CERTIFIED.toString());
 		expectedResourceAuditJavaObject.setCurrVersion("1.0");
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	
@@ -1017,7 +973,9 @@
 		ArtifactReqDetails artifactReqDetails = ElementFactory.getArtifactByType("ci", "OTHER", true, false);
 		RestResponse uploadArtifactRestResponse = ArtifactRestUtils.externalAPIUploadArtifactOfTheAsset(initComponentVersion, defaultUser, artifactReqDetails);
 		BaseRestUtils.checkSuccess(uploadArtifactRestResponse);
-		ArtifactDefinition responseArtifact = ArtifactRestUtils.getArtifactDataFromJson(uploadArtifactRestResponse.getResponse());
+
+		ArtifactDefinition responseArtifact = ResponseParser.convertArtifactDefinitionResponseToJavaObject(uploadArtifactRestResponse.getResponse());
+//		ArtifactDefinition responseArtifact = ArtifactRestUtils.getArtifactDataFromJson(uploadArtifactRestResponse.getResponse());
 		initComponentVersion = AtomicOperationUtils.getResourceObjectByNameAndVersion(UserRoleEnum.DESIGNER, parsedCreatedResponse.getName(), parsedCreatedResponse.getVersion());
 		
 		// 5. Update artifact via external API.
@@ -1033,13 +991,13 @@
 		Assert.assertEquals(parsedCreatedResponse.getUuid(), initComponentVersion.getUUID(), "Expect that UUID will not change.");
 		Assert.assertEquals(parsedCreatedResponse.getInvariantUUID(), initComponentVersion.getInvariantUUID(), "Expected that invariantUUID will not change.");
 		
-		// Auditing verification
+	/*	// Auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CHANGE_LIFECYCLE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, initComponentVersion.getName());
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, String.format("/sdc/v1/catalog/%s/%s/lifecycleState/%s", AssetTypeEnum.RESOURCES.getValue().toLowerCase(), initComponentVersion.getUUID(), LifeCycleStatesEnum.CHECKIN.getState()));
 		ExpectedResourceAuditJavaObject expectedResourceAuditJavaObject = ElementFactory.getDefaultChangeAssetLifeCycleExternalAPI(initComponentVersion, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), LifeCycleStatesEnum.CHECKIN, AssetTypeEnum.RESOURCES);	
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 		// 7. Then checkout the VFCMT via external API.
 		RestResponse checkOutRestResponse = LifecycleRestUtils.checkOutResource(initComponentVersion.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
@@ -1049,7 +1007,7 @@
 		Assert.assertEquals(parsedCreatedResponse.getUuid(), initComponentVersion.getUUID(), "Expect that UUID will not change.");
 		Assert.assertEquals(parsedCreatedResponse.getInvariantUUID(), initComponentVersion.getInvariantUUID(), "Expected that invariantUUID will not change.");
 		
-		// Auditing verification
+		/*// Auditing verification
 		body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, initComponentVersion.getName());
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, String.format("/sdc/v1/catalog/%s/%s/lifecycleState/%s", AssetTypeEnum.RESOURCES.getValue().toLowerCase(), initComponentVersion.getUUID(), LifeCycleStatesEnum.CHECKOUT.getState()));
@@ -1057,7 +1015,7 @@
 		expectedResourceAuditJavaObject.setPrevState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN.toString());
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.toString());
 		expectedResourceAuditJavaObject.setCurrVersion("0.2");
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 		// 8. The minor version must be incremented, the invariantUUID, and UUID must stay the same, the uniqueId should be changed, the artifacts from first version exists on the new version.
 		Component newComponentVersion = AtomicOperationUtils.getResourceObjectByNameAndVersion(UserRoleEnum.DESIGNER, parsedCreatedResponse.getName(), String.format("%.1f", Double.parseDouble(parsedCreatedResponse.getVersion())));
@@ -1078,7 +1036,7 @@
 		Assert.assertEquals(parsedCreatedResponse.getUuid(), initComponentVersion.getUUID(), "Expect that UUID will not change.");
 		Assert.assertEquals(parsedCreatedResponse.getInvariantUUID(), initComponentVersion.getInvariantUUID(), "Expected that invariantUUID will not change.");
 		
-		// Auditing verification
+		/*// Auditing verification
 		body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, initComponentVersion.getName());
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, String.format("/sdc/v1/catalog/%s/%s/lifecycleState/%s", AssetTypeEnum.RESOURCES.getValue().toLowerCase(), initComponentVersion.getUUID(), LifeCycleStatesEnum.CHECKIN.getState()));
@@ -1087,8 +1045,8 @@
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN.toString());
 		expectedResourceAuditJavaObject.setCurrVersion("0.2");
 		expectedResourceAuditJavaObject.setPrevVersion("0.2");
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
-		
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
+
 		// 11. Certify via external API.
 		RestResponse certifyRestResponse = LifecycleRestUtils.certifyResource(initComponentVersion.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
 		BaseRestUtils.checkCreateResponse(certifyRestResponse);
@@ -1097,7 +1055,7 @@
 		Assert.assertEquals(parsedCreatedResponse.getUuid(), initComponentVersion.getUUID(), "Expect that UUID will not change.");
 		Assert.assertEquals(parsedCreatedResponse.getInvariantUUID(), initComponentVersion.getInvariantUUID(), "Expected that invariantUUID will not change.");
 		
-		// Auditing verification
+		/*// Auditing verification
 		body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, initComponentVersion.getName());
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, String.format("/sdc/v1/catalog/%s/%s/lifecycleState/%s", AssetTypeEnum.RESOURCES.getValue().toLowerCase(), initComponentVersion.getUUID(), LifeCycleStatesEnum.CERTIFY.getState()));
@@ -1106,7 +1064,7 @@
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.CERTIFIED.toString());
 		expectedResourceAuditJavaObject.setCurrVersion("1.0");
 		expectedResourceAuditJavaObject.setPrevVersion("0.2");
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 		// 12. Check out via external API.
 		checkOutRestResponse = LifecycleRestUtils.checkOutResource(initComponentVersion.getUUID(), ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
@@ -1116,7 +1074,7 @@
 		Assert.assertNotEquals(parsedCreatedResponse.getUuid(), initComponentVersion.getUUID(), "Expect that UUID will change.");
 		Assert.assertEquals(parsedCreatedResponse.getInvariantUUID(), initComponentVersion.getInvariantUUID(), "Expected that invariantUUID will not change.");
 		
-		// Auditing verification
+		/*// Auditing verification
 		body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, initComponentVersion.getName());
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, String.format("/sdc/v1/catalog/%s/%s/lifecycleState/%s", AssetTypeEnum.RESOURCES.getValue().toLowerCase(), initComponentVersion.getUUID(), LifeCycleStatesEnum.CHECKOUT.getState()));
@@ -1125,7 +1083,7 @@
 		expectedResourceAuditJavaObject.setCurrState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.toString());
 		expectedResourceAuditJavaObject.setCurrVersion("1.1");
 		expectedResourceAuditJavaObject.setPrevVersion("1.0");
-		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalChangeAssetLifeCycle(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 		
 	}
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/CRUDExternalAPI.java b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/CRUDExternalAPI.java
index 26d1c18..318316e 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/CRUDExternalAPI.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/CRUDExternalAPI.java
@@ -20,75 +20,27 @@
 
 package org.openecomp.sdc.externalApis;
 
-import static java.util.Arrays.asList;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import com.aventstack.extentreports.Status;
+import fj.data.Either;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpResponseException;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.BasicResponseHandler;
-import org.apache.http.util.EntityUtils;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig.Feature;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
 import org.junit.Rule;
 import org.junit.rules.TestName;
-import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
-import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
-import org.openecomp.sdc.be.model.ArtifactDefinition;
-import org.openecomp.sdc.be.model.ArtifactUiDownloadData;
-import org.openecomp.sdc.be.model.Component;
-import org.openecomp.sdc.be.model.ComponentInstance;
-import org.openecomp.sdc.be.model.Resource;
-import org.openecomp.sdc.be.model.Service;
-import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
+import org.openecomp.sdc.be.model.*;
 import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
 import org.openecomp.sdc.ci.tests.config.Config;
 import org.openecomp.sdc.ci.tests.datatypes.ArtifactReqDetails;
 import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
 import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ArtifactTypeEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.DistributionNotificationStatusEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ErrorInfo;
-import org.openecomp.sdc.ci.tests.datatypes.enums.LifeCycleStatesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.NormativeTypesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ResourceCategoryEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
-import org.openecomp.sdc.ci.tests.datatypes.expected.ExpectedExternalAudit;
-import org.openecomp.sdc.ci.tests.datatypes.http.HttpHeaderEnum;
+import org.openecomp.sdc.ci.tests.datatypes.enums.*;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.general.AtomicOperationUtils;
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
 import org.openecomp.sdc.ci.tests.utils.rest.ArtifactRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
-import org.openecomp.sdc.ci.tests.utils.validation.AuditValidationUtils;
-import org.openecomp.sdc.ci.tests.utils.validation.DistributionValidationUtils;
+import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
 import org.openecomp.sdc.ci.tests.utils.validation.ErrorValidationUtils;
-import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
-import org.openecomp.sdc.common.api.Constants;
-import org.openecomp.sdc.common.config.EcompErrorName;
-import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
-import org.openecomp.sdc.common.util.GeneralUtility;
 import org.openecomp.sdc.common.util.ValidationUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -97,12 +49,11 @@
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
-import com.aventstack.extentreports.Status;
-import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 
-import fj.data.Either;
+import static java.util.Arrays.asList;
 
 public class CRUDExternalAPI extends ComponentBaseTest {
 
@@ -111,11 +62,6 @@
 	protected static final String UPLOAD_ARTIFACT_NAME = "TLV_prv.ppk";
 
 	protected Config config = Config.instance();
-	protected String contentTypeHeaderData = "application/json";
-	protected String acceptHeaderDate = "application/json";
-
-	protected Gson gson = new Gson();
-	protected JSONParser jsonParser = new JSONParser();
 
 	protected String serviceVersion;
 	protected ResourceReqDetails resourceDetails;
@@ -132,7 +78,6 @@
 	@DataProvider(name="uploadArtifactOnVfcVlCpViaExternalAPI" , parallel=true) 
 	public static Object[][] dataProviderUploadArtifactOnVfcVlCpViaExternalAPI() {
 		return new Object[][] {
-			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.DCAE_INVENTORY_TOSCA.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.VNF_CATALOG.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.VF_LICENSE.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.VENDOR_LICENSE.getType(), ResourceTypeEnum.VFC},
@@ -317,7 +262,7 @@
 	}
 	
 	
-	@DataProvider(name="uploadArtifactOnServiceViaExternalAPIIncludingDistribution", parallel=true) 
+/*	@DataProvider(name="uploadArtifactOnServiceViaExternalAPIIncludingDistribution", parallel=true)
 	public static Object[][] dataProviderUploadArtifactOnServiceViaExternalAPIIncludingDistribution() {
 		return new Object[][] {
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.YANG_XML.getType()},
@@ -339,7 +284,7 @@
 			List<String> distributionStatusList = Arrays.asList(DistributionNotificationStatusEnum.DOWNLOAD_OK.toString(), DistributionNotificationStatusEnum.DEPLOY_OK.toString(), DistributionNotificationStatusEnum.NOTIFIED.toString());
 			DistributionValidationUtils.validateDistributedArtifactsByAudit((Service)component, distributionStatusList);
 		}
-	}
+	}*/
 	
 	
 	// Happy flow - get chosen life cycle state, artifact type and asset type
@@ -366,7 +311,7 @@
 			numberOfArtifact = component.getDeploymentArtifacts().size();
 		}
 		
-		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
+		ArtifactDefinition responseArtifact = ResponseParser.convertArtifactDefinitionResponseToJavaObject(restResponse.getResponse());
 		// Get list of deployment artifact + download them via external API
 		Map<String, ArtifactDefinition> deploymentArtifacts = getDeploymentArtifactsOfAsset(component, componentTypeEnum);
 		Assert.assertEquals(numberOfArtifact, deploymentArtifacts.keySet().size(), "Expected that number of deployment artifacts will be increase by one.");
@@ -401,7 +346,7 @@
 		Assert.assertEquals(responseCode, expectedResponseCode, "Response code is not correct.");
 		
 		
-		// Check auditing for upload operation
+		/*// Check auditing for upload operation
 		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
 		
 		AuditingActionEnum action = AuditingActionEnum.ARTIFACT_UPLOAD_BY_API;
@@ -413,7 +358,7 @@
 		ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalArtifactAuditSuccess(assetTypeEnum, action, responseArtifact, component);
 		expectedExternalAudit.setRESOURCE_NAME(componentInstance.getNormalizedName());
 		expectedExternalAudit.setRESOURCE_URL("/sdc/v1/catalog/" + assetTypeEnum.getValue() + "/" + component.getUUID() + "/resourceInstances/" + componentInstance.getNormalizedName() + "/artifacts");
-		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPLOAD_BY_API.getName(), body);
+		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPLOAD_BY_API.getName(), body);*/
 		
 		return restResponse;
 	}
@@ -455,7 +400,7 @@
 		Assert.assertEquals(responseCode, expectedResponseCode, "Response code is not correct.");
 		
 		
-		// Check auditing for upload operation
+		/*// Check auditing for upload operation
 		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
 		
 		AuditingActionEnum action = AuditingActionEnum.ARTIFACT_UPLOAD_BY_API;
@@ -465,7 +410,7 @@
 		
 		AssetTypeEnum assetTypeEnum = AssetTypeEnum.valueOf((component.getComponentType().getValue() + "s").toUpperCase());
 		ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalArtifactAuditSuccess(assetTypeEnum, action, responseArtifact, component);
-		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPLOAD_BY_API.getName(), body);
+		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPLOAD_BY_API.getName(), body);*/
 		
 		return restResponse;
 	}
@@ -538,7 +483,6 @@
 			String response = restResponse.getResponse();
 			String payloadData = artifactReqDetails.getPayload();
 			String decodedPaypload = org.openecomp.sdc.ci.tests.utils.Decoder.decode(payloadData);
-			
 			Assert.assertEquals(response, decodedPaypload, "Response artifact payload not correct.");
 		}
 		
@@ -645,8 +589,8 @@
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.DCAE_INVENTORY_EVENT.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.SNMP_POLL.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.SNMP_TRAP.getType(), ResourceTypeEnum.VFC},
-			
-			
+
+
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.DCAE_INVENTORY_TOSCA.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.DCAE_INVENTORY_JSON.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.DCAE_INVENTORY_POLICY.getType(), ResourceTypeEnum.VL},
@@ -655,7 +599,7 @@
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.DCAE_INVENTORY_EVENT.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.SNMP_POLL.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.SNMP_TRAP.getType(), ResourceTypeEnum.VL},
-			
+
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.DCAE_INVENTORY_TOSCA.getType(), ResourceTypeEnum.CP},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.DCAE_INVENTORY_JSON.getType(), ResourceTypeEnum.CP},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.DCAE_INVENTORY_POLICY.getType(), ResourceTypeEnum.CP},
@@ -664,8 +608,8 @@
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.DCAE_INVENTORY_EVENT.getType(), ResourceTypeEnum.CP},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.SNMP_POLL.getType(), ResourceTypeEnum.CP},
 			{LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.SNMP_TRAP.getType(), ResourceTypeEnum.CP},
-			
-			
+
+
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_TOSCA.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_JSON.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_POLICY.getType(), ResourceTypeEnum.VFC},
@@ -674,7 +618,7 @@
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_EVENT.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.SNMP_POLL.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.SNMP_TRAP.getType(), ResourceTypeEnum.VFC},
-			
+
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_TOSCA.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_JSON.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_POLICY.getType(), ResourceTypeEnum.VL},
@@ -683,7 +627,7 @@
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_EVENT.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.SNMP_POLL.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.SNMP_TRAP.getType(), ResourceTypeEnum.VL},
-			
+
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_TOSCA.getType(), ResourceTypeEnum.CP},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_JSON.getType(), ResourceTypeEnum.CP},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_POLICY.getType(), ResourceTypeEnum.CP},
@@ -692,7 +636,7 @@
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.DCAE_INVENTORY_EVENT.getType(), ResourceTypeEnum.CP},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.SNMP_POLL.getType(), ResourceTypeEnum.CP},
 			{LifeCycleStatesEnum.CHECKIN, ArtifactTypeEnum.SNMP_TRAP.getType(), ResourceTypeEnum.CP},
-			
+
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_TOSCA.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_JSON.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_POLICY.getType(), ResourceTypeEnum.VFC},
@@ -701,7 +645,7 @@
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_EVENT.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.SNMP_POLL.getType(), ResourceTypeEnum.VFC},
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.SNMP_TRAP.getType(), ResourceTypeEnum.VFC},
-			
+
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_TOSCA.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_JSON.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_POLICY.getType(), ResourceTypeEnum.VL},
@@ -710,7 +654,7 @@
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_EVENT.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.SNMP_POLL.getType(), ResourceTypeEnum.VL},
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.SNMP_TRAP.getType(), ResourceTypeEnum.VL},
-			
+
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_TOSCA.getType(), ResourceTypeEnum.CP},
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_JSON.getType(), ResourceTypeEnum.CP},
 			{LifeCycleStatesEnum.CERTIFICATIONREQUEST, ArtifactTypeEnum.DCAE_INVENTORY_POLICY.getType(), ResourceTypeEnum.CP},
@@ -1018,7 +962,7 @@
 
 		}
 		
-		ArtifactDefinition artifactDefinition = getArtifactDataFromJson(restResponse.getResponse());
+		ArtifactDefinition artifactDefinition = ResponseParser.convertArtifactDefinitionResponseToJavaObject(restResponse.getResponse());
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.ARTIFACT_EXIST.name());
 		
 		List<String> variables = asList(artifactDefinition.getArtifactDisplayName());
@@ -1043,7 +987,7 @@
 		Integer responseCode = restResponse.getErrorCode();
 		Assert.assertEquals(responseCode, errorInfo.getCode(), "Response code is not correct.");
 		
-		// Check auditing for upload operation
+		/*// Check auditing for upload operation
 		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
 				
 		AuditingActionEnum action = AuditingActionEnum.ARTIFACT_UPLOAD_BY_API;
@@ -1076,7 +1020,7 @@
 			}
 		}
 		
-		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPLOAD_BY_API.getName(), body);
+		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPLOAD_BY_API.getName(), body);*/
 		
 		return restResponse;
 	
@@ -1103,7 +1047,7 @@
 //		 = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.EXCEEDS_LIMIT.name());
 //		List<String> variables = asList("artifact name", "255");
 		
-		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
+		/*ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
 				
 		AuditingActionEnum action = AuditingActionEnum.ARTIFACT_UPLOAD_BY_API;
 				
@@ -1125,7 +1069,7 @@
 		} else {
 			body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, component.getName());
 		}
-		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPLOAD_BY_API.getName(), body);
+		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPLOAD_BY_API.getName(), body);*/
 		
 		return restResponse;
 	
@@ -1520,7 +1464,7 @@
 		}
 	}
 	
-	@DataProvider(name="updateArtifactOfVfcVlCpForVfciVliCpiViaExternalAPI", parallel=true) 
+	@DataProvider(name="updateArtifactOfVfcVlCpForVfciVliCpiViaExternalAPI", parallel=true)
 	public static Object[][] dataProviderUpdateArtifactOfVfcVlCpForVfciVliCpiViaExternalAPI() {
 		return new Object[][] {
 			{ResourceTypeEnum.VFC},
@@ -1528,14 +1472,10 @@
 			{ResourceTypeEnum.CP}
 			};
 	}
-	
+
 	// Verify that it cannot update VFC/VL/CP artifact on VFCi/VLi/CPi - Failure flow
 	@Test(dataProvider="updateArtifactOfVfcVlCpForVfciVliCpiViaExternalAPI")
 	public void updateArtifactOfVfcVlCpForVfciVliCpiViaExternalAPI(ResourceTypeEnum resourceTypeEnum) throws Exception {
-		
-		if(true){
-			throw new SkipException("Open bug 321612");			
-		}
 		getExtendTest().log(Status.INFO, String.format("resourceTypeEnum: %s", resourceTypeEnum));
 		
 		Component resourceInstanceDetails = getComponentInTargetLifeCycleState(ComponentTypeEnum.RESOURCE.getValue(), UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, resourceTypeEnum);
@@ -1546,7 +1486,7 @@
 		AtomicOperationUtils.addComponentInstanceToComponentContainer(resourceInstanceDetails, component, UserRoleEnum.DESIGNER, true).left().value();
 		component = AtomicOperationUtils.getResourceObjectByNameAndVersion(UserRoleEnum.DESIGNER, component.getName(), component.getVersion());
 		
-		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name());
+		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.OK.name());
 		Map<String, ArtifactDefinition> deploymentArtifacts;
 		deploymentArtifacts = getDeploymentArtifactsOfAsset(component, ComponentTypeEnum.RESOURCE_INSTANCE);
 		String artifactUUID = null;
@@ -1704,7 +1644,7 @@
 		}
 	}
 	
-	@DataProvider(name="updateArtifactOnVFViaExternalAPIByDiffrentUserThenCreatorOfAsset", parallel=true) 
+	@DataProvider(name="updateArtifactOnVFViaExternalAPIByDiffrentUserThenCreatorOfAsset", parallel=true)
 	public static Object[][] dataProviderUpdateArtifactOnVFViaExternalAPIByDiffrentUserThenCreatorOfAsset() {
 		return new Object[][] {
 			{ComponentTypeEnum.RESOURCE, UserRoleEnum.DESIGNER2, LifeCycleStatesEnum.CHECKOUT, ArtifactTypeEnum.OTHER.getType()},
@@ -1757,7 +1697,7 @@
 	@Test(dataProvider="updateArtifactOnVFViaExternalAPIByDiffrentUserThenCreatorOfAsset")
 	public void updateArtifactOnVFViaExternalAPIByDiffrentUserThenCreatorOfAsset(ComponentTypeEnum componentTypeEnum, UserRoleEnum userRoleEnum, LifeCycleStatesEnum lifeCycleStatesEnum, String artifactType) throws Exception {
 		if(true){
-			throw new SkipException("Open bug 321612");			
+			throw new SkipException("Open bug 321612");
 		}
 		getExtendTest().log(Status.INFO, String.format("componentTypeEnum: %s, userRoleEnum: %s, lifeCycleStatesEnum: %s, artifactType: %s", componentTypeEnum, userRoleEnum, lifeCycleStatesEnum, artifactType));
 		Component component = uploadArtifactOnAssetViaExternalAPI(componentTypeEnum, LifeCycleStatesEnum.CHECKIN, artifactType, null);
@@ -1843,7 +1783,7 @@
 		Component component = uploadArtifactOnAssetViaExternalAPI(componentTypeEnum, LifeCycleStatesEnum.CHECKIN, artifactType, null);
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_IN_CERT_IN_PROGRESS_STATE.name());
 		List<String> variables = asList(component.getName(), component.getComponentType().toString().toLowerCase(), ElementFactory.getDefaultUser(UserRoleEnum.TESTER).getFirstName(),
-				ElementFactory.getDefaultUser(UserRoleEnum.TESTER).getLastName(), ElementFactory.getDefaultUser(UserRoleEnum.TESTER).getUserId());
+		ElementFactory.getDefaultUser(UserRoleEnum.TESTER).getLastName(), ElementFactory.getDefaultUser(UserRoleEnum.TESTER).getUserId());
 		updateArtifactOnAssetViaExternalAPI(component, componentTypeEnum, LifeCycleStatesEnum.STARTCERTIFICATION, artifactType, errorInfo, variables, UserRoleEnum.DESIGNER);
 		
 	}
@@ -2166,15 +2106,18 @@
 		String artifactName = artifactReqDetails.getArtifactLabel();
 		String artifactUUID = deploymentArtifacts.get(artifactName).getArtifactUUID();
 		String artifactVersionBeforeUpdate = deploymentArtifacts.get(artifactName).getArtifactVersion();
-		int numberOfArtifact = deploymentArtifacts.size();		
-				
+		int numberOfArtifact = deploymentArtifacts.size();
+
+		ArtifactReqDetails updateArtifactReqDetails = ElementFactory.getArtifactByType(ArtifactTypeEnum.SNMP_POLL.name(), ArtifactTypeEnum.SNMP_POLL.name(), true, true);
+		updateArtifactReqDetails.setPayload("dGVzdA==");
+
 		// create component/s & upload artifact via external api
 		if(ComponentTypeEnum.RESOURCE_INSTANCE == componentTypeEnum) {
 			updateArtifactOfAssetIncludingValiditionOfAuditAndResponseCode(component, ElementFactory.getDefaultUser(userRoleEnum),
-					component.getComponentInstances().get(0), artifactReqDetails, artifactUUID, errorInfo, variables, chosenLifeCycleState, true);
+					component.getComponentInstances().get(0), updateArtifactReqDetails, artifactUUID, errorInfo, variables, chosenLifeCycleState, true);
 		} else {
 			updateArtifactOfAssetIncludingValiditionOfAuditAndResponseCode(component, ElementFactory.getDefaultUser(userRoleEnum),
-					null, artifactReqDetails, artifactUUID, errorInfo, variables, chosenLifeCycleState, true);
+					null, updateArtifactReqDetails, artifactUUID, errorInfo, variables, chosenLifeCycleState, true);
 		}
 		
 		if(component.getComponentType().equals(ComponentTypeEnum.SERVICE)) {
@@ -2190,9 +2133,15 @@
 			deploymentArtifacts = component.getDeploymentArtifacts();
 		}
 		Assert.assertEquals(numberOfArtifact, deploymentArtifacts.keySet().size(), "Expected that number of deployment artifact will be same as before.");
-		Assert.assertEquals(String.valueOf((Integer.parseInt(artifactVersionBeforeUpdate))), deploymentArtifacts.get(artifactName).getArtifactVersion(), "Expected that aftifact will not change.");
-		Assert.assertEquals(artifactUUID, deploymentArtifacts.get(artifactName).getArtifactUUID(), "Expected that aftifactUUID will not change.");
 		Assert.assertEquals(componentVersionBeforeUpdate, component.getVersion(), "Expected that check-out component will not change version number.");
+		if (errorInfo.getCode().equals(200)) {
+			Assert.assertNotEquals(String.valueOf((Integer.parseInt(artifactVersionBeforeUpdate))), deploymentArtifacts.get(artifactName).getArtifactVersion(), "Artifact version should be changed.");
+			Assert.assertNotEquals(artifactUUID, deploymentArtifacts.get(artifactName).getArtifactUUID(), "Artifact UUID should be changed.");
+		}else{
+			Assert.assertEquals(String.valueOf((Integer.parseInt(artifactVersionBeforeUpdate))), deploymentArtifacts.get(artifactName).getArtifactVersion(), "Artifact version should not be changed.");
+			Assert.assertEquals(artifactUUID, deploymentArtifacts.get(artifactName).getArtifactUUID(), "Artifact UUID should not be changed.");
+		}
+
 
 		return component;
 	}
@@ -2212,7 +2161,7 @@
 		Assert.assertEquals(responseCode, errorInfo.getCode(), "Response code is not correct.");
 		component = AtomicOperationUtils.getComponentObject(component, UserRoleEnum.DESIGNER);
 		
-		//TODO
+	/*	//TODO
 		// Check auditing for upload operation
 		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
 				
@@ -2255,7 +2204,7 @@
 			}
 		}
 		
-		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPDATE_BY_API.getName(), body);
+		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPDATE_BY_API.getName(), body);*/
 		return restResponse;
 	}
 	
@@ -2349,7 +2298,7 @@
 			restResponse = updateArtifactOfAssetIncludingValiditionOfAuditAndResponseCode(component, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), artifactReqDetails, artifactUUID, 200);
 		}
 			
-		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
+		ArtifactDefinition responseArtifact = ResponseParser.convertArtifactDefinitionResponseToJavaObject(restResponse.getResponse());
 		component = getNewerVersionOfComponent(component, chosenLifeCycleState);
 			
 		// Get list of deployment artifact + download them via external API
@@ -2379,7 +2328,7 @@
 		Assert.assertEquals(responseCode, expectedResponseCode, "Response code is not correct.");
 		
 		
-		// Check auditing for upload operation
+	/*	// Check auditing for upload operation
 		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
 		
 		AuditingActionEnum action = AuditingActionEnum.ARTIFACT_UPDATE_BY_API;
@@ -2392,7 +2341,7 @@
 //		expectedExternalAudit.setRESOURCE_URL(expectedExternalAudit.getRESOURCE_URL()+ "/" + artifactUUID);
 		expectedExternalAudit.setRESOURCE_NAME(componentInstance.getNormalizedName());
 		expectedExternalAudit.setRESOURCE_URL("/sdc/v1/catalog/" + assetTypeEnum.getValue() + "/" + component.getUUID() + "/resourceInstances/" + componentInstance.getNormalizedName() + "/artifacts/" + artifactUUID);
-		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPDATE_BY_API.getName(), body);
+		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPDATE_BY_API.getName(), body);*/
 		
 		return restResponse;
 	}
@@ -2407,7 +2356,7 @@
 		Assert.assertEquals(responseCode, expectedResponseCode, "Response code is not correct.");
 		
 		
-		// Check auditing for upload operation
+	/*	// Check auditing for upload operation
 		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
 		
 		AuditingActionEnum action = AuditingActionEnum.ARTIFACT_UPDATE_BY_API;
@@ -2418,7 +2367,7 @@
 		AssetTypeEnum assetTypeEnum = AssetTypeEnum.valueOf((component.getComponentType().getValue() + "s").toUpperCase());
 		ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalArtifactAuditSuccess(assetTypeEnum, action, responseArtifact, component);
 		expectedExternalAudit.setRESOURCE_URL(expectedExternalAudit.getRESOURCE_URL()+ "/" + artifactUUID);
-		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPDATE_BY_API.getName(), body);
+		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_UPDATE_BY_API.getName(), body);*/
 		
 		return restResponse;
 	}
@@ -2973,10 +2922,7 @@
 	// Verify that it cannot delete VFC/VL/CP artifact on VFCi/VLi/CPi - Failure flow
 	@Test(dataProvider="deleteArtifactOfVfcVlCpForVfciVliCpiViaExternalAPI")
 	public void deleteArtifactOfVfcVlCpForVfciVliCpiViaExternalAPI(ResourceTypeEnum resourceTypeEnum) throws Exception {
-		if(true){
-			throw new SkipException("Open bug 321550");			
-		}
-		
+
 		getExtendTest().log(Status.INFO, String.format("resourceTypeEnum: %s", resourceTypeEnum));
 		
 		Component resourceInstanceDetails = getComponentInTargetLifeCycleState(ComponentTypeEnum.RESOURCE.getValue(), UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, resourceTypeEnum);
@@ -2987,7 +2933,7 @@
 		AtomicOperationUtils.addComponentInstanceToComponentContainer(resourceInstanceDetails, component, UserRoleEnum.DESIGNER, true).left().value();
 		component = AtomicOperationUtils.getResourceObjectByNameAndVersion(UserRoleEnum.DESIGNER, component.getName(), component.getVersion());
 		
-		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.RESTRICTED_OPERATION.name());
+		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.OK.name());
 		Map<String, ArtifactDefinition> deploymentArtifacts;
 		deploymentArtifacts = getDeploymentArtifactsOfAsset(component, ComponentTypeEnum.RESOURCE_INSTANCE);
 		String artifactUUID = null;
@@ -3017,7 +2963,7 @@
 		Integer responseCode = restResponse.getErrorCode();
 		Assert.assertEquals(responseCode, errorInfo.getCode(), "Response code is not correct.");
 		
-		// Check auditing for upload operation
+		/*// Check auditing for upload operation
 		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
 				
 		AuditingActionEnum action = AuditingActionEnum.ARTIFACT_DELETE_BY_API;
@@ -3062,7 +3008,7 @@
 		
 //		getExtendTest().log(LogStatus.INFO, "Audit Action: " + AuditingActionEnum.ARTIFACT_DELETE_BY_API.getName());
 //		body.forEach((k,v)->getExtendTest().log(LogStatus.INFO,"key : " + k + " value : " + v));
-		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_DELETE_BY_API.getName(), body);
+		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_DELETE_BY_API.getName(), body);*/
 		
 		return restResponse;
 	
@@ -3139,7 +3085,7 @@
 		Assert.assertEquals(responseCode, expectedResponseCode, "Response code is not correct.");
 		
 		
-		// Check auditing for upload operation
+		/*// Check auditing for upload operation
 		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
 		
 		AuditingActionEnum action = AuditingActionEnum.ARTIFACT_DELETE_BY_API;
@@ -3152,7 +3098,7 @@
 //		expectedExternalAudit.setRESOURCE_URL(expectedExternalAudit.getRESOURCE_URL()+ "/" + artifactUUID);
 		expectedExternalAudit.setRESOURCE_NAME(componentInstance.getNormalizedName());
 		expectedExternalAudit.setRESOURCE_URL("/sdc/v1/catalog/" + assetTypeEnum.getValue() + "/" + component.getUUID() + "/resourceInstances/" + componentInstance.getNormalizedName() + "/artifacts/" + artifactUUID);
-		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_DELETE_BY_API.getName(), body);
+		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_DELETE_BY_API.getName(), body);*/
 		component = AtomicOperationUtils.getComponentObject(component, UserRoleEnum.DESIGNER);
 		return restResponse;
 	}
@@ -3167,7 +3113,7 @@
 		Assert.assertEquals(responseCode, expectedResponseCode, "Response code is not correct.");
 		
 		
-		// Check auditing for upload operation
+		/*// Check auditing for upload operation
 		ArtifactDefinition responseArtifact = getArtifactDataFromJson(restResponse.getResponse());
 		
 		AuditingActionEnum action = AuditingActionEnum.ARTIFACT_DELETE_BY_API;
@@ -3178,7 +3124,7 @@
 		AssetTypeEnum assetTypeEnum = AssetTypeEnum.valueOf((component.getComponentType().getValue() + "s").toUpperCase());
 		ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalArtifactAuditSuccess(assetTypeEnum, action, responseArtifact, component);
 		expectedExternalAudit.setRESOURCE_URL(expectedExternalAudit.getRESOURCE_URL()+ "/" + artifactUUID);
-		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_DELETE_BY_API.getName(), body);
+		AuditValidationUtils.validateExternalAudit(expectedExternalAudit, AuditingActionEnum.ARTIFACT_DELETE_BY_API.getName(), body);*/
 		component = AtomicOperationUtils.getComponentObject(component, UserRoleEnum.DESIGNER); 
 		return restResponse;
 	}
@@ -3259,159 +3205,5 @@
 		return resourceDetails;
 	}
 	
-	
-	
-	
-	
-	protected String createUploadArtifactBodyJson() {
-		Map<String, Object> jsonBody = new HashMap<String, Object>();
-		jsonBody.put("artifactName", UPLOAD_ARTIFACT_NAME);
-		jsonBody.put("artifactDisplayName", "configure");
-		jsonBody.put("artifactType", "SHELL");
-		jsonBody.put("mandatory", "false");
-		jsonBody.put("description", "ff");
-		jsonBody.put("payloadData", UPLOAD_ARTIFACT_PAYLOAD);
-		jsonBody.put("artifactLabel", "configure");
-		return gson.toJson(jsonBody);
-	}
-	
-	protected ArtifactDefinition getArtifactDataFromJson(String content) {
-		JsonObject jsonElement = new JsonObject();
-		ArtifactDefinition resourceInfo = null;
-		
-		try {
-			Gson gson = new Gson();
-			jsonElement = gson.fromJson(content, jsonElement.getClass());
-			JsonElement artifactGroupValue = jsonElement.get(Constants.ARTIFACT_GROUP_TYPE_FIELD);
-			if (artifactGroupValue != null && !artifactGroupValue.isJsonNull()) {
-				String groupValueUpper = artifactGroupValue.getAsString().toUpperCase();
-				if (!ArtifactGroupTypeEnum.getAllTypes().contains(groupValueUpper)) {
-					StringBuilder sb = new StringBuilder();
-					for (String value : ArtifactGroupTypeEnum.getAllTypes()) {
-						sb.append(value).append(", ");
-					}
-					log.debug("artifactGroupType is {}. valid values are: {}", groupValueUpper, sb.toString());
-					return null;
-				} else {
-					jsonElement.remove(Constants.ARTIFACT_GROUP_TYPE_FIELD);
-					jsonElement.addProperty(Constants.ARTIFACT_GROUP_TYPE_FIELD, groupValueUpper);
-				}
-			}
-			String payload = null;
-			JsonElement artifactPayload = jsonElement.get(Constants.ARTIFACT_PAYLOAD_DATA);
-			if (artifactPayload != null && !artifactPayload.isJsonNull()) {
-				payload = artifactPayload.getAsString();
-			}
-			jsonElement.remove(Constants.ARTIFACT_PAYLOAD_DATA);
-			String json = gson.toJson(jsonElement);
-			ObjectMapper mapper = new ObjectMapper();
-			mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-			mapper.configure(Feature.FAIL_ON_EMPTY_BEANS, false);
-			mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
-			
-			resourceInfo = mapper.readValue(json, ArtifactDefinition.class);
-			resourceInfo.setPayloadData(payload);
 
-		} catch (Exception e) {
-			BeEcompErrorManager.getInstance().processEcompError(EcompErrorName.BeArtifactInformationInvalidError, "Artifact Upload / Update");
-			BeEcompErrorManager.getInstance().logBeArtifactInformationInvalidError("Artifact Upload / Update");
-			log.debug("Failed to convert the content {} to object.", content.substring(0, Math.min(50, content.length())), e);
-		}
-
-		return resourceInfo;
-	}
-	
-	protected HttpGet createGetRequest(String url) {
-		HttpGet httpGet = new HttpGet(url);
-		httpGet.addHeader(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		httpGet.addHeader(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
-		httpGet.addHeader(HttpHeaderEnum.USER_ID.getValue(), sdncUserDetails.getUserId());
-		return httpGet;
-	}
-	
-	protected String getArtifactUid(HttpResponse response) throws HttpResponseException, IOException, ParseException {
-		String responseString = new BasicResponseHandler().handleResponse(response);
-		JSONObject responseMap = (JSONObject) jsonParser.parse(responseString);
-		String artifactId = (String) responseMap.get("uniqueId");
-		return artifactId;
-	}
-	
-	protected String getArtifactEsId(HttpResponse response) throws HttpResponseException, IOException, ParseException {
-		String responseString = new BasicResponseHandler().handleResponse(response);
-		JSONObject responseMap = (JSONObject) jsonParser.parse(responseString);
-		String esId = (String) responseMap.get("EsId");
-		return esId;
-	}
-	
-	protected ArtifactDefinition addArtifactDataFromResponse(HttpResponse response, ArtifactDefinition artifact) throws HttpResponseException, IOException, ParseException {
-		//String responseString = new BasicResponseHandler().handleResponse(response);
-		HttpEntity entity = response.getEntity();
-		String responseString = EntityUtils.toString(entity);				
-		JSONObject responseMap = (JSONObject) jsonParser.parse(responseString);
-		artifact.setEsId((String)responseMap.get("esId"));
-		artifact.setUniqueId((String) responseMap.get("uniqueId"));
-		artifact.setArtifactGroupType(ArtifactGroupTypeEnum.findType((String) responseMap.get("artifactGroupType")));
-		artifact.setTimeout(((Long) responseMap.get("timeout")).intValue());
-		return artifact;
-	}
-	
-	protected String getLifecycleArtifactUid(CloseableHttpResponse response) throws HttpResponseException, IOException, ParseException {
-		String responseString = new BasicResponseHandler().handleResponse(response);
-		JSONObject responseMap = (JSONObject) jsonParser.parse(responseString);
-		responseMap = (JSONObject) responseMap.get("implementation");
-		String artifactId = (String) responseMap.get("uniqueId");
-		return artifactId;
-	}
-	
-	protected HttpDelete createDeleteArtifactRequest(String url) {
-		HttpDelete httpDelete = new HttpDelete(url);
-		httpDelete.addHeader(HttpHeaderEnum.USER_ID.getValue(), sdncUserDetails.getUserId());
-		httpDelete.addHeader(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
-		return httpDelete;
-	}
-	
-	protected HttpPost createPostAddArtifactRequeast(String jsonBody, String url, boolean addMd5Header) throws UnsupportedEncodingException {
-		HttpPost httppost = new HttpPost(url);
-		httppost.addHeader(HttpHeaderEnum.CONTENT_TYPE.getValue(), contentTypeHeaderData);
-		httppost.addHeader(HttpHeaderEnum.ACCEPT.getValue(), acceptHeaderDate);
-		httppost.addHeader(HttpHeaderEnum.USER_ID.getValue(), sdncUserDetails.getUserId());
-		if (addMd5Header) {
-			httppost.addHeader(HttpHeaderEnum.Content_MD5.getValue(), GeneralUtility.calculateMD5Base64EncodedByString(jsonBody));
-		}
-		StringEntity input = new StringEntity(jsonBody);
-		input.setContentType("application/json");
-		httppost.setEntity(input);
-		log.debug("Executing request {}" , httppost.getRequestLine());
-		return httppost;
-	}
-	
-	protected String createLoadArtifactBody() {
-		Map<String, Object> json = new HashMap<String, Object>();
-		json.put("artifactName", "install_apache2.sh");
-		json.put("artifactType", "SHELL");
-		json.put("description", "ddd");
-		json.put("payloadData", "UEsDBAoAAAAIAAeLb0bDQz");
-		json.put("artifactLabel", "name123");
-		
-		String jsonStr = gson.toJson(json);
-		return jsonStr;
-	}
-	
-	protected void checkDeleteResponse(RestResponse response) {
-		BaseRestUtils.checkStatusCode(response, "delete request failed", false, 204, 404);
-	}
-	
-	protected ArtifactUiDownloadData getArtifactUiDownloadData(String artifactUiDownloadDataStr) throws Exception {
-		
-		ObjectMapper mapper = new ObjectMapper();
-		try {
-			ArtifactUiDownloadData artifactUiDownloadData = mapper.readValue(artifactUiDownloadDataStr, ArtifactUiDownloadData.class);
-			return artifactUiDownloadData;
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
-
-	
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/DeploymentValiditaion.java b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/DeploymentValiditaion.java
index 07cb7d9..9e82a81 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/DeploymentValiditaion.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/DeploymentValiditaion.java
@@ -20,28 +20,10 @@
 
 package org.openecomp.sdc.externalApis;
 
-import static org.testng.AssertJUnit.assertTrue;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
+import com.aventstack.extentreports.Status;
 import org.apache.commons.io.FileUtils;
 import org.junit.Rule;
 import org.junit.rules.TestName;
-import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
 import org.openecomp.sdc.be.model.Resource;
@@ -50,12 +32,10 @@
 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
 import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
 import org.openecomp.sdc.ci.tests.datatypes.PropertyReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ResourceCategoryEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.general.AtomicOperationUtils;
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
-import org.openecomp.sdc.ci.tests.utils.rest.AssetRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.CatalogRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.CategoryRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
@@ -64,35 +44,35 @@
 import org.testng.annotations.Test;
 import org.yaml.snakeyaml.Yaml;
 
-import com.aventstack.extentreports.Status;
-
-
-
-
-
-
-
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.stream.Collectors;
+import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.AssertJUnit.assertTrue;
 public class DeploymentValiditaion extends ComponentBaseTest{
 
-
-	
-	
 	@Rule
 	public static TestName name = new TestName();
-
+// These tests should run in executable jar only on deployed environment
 	public DeploymentValiditaion() {
 		super(name, DeploymentValiditaion.class.getName());
 	}
-	
+
 	protected final static String categoryFilterKey = "category";
 	protected final static String subCategoryFilterKey = "subCategory";
 	protected  String attVersionStr ;
-	
-	
+	protected String pathPrefix;
+
+
 	 public static List<File> listf(String directoryName) {
 	        File directory = new File(directoryName);
 
-	        List<File> resultList = new ArrayList<File>();
+	        List<File> resultList = new ArrayList<>();
 
 	        // get all the files from a directory
 	        File[] fList = directory.listFiles();
@@ -106,40 +86,35 @@
 	        }
 	        //System.out.println(fList);
 	        return resultList;
-	    } 
+	    }
 	@BeforeTest
 	public void beforeTest() throws Exception{
 		RestResponse attVersion = CatalogRestUtils.getOsVersion();
 		attVersionStr = ResponseParser.getVersionFromResponse(attVersion);
+		pathPrefix = File.separator+"opt"+File.separator+"app"+File.separator+"asdc_kits"+File.separator+"catalog-be-"+attVersionStr+File.separator+"import"+File.separator+"tosca"+File.separator;
 	}
-	
-	
-	@Test
-	public void pasrseNormativies() throws Exception{
-		
-		
-		String path = "//apps//asdc_kits//catalog-be-" + attVersionStr + "//import//tosca//normative-types";
-		String path2 = "//apps//asdc_kits//catalog-be-" + attVersionStr + "//import//tosca//heat-types";
-				
-//		String path = "C:\\Git_work\\Git_UGN\\d2-sdnc\\catalog-be\\src\\main\\resources\\import\\tosca\\normative-types";
-//		String path2 = "C:\\Git_work\\Git_UGN\\d2-sdnc\\catalog-be\\src\\main\\resources\\import\\tosca\\heat-types";
 
-		
-		List<File> yamlList1 = getYamlFilesList(path);		
+	/*@Test
+	public void pasrseNormativies() throws Exception{
+
+
+		String path = pathPrefix+"normative-types";
+		String path2 = pathPrefix+"heat-types";
+
+		List<File> yamlList1 = getYamlFilesList(path);
 		List<String> nodeNamesFromYamlList1 = getNodeNamesFromYamlList(yamlList1);
-		List<File> yamlList2 = getYamlFilesList(path2);		
+		List<File> yamlList2 = getYamlFilesList(path2);
 		List<String> nodeNamesFromYamlList2 = getNodeNamesFromYamlList(yamlList2);
-		
-		
-		List<String> expectedList = new ArrayList<String>();
+
+
+		List<String> expectedList = new ArrayList<>();
 		expectedList.addAll(nodeNamesFromYamlList1);
 		expectedList.addAll(nodeNamesFromYamlList2);
 		System.out.println("list of normatives from files:::::::::::");
 		expectedList.forEach(System.out::println);
 		getExtendTest().log(Status.INFO, "list of normatives from files:");
 		getExtendTest().log(Status.INFO,expectedList.toString());
-		
-		
+
 		String[] filter = { categoryFilterKey + "=" + ResourceCategoryEnum.GENERIC_ABSTRACT.getCategory(), subCategoryFilterKey + "=" + ResourceCategoryEnum.GENERIC_ABSTRACT.getSubCategory() };
 		RestResponse assetResponse = AssetRestUtils.getComponentListByAssetType(true, AssetTypeEnum.RESOURCES);
 		Map<String, String> resourceAssetList = AssetRestUtils.getResourceAssetMap(assetResponse);
@@ -149,7 +124,7 @@
 		resourceToscaNamesList.forEach(System.out::println);
 		getExtendTest().log(Status.INFO, "list of normatives from APIs:");
 		getExtendTest().log(Status.INFO, resourceToscaNamesList.toString());
-		
+
 		boolean good = true;
 		List<String> missingNormatives =  new ArrayList<>();
 
@@ -157,23 +132,21 @@
 		    if (!resourceToscaNamesList.contains(expectedList.get(i))) {
 		        good = false;
 		        missingNormatives.add(expectedList.get(i));
-		        
-		        
 		    }
 		}
-		
+
 		System.out.println("<<<<<<<<<MISSING NORMATIVES>>>>>>");
 		missingNormatives.forEach(System.out::println);
 		getExtendTest().log(Status.INFO, "MISSING NORMATIVES:");
 		getExtendTest().log(Status.INFO, missingNormatives.toString());
-		
+
 		assertTrue("missing normatives ",  good);
-		
-	}
+
+	}*/
 
 
 	public List<String> getNodeNamesFromYamlList(List<File> yamlList) throws IOException {
-		List<String> nodeNameList = new ArrayList<String>();
+		List<String> nodeNameList = new ArrayList<>();
 
 		for (File file : yamlList) {
 		    String content = new String(Files.readAllBytes(Paths.get(file.getPath())), StandardCharsets.UTF_8);
@@ -190,7 +163,7 @@
 
 
 	public List<File> getYamlFilesList(String path) throws IOException {
-		List<File> yamlList = new ArrayList<File>();
+		List<File> yamlList = new ArrayList<>();
 		File dir = new File(path);
 		String[] extensions = new String[] { "yml" };
 		System.out.println("Getting all .yml files in " + dir.getCanonicalPath()
@@ -202,22 +175,13 @@
 		}
 		return yamlList;
 	}
-	
 
-	
-	
-
-	
 	@Test (enabled=false)
 	public void testYaml() throws IOException{
-		
-		System.out.println("");
-		
-		File file = new File("\\\\Comp-1\\FileIO\\Stop.txt");
-		
-		
-		//read file
 
+		System.out.println("");
+
+		File file = new File("\\\\Comp-1\\FileIO\\Stop.txt");
 
 		Map<String, byte[]> readZip = null;
 		Path path = Paths.get("C:\\Users\\ys9693\\Documents\\csar\\attributesWithProporties\\attributesWithProporties.csar");
@@ -229,117 +193,89 @@
 
 		byte[] artifactsBs = readZip.get("Definitions/VF_RI2_G6.yaml");
 		String str = new String(artifactsBs, StandardCharsets.UTF_8);
-		
-				
 
-		
 		Yaml yaml = new Yaml();
 		Map<String, Object> load = (Map<String, Object>) yaml.load(str);
 		Map<String, Object> topology_template = (Map<String, Object>) load.get("topology_template");
 		Map<String, Object> node_templates = (Map<String, Object>) topology_template.get("node_templates");
-		
+
 		Set<String> keySet = node_templates.keySet();
 	}
-	
-	
-	
+
+
+
 	@Test
 	public void pasrseDataTypes() throws Exception{
-		
-//		String path = "C:\\Git_work\\Git_UGN\\d2-sdnc\\catalog-be\\src\\main\\resources\\import\\tosca\\data-types\\dataTypes.yml";
-		String path = "//apps//asdc_kits//catalog-be-" + attVersionStr + "//import//tosca//data-types//dataTypes.yml";
-		
+
+		String path = pathPrefix+"data-types"+File.separator+"dataTypes.yml";
 	    String content = new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8);
-		
-				
+
 		Yaml yaml = new Yaml();
 		Map<String, Object> load = (Map<String, Object>) yaml.load(content);
-		List<String> listOfDataTypes = new ArrayList<String>();
+		List<String> listOfDataTypes = new ArrayList<>();
 		listOfDataTypes.addAll(load.keySet());
 		System.out.println("<<<<<<<< List of Data Types >>>>>>>>>");
 		listOfDataTypes.forEach(System.out::println);
 		getExtendTest().log(Status.INFO, "List of Data Types:");
 		getExtendTest().log(Status.INFO, listOfDataTypes.toString());
-				
+
 		Resource resource = AtomicOperationUtils.createResourceByType(ResourceTypeEnum.VF, UserRoleEnum.DESIGNER, true).left().value();
 		PropertyReqDetails defaultProperty = ElementFactory.getDefaultListProperty();
-		
-//		SchemaDefinition schemaDefinition = new SchemaDefinition();
-		
-		
-		
-	
+
 		defaultProperty.setPropertyDefaultValue(null);
-//		defaultProperty.setSchema(schemaDefinition);
-		
-		
-//		listOfDataTypes.remove("tosca.datatypes.Root");
 		for (String dataType : listOfDataTypes) {
-//			if (dataType.equals("map") ||  dataType.equals("list")){ 
 			defaultProperty.setPropertyType(dataType);
 			defaultProperty.setName(dataType);
 			System.out.println("Adding proporty with data type: ----> " + dataType);
 			getExtendTest().log(Status.INFO, "Adding proporty with data type: ----> " + dataType);
 			AtomicOperationUtils.addCustomPropertyToResource(defaultProperty, resource, UserRoleEnum.DESIGNER, true);
-//			}
 		}
 
-		
 		listOfDataTypes.forEach(System.out::println);
-	
+
 	}
-		
-
-
-
-
 
 	@Test
 	public void pasrseCategories() throws Exception{
-		
-//		String path = "C:\\Git_work\\Git_UGN\\d2-sdnc\\catalog-be\\src\\main\\resources\\import\\tosca\\categories\\categoryTypes.yml";
-		String path = "//apps//asdc_kits//catalog-be-" + attVersionStr + "//import//tosca//categories//categoryTypes.yml";
-		
+
+		String path = pathPrefix+"categories"+File.separator+"categoryTypes.yml";
 	    String content = new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8);
-		
-		List<String> serviceCategories = new ArrayList<String>();
-		List<String> resourceCategories = new ArrayList<String>();
-				
+
+		List<String> serviceCategories = new ArrayList<>();
+		List<String> resourceCategories = new ArrayList<>();
+
 		Yaml yaml = new Yaml();
 		Map<String, Object> load = (Map<String, Object>) yaml.load(content);
 		Map<String, Map> services = (Map<String, Map>) load.get("services");
 		Map<String, Map> resources = (Map<String, Map>) load.get("resources");
-		
-		Map<String, List<String>> resourcesListFromFile = new HashMap<String, List<String>>() ;
-				
+
+		Map<String, List<String>> resourcesListFromFile = new HashMap<>() ;
+
 		//retrieve subcategories
 		for ( String resourceCategoryName : resources.keySet()) {
 			Map<String, Map> subcategory = (Map) resources.get(resourceCategoryName).get("subcategories");
-				
+
 			resourceCategories = new ArrayList<String>();
-			for (String subcategoryName : subcategory.keySet()) {	
+			for (String subcategoryName : subcategory.keySet()) {
 				String name = (String) subcategory.get(subcategoryName).get("name");
-//				resourceCategories.add(name.replaceAll("\\s",""));
 				resourceCategories.add(name);
-							
 			}
-			resourcesListFromFile.put(resources.get(resourceCategoryName).get("name").toString(), resourceCategories);	
-		}		
-		
+			resourcesListFromFile.put(resources.get(resourceCategoryName).get("name").toString(), resourceCategories);
+		}
+
 			System.out.println(resourcesListFromFile.toString());
 			getExtendTest().log(Status.INFO, "Expected categories:");
 			getExtendTest().log(Status.INFO, resourcesListFromFile.toString());
-			
-		//retrieve service categories 	
+
+		//retrieve service categories
 //		for ( String serviceCategoryName : services.keySet()) {
 //			String name = (String) services.get(serviceCategoryName).get("name");
 //			serviceCategories.add(name);
 //				}	
 //		serviceCategories.forEach(System.out::println);
-			
-			
+
 			//retrieve resource list from URL
-			
+
 			Map<String, List<CategoryDefinition>> categoriesMap = getCategories();
 			List<CategoryDefinition> resourceSubCategories = categoriesMap.get(ComponentTypeEnum.RESOURCE_PARAM_NAME);
 			List<SubCategoryDefinition> subcategories;
@@ -347,80 +283,69 @@
 				subcategories =  categoryDefinition.getSubcategories();
 			}
 //			subcategories.stream().collect(toMap(i -> i, i -> items.get(i)));
-			
+
 //			resourceSubCategories.stream().collect(
 //	                Collectors.groupingBy(CategoryDefinition::getName, Collectors.groupingBy(SubCategoryDefinition::getName)));
-			
+
 //			resourceSubCategories.stream().filter(p->p.getSubcategories()).map(m->m.getName()).collect(Collectors.toList()).collect(Collectors.toMap(CategoryDefinition::getName,m));
-			
-			
+
+
 			Map<String, List<String>> resourceMapFromUrl = resourceSubCategories.stream().collect(Collectors.toMap( e -> e.getName() , e -> e.getSubcategories().stream().map(e1 -> e1.getName()).collect(Collectors.toList())));
-			
+
 			getExtendTest().log(Status.INFO, "Actual categories:");
 			getExtendTest().log(Status.INFO, resourceMapFromUrl.toString());
-			
-			
-			assertTrue("missing categories ", resourceMapFromUrl.keySet().containsAll(resourcesListFromFile.keySet()));
-			
-			
 
-			
-			
+
+			assertTrue("missing categories ", resourceMapFromUrl.keySet().containsAll(resourcesListFromFile.keySet()));
 
 	}
-	
-	
+
+
 	public Map<String, List<CategoryDefinition>> getCategories() throws Exception {
-		
+
 		User defaultAdminUser = ElementFactory.getDefaultUser(UserRoleEnum.ADMIN);
-		
+
 		Map<String,List<CategoryDefinition>> map = new HashMap<String,List<CategoryDefinition>>();
-				
-		
+
+
 		RestResponse allResourceCategories = CategoryRestUtils.getAllCategories(defaultAdminUser, ComponentTypeEnum.RESOURCE_PARAM_NAME);
 		RestResponse allServiceCategories = CategoryRestUtils.getAllCategories(defaultAdminUser, ComponentTypeEnum.SERVICE_PARAM_NAME);
 
 		List<CategoryDefinition> parsedResourceCategories = ResponseParser.parseCategories(allResourceCategories);
 		List<CategoryDefinition> parsedServiceCategories = ResponseParser.parseCategories(allServiceCategories);
-		
+
 		map.put(ComponentTypeEnum.RESOURCE_PARAM_NAME, parsedResourceCategories);
 		map.put(ComponentTypeEnum.SERVICE_PARAM_NAME, parsedServiceCategories);
-		
+
 		return map;
 	}
-	
 
 
-	@Test (enabled=false)
+
+/*	@Test (enabled=false)
 	public void pasrseCategoriesClass2() throws IOException{
-		
+
 		String path = "C:\\Git_work\\Git_UGN\\d2-sdnc\\catalog-be\\src\\main\\resources\\import\\tosca\\categories\\categoryTypes.yml";
 
 		FileReader reader = new FileReader(path);
 		Yaml yaml=new Yaml();
-		
-		
+
+
 		Map<?, ?> map = (Map<?, ?>) yaml.load(reader);
-		
+
 		Collection<Map> values = (Collection<Map>) map.values();
 		for (Map map2 : values) {
 			Collection values2 = map2.values();
 			for (Object object : values2) {
-				
-				
+
+
 			}
 		}
-			
-		{
-			
-		}
+
 		List<Object> collect = values.stream().map(e -> e.get("name")).collect(Collectors.toList());
-		
+
 //		resourcesArrayList.stream().filter(s -> s.getName().toLowerCase().startsWith("ci") && !s.getName().toLowerCase().equals("cindervolume")).map(e -> e.getUniqueId()).collect(Collectors.toList()).forEach((i)
-		
-		
-		
-		
-	}
+
+	}*/
 
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetAssetServlet.java b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetAssetServlet.java
index fdef535..9db9e8a 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetAssetServlet.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetAssetServlet.java
@@ -20,21 +20,14 @@
 
 package org.openecomp.sdc.externalApis;
 
-import static org.testng.AssertJUnit.assertEquals;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import com.google.gson.Gson;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.io.IOUtils;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.Rule;
 import org.junit.rules.TestName;
 import org.openecomp.sdc.be.datatypes.elements.ConsumerDataDefinition;
@@ -45,35 +38,26 @@
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
 import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
 import org.openecomp.sdc.ci.tests.api.Urls;
-import org.openecomp.sdc.ci.tests.datatypes.ArtifactReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceAssetStructure;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ServiceAssetStructure;
-import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
+import org.openecomp.sdc.ci.tests.datatypes.*;
 import org.openecomp.sdc.ci.tests.datatypes.enums.ArtifactTypeEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.LifeCycleStatesEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
-import org.openecomp.sdc.ci.tests.datatypes.expected.ExpectedExternalAudit;
 import org.openecomp.sdc.ci.tests.datatypes.http.HttpHeaderEnum;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.Utils;
 import org.openecomp.sdc.ci.tests.utils.general.AtomicOperationUtils;
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
-import org.openecomp.sdc.ci.tests.utils.rest.ArtifactRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.AssetRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
-import org.openecomp.sdc.ci.tests.utils.rest.ServiceRestUtils;
-import org.openecomp.sdc.ci.tests.utils.validation.AuditValidationUtils;
+import org.openecomp.sdc.ci.tests.utils.rest.*;
 import org.openecomp.sdc.common.api.Constants;
-import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
 import org.testng.annotations.Test;
 
-import com.google.gson.Gson;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.AssertJUnit.assertEquals;
 
 public class GetAssetServlet extends ComponentBaseTest {
 
@@ -102,78 +86,52 @@
 
 //		CassandraUtils.truncateAllKeyspaces();
 		List<String> expectedAssetNamesList = new ArrayList<>();
+		ResourceReqDetails resourceDetails = ElementFactory.getDefaultResourceByType(ResourceTypeEnum.VF, sdncUserDetails);
+		Resource resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		expectedAssetNamesList.add(resourceDetails.getName());
 
-		ResourceReqDetails resourceDetails = ElementFactory.getDefaultResource();
-		resourceDetails.setName("ciResource1");
-		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-		RestResponse createResource = ResourceRestUtils.createResource(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createResource);
-		Resource resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
-		expectedAssetNamesList.add(resource.getName());
-
-		resourceDetails.setName("ciResource2");
-		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-		createResource = ResourceRestUtils.createResource(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createResource);
-		resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
+		resourceDetails = ElementFactory.getDefaultResourceByType(ResourceTypeEnum.VF, sdncUserDetails);
+		resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-		expectedAssetNamesList.add(resource.getName());
-		expectedAssetNamesList.add(resource.getName());
+		expectedAssetNamesList.add(resourceDetails.getName());
 
-		resourceDetails.setName("ciResource3");
-		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-		createResource = ResourceRestUtils.createResource(resourceDetails,
-				ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createResource);
-		resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
+		resourceDetails = ElementFactory.getDefaultResourceByType(ResourceTypeEnum.VF, sdncUserDetails);
+		resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-		expectedAssetNamesList.add(resource.getName());
+		expectedAssetNamesList.add(resourceDetails.getName());
 
-		resourceDetails.setName("ciResource4");
-		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-		createResource = ResourceRestUtils.createResource(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createResource);
-		resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
+		resourceDetails = ElementFactory.getDefaultResourceByType(ResourceTypeEnum.VF, sdncUserDetails);
+		resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-		expectedAssetNamesList.add(resource.getName());
+		expectedAssetNamesList.add(resourceDetails.getName());
 
-		resourceDetails.setName("ciResource5");
-		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-		createResource = ResourceRestUtils.createResource(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createResource);
-		resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
+		resourceDetails = ElementFactory.getDefaultResourceByType(ResourceTypeEnum.VF, sdncUserDetails);
+		resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-		expectedAssetNamesList.add(resource.getName());
+		expectedAssetNamesList.add(resourceDetails.getName());
 
-		resourceDetails.setName("ciResource6");
-		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-		createResource = ResourceRestUtils.createResource(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createResource);
-		resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
+		resourceDetails = ElementFactory.getDefaultResourceByType(ResourceTypeEnum.VF, sdncUserDetails);
+		resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.STARTCERTIFICATION, true).getLeft();
-		expectedAssetNamesList.add(resource.getName());
+		expectedAssetNamesList.add(resourceDetails.getName());
 
-		resourceDetails.setName("ciResource7");
-		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-		createResource = ResourceRestUtils.createResource(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createResource);
-		resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
+		resourceDetails = ElementFactory.getDefaultResourceByType(ResourceTypeEnum.VF, sdncUserDetails);
+		resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFICATIONREQUEST, true).getLeft();
-		expectedAssetNamesList.add(resource.getName());
-		expectedAssetNamesList.add(resource.getName());
+		expectedAssetNamesList.add(resourceDetails.getName());
 
 		System.out.println("7 VF resources were created");
 
@@ -186,11 +144,11 @@
 
 		AssetRestUtils.checkComponentTypeInObjectList(resourceAssetList, ComponentTypeEnum.RESOURCE);
 
-		// Validate audit message
+	/*	// Validate audit message
 		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_ASSET_LIST);
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
         body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_LIST.getName(), body);
+        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_LIST.getName(), body);*/
 
 	}
 
@@ -202,76 +160,59 @@
 		ArtifactReqDetails artifactDetails = ElementFactory.getArtifactByType(ArtifactTypeEnum.OTHER, ArtifactTypeEnum.OTHER, true);
 
 		ServiceReqDetails serviceDetails = ElementFactory.getDefaultService();
-		serviceDetails.setName("ciService1");
-		RestResponse createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createService);
-		Service service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
-		expectedAssetNamesList.add(service.getName());
+		Service service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		expectedAssetNamesList.add(serviceDetails.getName());
 
-		serviceDetails.setName("ciService2");
-		createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createService);
-		service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		RestResponse addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
 		BaseRestUtils.checkSuccess(addInformationalArtifactToService);
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-		expectedAssetNamesList.add(service.getName());
-		expectedAssetNamesList.add(service.getName());
+		expectedAssetNamesList.add(serviceDetails.getName());
 
-		serviceDetails.setName("ciService3");
-		createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createService);
-		service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
 		BaseRestUtils.checkSuccess(addInformationalArtifactToService);
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-		expectedAssetNamesList.add(service.getName());
+		expectedAssetNamesList.add(serviceDetails.getName());
 
-		serviceDetails.setName("ciService4");
-		createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createService);
-		service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-		expectedAssetNamesList.add(service.getName());
+		expectedAssetNamesList.add(serviceDetails.getName());
 
-		serviceDetails.setName("ciService5");
-		createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createService);
-		service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-		expectedAssetNamesList.add(service.getName());
+		expectedAssetNamesList.add(serviceDetails.getName());
 
-		serviceDetails.setName("ciService6");
-		createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createService);
-		service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
 		BaseRestUtils.checkSuccess(addInformationalArtifactToService);
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.STARTCERTIFICATION, true).getLeft();
-		expectedAssetNamesList.add(service.getName());
+		expectedAssetNamesList.add(serviceDetails.getName());
 
-		serviceDetails.setName("ciService7");
-		createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-		BaseRestUtils.checkCreateResponse(createService);
-		service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
 		BaseRestUtils.checkSuccess(addInformationalArtifactToService);
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFICATIONREQUEST, true).getLeft();
-		expectedAssetNamesList.add(service.getName());
-		expectedAssetNamesList.add(service.getName());
+		expectedAssetNamesList.add(serviceDetails.getName());
 
 		System.out.println("7 Services were created");
 
@@ -282,24 +223,20 @@
 		List<String> getActualAssetNamesList = AssetRestUtils.getServiceNamesList(serviceAssetList);
 		Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
 
-		// Validate audit message
+		/*// Validate audit message
 		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.SERVICES, AuditingActionEnum.GET_ASSET_LIST);
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
         body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_LIST.getName(), body);
+        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_LIST.getName(), body);*/
 
 	}
 
-	@Test
+	@Test(enabled = false)
 	public void getToscaModelSuccess() throws Exception {
 
 		CloseableHttpClient httpclient = HttpClients.createDefault();
-		ResourceReqDetails resourceDetails = ElementFactory.getDefaultResource();
-//		resourceDetails.setName("ciResource11");
-		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-		RestResponse createResource = ResourceRestUtils.createResource(resourceDetails, sdncUserDetails);
-		BaseRestUtils.checkCreateResponse(createResource);
-		Resource resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
+		ResourceReqDetails resourceDetails = ElementFactory.getDefaultResourceByType(ResourceTypeEnum.VF, sdncUserDetails);
+		Resource resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
 		HttpResponse assetResponse = AssetRestUtils.getComponentToscaModel(AssetTypeEnum.RESOURCES, resource.getUUID());
 		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 		String artId = resource.getToscaArtifacts().get("assettoscacsar").getEsId();
@@ -320,6 +257,7 @@
 				.append(artifactUiDownloadData.getArtifactName()).append("\"").toString());
 	}
 
+
 	private HttpGet createGetRequest(String url) {
 		HttpGet httpGet = new HttpGet(url);
 		httpGet.addHeader(HttpHeaderEnum.USER_ID.getValue(), sdncUserDetails.getUserId());
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetCSARofVF.java b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetCSARofVF.java
index 7ab35b7..fbbd394 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetCSARofVF.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetCSARofVF.java
@@ -20,40 +20,32 @@
 
 package org.openecomp.sdc.externalApis;
 
-import static org.testng.AssertJUnit.assertTrue;
+import org.junit.Rule;
+import org.junit.rules.TestName;
+import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.Service;
+import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
+import org.openecomp.sdc.ci.tests.datatypes.enums.ArtifactTypeEnum;
+import org.openecomp.sdc.ci.tests.datatypes.enums.LifeCycleStatesEnum;
+import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
+import org.openecomp.sdc.ci.tests.utils.general.AtomicOperationUtils;
+import org.openecomp.sdc.ci.tests.utils.rest.AssetRestUtils;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Enumeration;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipException;
 import java.util.zip.ZipFile;
 
-import org.junit.Rule;
-import org.junit.rules.TestName;
-import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
-import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
-import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
-import org.openecomp.sdc.be.model.Component;
-import org.openecomp.sdc.be.model.Resource;
-import org.openecomp.sdc.be.model.Service;
-import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
-import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ArtifactTypeEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.LifeCycleStatesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
-import org.openecomp.sdc.ci.tests.datatypes.expected.ExpectedExternalAudit;
-import org.openecomp.sdc.ci.tests.utils.general.AtomicOperationUtils;
-import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
-import org.openecomp.sdc.ci.tests.utils.rest.AssetRestUtils;
-import org.openecomp.sdc.ci.tests.utils.validation.AuditValidationUtils;
-import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import static org.testng.AssertJUnit.assertTrue;
 
 public class GetCSARofVF extends ComponentBaseTest {
 
@@ -86,16 +78,14 @@
 		Resource resource = AtomicOperationUtils.createResourceByType(ResourceTypeEnum.VF, UserRoleEnum.DESIGNER, true).left().value();
 		
 //		HttpResponse componentToscaModel = AssetRestUtils.getComponentToscaModel(AssetTypeEnum.RESOURCES, resource.getUUID());
-		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.RESOURCES, resource.getUUID(), "");
+		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.RESOURCES, resource.getUUID());
 		
 		// validate tosca structure  
 		validateCsarContent(resource, toscaModelCsarFile);
 	
-		// Validate audit message
-		validateAudit(resource);
-		
-		
-		
+	/*	// Validate audit message
+		validateAudit(resource);*/
+
 	}
 
 
@@ -108,16 +98,14 @@
 		AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true);
 		
 //		HttpResponse componentToscaModel = AssetRestUtils.getComponentToscaModel(AssetTypeEnum.RESOURCES, resource.getUUID());
-		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.RESOURCES, resource.getUUID(), "");
+		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.RESOURCES, resource.getUUID());
 		
 		// validate tosca structure  
 		validateCsarContent(resource, toscaModelCsarFile);
 	
-		// Validate audit message
-		validateAudit(resource);
-		
-		
-		
+		/*// Validate audit message
+		validateAudit(resource);*/
+
 	}
 	
 	@Test
@@ -128,15 +116,14 @@
 		AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true);
 		
 //		HttpResponse componentToscaModel = AssetRestUtils.getComponentToscaModel(AssetTypeEnum.RESOURCES, resource.getUUID());
-		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.RESOURCES, resource.getUUID(), "");
+		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.RESOURCES, resource.getUUID());
 		
 		// validate tosca structure  
 		validateCsarContent(resource, toscaModelCsarFile);
 	
-		// Validate audit message
-		validateAudit(resource);
-		
-		
+		/*// Validate audit message
+		validateAudit(resource);*/
+
 	}
 	
 	
@@ -146,15 +133,13 @@
 		Service service = AtomicOperationUtils.createDefaultService(UserRoleEnum.DESIGNER, true).left().value();
 		
 //		HttpResponse componentToscaModel = AssetRestUtils.getComponentToscaModel(AssetTypeEnum.RESOURCES, resource.getUUID());
-		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.SERVICES, service.getUUID(), "");
+		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.SERVICES, service.getUUID());
 		
 		// validate tosca structure  
 		validateCsarContent(service, toscaModelCsarFile);
 	
-		validateAudit(service);
-		
-		
-		
+		/*validateAudit(service);*/
+
 	}
 	
 	@Test
@@ -165,14 +150,13 @@
 		AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true);
 		
 //		HttpResponse componentToscaModel = AssetRestUtils.getComponentToscaModel(AssetTypeEnum.RESOURCES, resource.getUUID());
-		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.SERVICES, service.getUUID(), "");
+		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.SERVICES, service.getUUID());
 		
 		// validate tosca structure  
 		validateCsarContent(service, toscaModelCsarFile);
 	
-		validateAudit(service);
-		
-		
+		/*validateAudit(service);*/
+
 	}
 	
 	@Test
@@ -183,12 +167,12 @@
 		AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true);
 		
 //		HttpResponse componentToscaModel = AssetRestUtils.getComponentToscaModel(AssetTypeEnum.RESOURCES, resource.getUUID());
-		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.SERVICES, service.getUUID(), "");
+		File toscaModelCsarFile = AssetRestUtils.getToscaModelCsarFile(AssetTypeEnum.SERVICES, service.getUUID());
 		
 		// validate tosca structure  
 		validateCsarContent(service, toscaModelCsarFile);
 	
-		validateAudit(service);
+		/*validateAudit(service);*/
 		
 	}
 	
@@ -230,7 +214,7 @@
 		assertTrue("missing files in csar template definitions folder", expectedDefinitionFolderFileList.size() == 0);
 	}
 	
-	public void validateAudit(Component resource) throws Exception {
+	/*public void validateAudit(Component resource) throws Exception {
 		ExpectedExternalAudit expectedAudit = null;
 		if (resource.getComponentType().equals(ComponentTypeEnum.RESOURCE)){
 		expectedAudit = ElementFactory.getDefaultExternalAuditObject(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_TOSCA_MODEL, ("/" + resource.getUUID() + "/toscaModel"));
@@ -245,6 +229,6 @@
         body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, expectedAudit.getRESOURCE_NAME());
         AuditValidationUtils.validateExternalAudit(expectedAudit, AuditingActionEnum.GET_TOSCA_MODEL.getName(), body);
 
-	}
+	}*/
 	
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetFilteredAssetServlet.java b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetFilteredAssetServlet.java
index 70d8ef5..57a0f26 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetFilteredAssetServlet.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetFilteredAssetServlet.java
@@ -20,15 +20,6 @@
 
 package org.openecomp.sdc.externalApis;
 
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertNotNull;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import org.junit.Rule;
 import org.junit.rules.TestName;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
@@ -37,40 +28,27 @@
 import org.openecomp.sdc.be.model.DistributionStatusEnum;
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.Service;
-import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
 import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
-import org.openecomp.sdc.ci.tests.datatypes.ArtifactReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceAssetStructure;
-import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.ServiceAssetStructure;
-import org.openecomp.sdc.ci.tests.datatypes.ServiceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ArtifactTypeEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ErrorInfo;
-import org.openecomp.sdc.ci.tests.datatypes.enums.LifeCycleStatesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.NormativeTypesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ResourceCategoryEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ServiceCategoriesEnum;
-import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
-import org.openecomp.sdc.ci.tests.datatypes.expected.ExpectedExternalAudit;
+import org.openecomp.sdc.ci.tests.datatypes.*;
+import org.openecomp.sdc.ci.tests.datatypes.enums.*;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.Utils;
 import org.openecomp.sdc.ci.tests.utils.general.AtomicOperationUtils;
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
-import org.openecomp.sdc.ci.tests.utils.rest.ArtifactRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.AssetRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.BaseRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.LifecycleRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtils;
-import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
-import org.openecomp.sdc.ci.tests.utils.rest.ServiceRestUtils;
-import org.openecomp.sdc.ci.tests.utils.validation.AuditValidationUtils;
+import org.openecomp.sdc.ci.tests.utils.rest.*;
 import org.openecomp.sdc.ci.tests.utils.validation.ErrorValidationUtils;
 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
-import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.annotations.Test;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertNotNull;
+
 public class GetFilteredAssetServlet extends ComponentBaseTest {
 
 	private static Logger log = LoggerFactory.getLogger(GetAssetServlet.class.getName());
@@ -115,12 +93,8 @@
 		List<String> getActualAssetNamesList = AssetRestUtils.getResourceNamesList(resourceAssetList);
 		Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateSuccessAudit(filter, AssetTypeEnum.RESOURCES);*/
 
 	}
 
@@ -145,12 +119,8 @@
 		List<String> getActualAssetNamesList = AssetRestUtils.getServiceNamesList(resourceAssetList);
 		Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateSuccessAudit(filter, AssetTypeEnum.RESOURCES);*/
 	}
 
 	@Test // (enabled = false)
@@ -169,12 +139,8 @@
 		List<String> getActualAssetNamesList = AssetRestUtils.getServiceNamesList(resourceAssetList);
 		Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateSuccessAudit(filter, AssetTypeEnum.RESOURCES);*/
 	}
 
 	// Failure
@@ -192,14 +158,8 @@
 		List<String> variables = Arrays.asList(resourceKey, categoryFilterKey, "NotExistingCategory");
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND.name(), variables, assetResponse.getResponse());
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		expectedAssetListAudit.setSTATUS(errorInfo.getCode().toString());
-		expectedAssetListAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFailureAudit(filter, errorInfo, variables, AssetTypeEnum.RESOURCES)*/;
 	}
 
 	@Test // (enabled = false)
@@ -216,14 +176,8 @@
 		List<String> variables = Arrays.asList("Resource", "NotExistingSubCategory", ResourceCategoryEnum.GENERIC_ABSTRACT.getCategory());
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.COMPONENT_SUB_CATEGORY_NOT_FOUND_FOR_CATEGORY.name(), variables, assetResponse.getResponse());
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		expectedAssetListAudit.setSTATUS(errorInfo.getCode().toString());
-		expectedAssetListAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFailureAudit(filter, errorInfo, variables, AssetTypeEnum.RESOURCES);*/
 	}
 
 	@Test // (enabled = false)
@@ -240,14 +194,8 @@
 		List<String> variables = Arrays.asList(resourceKey, categoryFilterKey, "NotExistingCategory");
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND.name(), variables, assetResponse.getResponse());
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		expectedAssetListAudit.setSTATUS(errorInfo.getCode().toString());
-		expectedAssetListAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFailureAudit(filter, errorInfo, variables, AssetTypeEnum.RESOURCES);*/
 	}
 
 	@Test // (enabled = false)
@@ -264,14 +212,8 @@
 		List<String> variables = Arrays.asList(subCategoryFilterKey + "1", validFilterParameters);
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.INVALID_FILTER_KEY.name(), variables, assetResponse.getResponse());
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		expectedAssetListAudit.setSTATUS(errorInfo.getCode().toString());
-		expectedAssetListAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFailureAudit(filter, errorInfo, variables, AssetTypeEnum.RESOURCES);*/
 	}
 
 	// ---------------------------------------------------------------------------------------------------------
@@ -292,12 +234,8 @@
 		List<String> getActualAssetNamesList = AssetRestUtils.getServiceNamesList(serviceAssetList);
 		Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.SERVICES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateSuccessAudit(filter, AssetTypeEnum.SERVICES);*/
 	}
 
 	@Test // (enabled = false)
@@ -321,12 +259,8 @@
 		List<String> getActualAssetNamesList = AssetRestUtils.getServiceNamesList(serviceAssetList);
 		Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.SERVICES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateSuccessAudit(filter, AssetTypeEnum.SERVICES);*/
 	}
 
 	@Test // (enabled = false)
@@ -350,12 +284,8 @@
 		List<String> getActualAssetNamesList = AssetRestUtils.getServiceNamesList(serviceAssetList);
 		Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.SERVICES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateSuccessAudit(filter, AssetTypeEnum.SERVICES);*/
 	}
 
 	// Failure
@@ -373,14 +303,8 @@
 		List<String> variables = Arrays.asList(serviceKey, categoryFilterKey, "NotExistingCategory");
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND.name(), variables, assetResponse.getResponse());
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.SERVICES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		expectedAssetListAudit.setSTATUS(errorInfo.getCode().toString());
-		expectedAssetListAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFailureAudit(filter, errorInfo, variables, AssetTypeEnum.SERVICES);*/
 	}
 
 	@Test // (enabled = false)
@@ -396,14 +320,8 @@
 		List<String> variables = Arrays.asList(serviceKey, distributionStatusFilterKey, "NotExistingDistributionStatus");
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND.name(), variables, assetResponse.getResponse());
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.SERVICES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		expectedAssetListAudit.setSTATUS(errorInfo.getCode().toString());
-		expectedAssetListAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFailureAudit(filter, errorInfo, variables, AssetTypeEnum.SERVICES);*/
 	}
 
 	@Test // (enabled = false)
@@ -420,14 +338,8 @@
 		List<String> variables = Arrays.asList(serviceKey, distributionStatusFilterKey, "NotExistingDistributionStatus");
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND.name(), variables, assetResponse.getResponse());
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.SERVICES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		expectedAssetListAudit.setSTATUS(errorInfo.getCode().toString());
-		expectedAssetListAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFailureAudit(filter, errorInfo, variables, AssetTypeEnum.SERVICES);*/
 	}
 
 	@Test // (enabled = false)
@@ -444,14 +356,8 @@
 		List<String> variables = Arrays.asList(serviceKey, categoryFilterKey, "NotExistingCategory");
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.COMPONENT_CATEGORY_NOT_FOUND.name(), variables, assetResponse.getResponse());
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.SERVICES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		expectedAssetListAudit.setSTATUS(errorInfo.getCode().toString());
-		expectedAssetListAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFailureAudit(filter, errorInfo, variables, AssetTypeEnum.SERVICES);*/
 	}
 
 	@Test // (enabled = false)
@@ -468,14 +374,8 @@
 		List<String> variables = Arrays.asList(distributionStatusFilterKey + "1", "[" + categoryFilterKey + ", " + distributionStatusFilterKey + "]");
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.INVALID_FILTER_KEY.name(), variables, assetResponse.getResponse());
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(AssetTypeEnum.SERVICES, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
-		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
-		expectedAssetListAudit.setSTATUS(errorInfo.getCode().toString());
-		expectedAssetListAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFailureAudit(filter, errorInfo, variables, AssetTypeEnum.SERVICES);*/
 
 	}
 	
@@ -486,226 +386,206 @@
 		RestResponse assetResponse = AssetRestUtils.getFilteredComponentList(AssetTypeEnum.RESOURCES, query);
 		BaseRestUtils.checkErrorResponse(assetResponse, ActionStatus.COMPONENT_CATEGORY_NOT_FOUND, "resource", "category", "Application L3+");
 
-		// Validate audit message
+		/*// Validate audit message
 		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getFilteredAssetListAuditCategoryNotFound(AssetTypeEnum.RESOURCES, "?" + query, "Application L3+");
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
         body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);*/
 
 	}
 	
-		@Test
-		public void getFilteredResourceAssetSuccess() throws Exception {
+	@Test
+	public void getFilteredResourceAssetSuccess() throws Exception {
 
-			List<String> expectedAssetNamesList = new ArrayList<>();
+		List<String> expectedAssetNamesList = new ArrayList<>();
 
-			ResourceReqDetails resourceDetails = ElementFactory.getDefaultResource(ResourceCategoryEnum.APPLICATION_L4_APP_SERVER);
-//			resourceDetails.setName("ciResource11");
-			resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-			RestResponse createResource = ResourceRestUtils.createResource(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createResource);
-			Resource resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
-			expectedAssetNamesList.add(resource.getName());
+		ResourceReqDetails resourceDetails = ElementFactory.getDefaultResource(ResourceCategoryEnum.APPLICATION_L4_APP_SERVER);
+		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
+		Resource resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		expectedAssetNamesList.add(resource.getName());
 
-			resourceDetails = ElementFactory.getDefaultResource(ResourceCategoryEnum.APPLICATION_L4_BORDER);
-//			resourceDetails.setName("ciResource22");
-			resourceDetails.setResourceType(ResourceTypeEnum.VFC.name());
-			createResource = ResourceRestUtils.createResource(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createResource);
-			resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
-			resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-			resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-			resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
+		resourceDetails = ElementFactory.getDefaultResource(ResourceCategoryEnum.APPLICATION_L4_BORDER);
+		resourceDetails.setResourceType(ResourceTypeEnum.VFC.name());
+		resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
+		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 
-			resourceDetails = ElementFactory.getDefaultResource(ResourceCategoryEnum.GENERIC_INFRASTRUCTURE);
-//			resourceDetails.setName("ciResource33");
-			resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-			createResource = ResourceRestUtils.createResource(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createResource);
-			resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
-			resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		resourceDetails = ElementFactory.getDefaultResource(ResourceCategoryEnum.GENERIC_INFRASTRUCTURE);
+		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
+		resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 
-			resourceDetails = ElementFactory.getDefaultResource(ResourceCategoryEnum.APPLICATION_L4_FIREWALL);
-//			resourceDetails.setName("ciResource44");
-			resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
-			createResource = ResourceRestUtils.createResource(resourceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createResource);
-			resource = ResponseParser.parseToObjectUsingMapper(createResource.getResponse(), Resource.class);
-			resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			expectedAssetNamesList.add(resource.getName());
+		resourceDetails = ElementFactory.getDefaultResource(ResourceCategoryEnum.APPLICATION_L4_FIREWALL);
+		resourceDetails.setResourceType(ResourceTypeEnum.VF.name());
+		resource = AtomicOperationUtils.createResourceByResourceDetails(resourceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		resource = (Resource) AtomicOperationUtils.changeComponentState(resource, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		expectedAssetNamesList.add(resource.getName());
 
-			log.debug("4 resources created");
-			String query = "category=Application%20L4%2B";
-			RestResponse assetResponse = AssetRestUtils.getFilteredComponentList(AssetTypeEnum.RESOURCES, query);
-			BaseRestUtils.checkSuccess(assetResponse);
+		log.debug("4 resources created");
+		String query = "category=Application%20L4%2B";
+		RestResponse assetResponse = AssetRestUtils.getFilteredComponentList(AssetTypeEnum.RESOURCES, query);
+		BaseRestUtils.checkSuccess(assetResponse);
 
-			List<ResourceAssetStructure> resourceAssetList = AssetRestUtils.getResourceAssetList(assetResponse);
-			List<String> getActualAssetNamesList = AssetRestUtils.getResourceNamesList(resourceAssetList);
-			Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
+		List<ResourceAssetStructure> resourceAssetList = AssetRestUtils.getResourceAssetList(assetResponse);
+		List<String> getActualAssetNamesList = AssetRestUtils.getResourceNamesList(resourceAssetList);
+		Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
 
 //			Andrey L. This condition can not be checked in case resources list has two or ore different resource types
 //			AssetRestUtils.checkResourceTypeInObjectList(resourceAssetList, ResourceTypeEnum.VF);
 
-			// Validate audit message
-			ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultFilteredAssetListAudit(AssetTypeEnum.RESOURCES, "?" + query);
-			Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-	        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-	        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFilteredAudit(query, AssetTypeEnum.RESOURCES);*/
 
-		}
+	}
 
-		@Test
-		public void getFilteredServiceAssetInformationalSuccess() throws Exception {
+	@Test
+	public void getFilteredServiceAssetInformationalSuccess() throws Exception {
 
-			List<String> expectedAssetNamesList = new ArrayList<>();
-			ArtifactReqDetails artifactDetails = ElementFactory.getArtifactByType(ArtifactTypeEnum.OTHER, ArtifactTypeEnum.OTHER, true);
-			artifactDetails.setArtifactGroupType(ArtifactGroupTypeEnum.INFORMATIONAL.getType());
+		List<String> expectedAssetNamesList = new ArrayList<>();
+		ArtifactReqDetails artifactDetails = ElementFactory.getArtifactByType(ArtifactTypeEnum.OTHER, ArtifactTypeEnum.OTHER, true);
+		artifactDetails.setArtifactGroupType(ArtifactGroupTypeEnum.INFORMATIONAL.getType());
 
-			ServiceReqDetails serviceDetails = ElementFactory.getDefaultService();
-			serviceDetails.setName("ciService111");
-			RestResponse createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createService);
-			Service service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
+		ServiceReqDetails serviceDetails = ElementFactory.getDefaultService();
+		Service service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
 
-			serviceDetails.setName("ciService222");
-			createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createService);
-			service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
-			RestResponse addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
-			BaseRestUtils.checkSuccess(addInformationalArtifactToService);
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		RestResponse addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
+		BaseRestUtils.checkSuccess(addInformationalArtifactToService);
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 
-			ServiceReqDetails certifyService = new ServiceReqDetails(service);
-			LifecycleRestUtils.changeDistributionStatus(certifyService, certifyService.getVersion(), ElementFactory.getDefaultUser(UserRoleEnum.GOVERNOR), null, DistributionStatusEnum.DISTRIBUTION_APPROVED);
-			AtomicOperationUtils.distributeService(service, false);
-			expectedAssetNamesList.add(service.getName());
+		ServiceReqDetails certifyService = new ServiceReqDetails(service);
+		LifecycleRestUtils.changeDistributionStatus(certifyService, certifyService.getVersion(), ElementFactory.getDefaultUser(UserRoleEnum.GOVERNOR), null, DistributionStatusEnum.DISTRIBUTION_APPROVED);
+		AtomicOperationUtils.distributeService(service, false);
+		expectedAssetNamesList.add(service.getName());
 
-			serviceDetails.setName("ciService333");
-			createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createService);
-			service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
-			addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
-			BaseRestUtils.checkSuccess(addInformationalArtifactToService);
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			certifyService = new ServiceReqDetails(service);
-			LifecycleRestUtils.changeDistributionStatus(certifyService, certifyService.getVersion(), ElementFactory.getDefaultUser(UserRoleEnum.GOVERNOR), null, DistributionStatusEnum.DISTRIBUTION_APPROVED);
-			AtomicOperationUtils.distributeService(service, false);
-			expectedAssetNamesList.add(service.getName());
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
+		BaseRestUtils.checkSuccess(addInformationalArtifactToService);
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		certifyService = new ServiceReqDetails(service);
+		LifecycleRestUtils.changeDistributionStatus(certifyService, certifyService.getVersion(), ElementFactory.getDefaultUser(UserRoleEnum.GOVERNOR), null, DistributionStatusEnum.DISTRIBUTION_APPROVED);
+		AtomicOperationUtils.distributeService(service, false);
+		expectedAssetNamesList.add(service.getName());
 
-			serviceDetails.setName("ciService444");
-			createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createService);
-			service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 
-			serviceDetails.setName("ciService555");
-			createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createService);
-			service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 
-			String query = "distributionStatus=Distributed";
-			RestResponse assetResponse = AssetRestUtils.getFilteredComponentList(AssetTypeEnum.SERVICES, query);
-			BaseRestUtils.checkSuccess(assetResponse);
+		String query = "distributionStatus=Distributed";
+		RestResponse assetResponse = AssetRestUtils.getFilteredComponentList(AssetTypeEnum.SERVICES, query);
+		BaseRestUtils.checkSuccess(assetResponse);
 
-			List<ServiceAssetStructure> resourceAssetList = AssetRestUtils.getServiceAssetList(assetResponse);
-			List<String> getActualAssetNamesList = AssetRestUtils.getServiceNamesList(resourceAssetList);
-			Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
+		List<ServiceAssetStructure> resourceAssetList = AssetRestUtils.getServiceAssetList(assetResponse);
+		List<String> getActualAssetNamesList = AssetRestUtils.getServiceNamesList(resourceAssetList);
+		Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
 
-			// Validate audit message
-			ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultFilteredAssetListAudit(AssetTypeEnum.SERVICES, "?" + query);
-			Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-	        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-	        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		/*// Validate audit message
+		validateFilteredAudit(query, AssetTypeEnum.SERVICES);*/
 
-		}
-		
-		@Test
-		public void getFilteredServiceAssetDeploymentSuccess() throws Exception {
+	}
 
-			List<String> expectedAssetNamesList = new ArrayList<>();
-			ArtifactReqDetails artifactDetails = ElementFactory.getArtifactByType(ArtifactTypeEnum.OTHER, ArtifactTypeEnum.OTHER, true);
+	@Test
+	public void getFilteredServiceAssetDeploymentSuccess() throws Exception {
 
-			ServiceReqDetails serviceDetails = ElementFactory.getDefaultService();
-			serviceDetails.setName("ciService666");
-			RestResponse createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createService);
-			Service service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
+		List<String> expectedAssetNamesList = new ArrayList<>();
+		ArtifactReqDetails artifactDetails = ElementFactory.getArtifactByType(ArtifactTypeEnum.OTHER, ArtifactTypeEnum.OTHER, true);
 
-			serviceDetails.setName("ciService777");
-			createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createService);
-			service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
-			RestResponse addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
-			BaseRestUtils.checkSuccess(addInformationalArtifactToService);
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		ServiceReqDetails serviceDetails = ElementFactory.getDefaultService();
+		Service service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
 
-			ServiceReqDetails certifyService = new ServiceReqDetails(service);
-			LifecycleRestUtils.changeDistributionStatus(certifyService, certifyService.getVersion(), ElementFactory.getDefaultUser(UserRoleEnum.GOVERNOR), null, DistributionStatusEnum.DISTRIBUTION_APPROVED);
-			AtomicOperationUtils.distributeService(service, false);
-			expectedAssetNamesList.add(service.getName());
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		RestResponse addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
+		BaseRestUtils.checkSuccess(addInformationalArtifactToService);
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
 
-			serviceDetails.setName("ciService888");
-			createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createService);
-			service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
-			addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
-			BaseRestUtils.checkSuccess(addInformationalArtifactToService);
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
-			certifyService = new ServiceReqDetails(service);
-			LifecycleRestUtils.changeDistributionStatus(certifyService, certifyService.getVersion(), ElementFactory.getDefaultUser(UserRoleEnum.GOVERNOR), null, DistributionStatusEnum.DISTRIBUTION_APPROVED);
-			AtomicOperationUtils.distributeService(service, false);
-			expectedAssetNamesList.add(service.getName());
+		ServiceReqDetails certifyService = new ServiceReqDetails(service);
+		LifecycleRestUtils.changeDistributionStatus(certifyService, certifyService.getVersion(), ElementFactory.getDefaultUser(UserRoleEnum.GOVERNOR), null, DistributionStatusEnum.DISTRIBUTION_APPROVED);
+		AtomicOperationUtils.distributeService(service, false);
+		expectedAssetNamesList.add(service.getName());
 
-			serviceDetails.setName("ciService999");
-			createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createService);
-			service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		addInformationalArtifactToService = ArtifactRestUtils.addInformationalArtifactToService(artifactDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), service.getUniqueId());
+		BaseRestUtils.checkSuccess(addInformationalArtifactToService);
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CERTIFY, true).getLeft();
+		certifyService = new ServiceReqDetails(service);
+		LifecycleRestUtils.changeDistributionStatus(certifyService, certifyService.getVersion(), ElementFactory.getDefaultUser(UserRoleEnum.GOVERNOR), null, DistributionStatusEnum.DISTRIBUTION_APPROVED);
+		AtomicOperationUtils.distributeService(service, false);
+		expectedAssetNamesList.add(service.getName());
 
-			serviceDetails.setName("ciService000");
-			createService = ServiceRestUtils.createService(serviceDetails, ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER));
-			BaseRestUtils.checkCreateResponse(createService);
-			service = ResponseParser.parseToObjectUsingMapper(createService.getResponse(), Service.class);
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
-			service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
 
-			String query = "distributionStatus=Distributed";
-			RestResponse assetResponse = AssetRestUtils.getFilteredComponentList(AssetTypeEnum.SERVICES, query);
-			BaseRestUtils.checkSuccess(assetResponse);
+		serviceDetails = ElementFactory.getDefaultService();
+		service = AtomicOperationUtils.createCustomService(serviceDetails, UserRoleEnum.DESIGNER, true).left().value();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKIN, true).getLeft();
+		service = (Service) AtomicOperationUtils.changeComponentState(service, UserRoleEnum.DESIGNER, LifeCycleStatesEnum.CHECKOUT, true).getLeft();
 
-			List<ServiceAssetStructure> resourceAssetList = AssetRestUtils.getServiceAssetList(assetResponse);
-			List<String> getActualAssetNamesList = AssetRestUtils.getServiceNamesList(resourceAssetList);
-			Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
+		String query = "distributionStatus=Distributed";
+		RestResponse assetResponse = AssetRestUtils.getFilteredComponentList(AssetTypeEnum.SERVICES, query);
+		BaseRestUtils.checkSuccess(assetResponse);
 
-			// Validate audit message
-			ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultFilteredAssetListAudit(AssetTypeEnum.SERVICES, "?" + query);
-			Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-	        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-	        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		List<ServiceAssetStructure> resourceAssetList = AssetRestUtils.getServiceAssetList(assetResponse);
+		List<String> getActualAssetNamesList = AssetRestUtils.getServiceNamesList(resourceAssetList);
+		Utils.compareArrayLists(getActualAssetNamesList, expectedAssetNamesList, "Element");
 
-		}
-		
+		/*// Validate audit message
+		validateFilteredAudit(query, AssetTypeEnum.SERVICES);*/
+	}
+
+	/*private void validateSuccessAudit(String[] filter, AssetTypeEnum assetType) throws Exception {
+		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(assetType, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
+		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
+		Map<AuditingFieldsKeysEnum, String> body = new HashMap<>();
+		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
+		AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+	}
+
+	private void validateFilteredAudit(String query, AssetTypeEnum assetType) throws Exception {
+		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultFilteredAssetListAudit(assetType, "?" + query);
+		Map<AuditingFieldsKeysEnum, String> body = new HashMap<>();
+		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
+		AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+	}
+
+	private void validateFailureAudit(String[] filter, ErrorInfo errorInfo, List<String> variables, AssetTypeEnum assetType) throws Exception {
+		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetListAudit(assetType, AuditingActionEnum.GET_FILTERED_ASSET_LIST);
+		expectedAssetListAudit.setRESOURCE_URL(AssetRestUtils.buildUrlWithFilter(expectedAssetListAudit.getRESOURCE_URL(), filter));
+		expectedAssetListAudit.setSTATUS(errorInfo.getCode().toString());
+		expectedAssetListAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
+		Map<AuditingFieldsKeysEnum, String> body = new HashMap<>();
+		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
+		AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+	}*/
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetSpecificAssetMetadataServlet.java b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetSpecificAssetMetadataServlet.java
index a55a458..c036c7f 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetSpecificAssetMetadataServlet.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/GetSpecificAssetMetadataServlet.java
@@ -21,24 +21,21 @@
 package org.openecomp.sdc.externalApis;
 
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
 
 import org.junit.Rule;
 import org.junit.rules.TestName;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.Service;
-import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
 import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
 import org.openecomp.sdc.ci.tests.datatypes.ResourceDetailedAssetStructure;
 import org.openecomp.sdc.ci.tests.datatypes.ServiceDetailedAssetStructure;
 import org.openecomp.sdc.ci.tests.datatypes.enums.ArtifactTypeEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.LifeCycleStatesEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
-import org.openecomp.sdc.ci.tests.datatypes.expected.ExpectedExternalAudit;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.general.AtomicOperationUtils;
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
@@ -47,9 +44,7 @@
 import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.ResponseParser;
 import org.openecomp.sdc.ci.tests.utils.rest.ServiceRestUtils;
-import org.openecomp.sdc.ci.tests.utils.validation.AuditValidationUtils;
 import org.openecomp.sdc.ci.tests.utils.validation.ErrorValidationUtils;
-import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
 import org.testng.annotations.Test;
 
 public class GetSpecificAssetMetadataServlet extends ComponentBaseTest {
@@ -80,11 +75,8 @@
 		ResourceDetailedAssetStructure resourceAssetMetadata = AssetRestUtils.getResourceAssetMetadata(assetResponse);
 		AssetRestUtils.resourceMetadataValidatior(resourceAssetMetadata, resourceVF, AssetTypeEnum.RESOURCES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.RESOURCES, resourceVF);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+	/*	// Validate audit message
+		validateAudit(resourceVF, AssetTypeEnum.RESOURCES);*/
 	}
 
 	@Test // (enabled = false)
@@ -103,12 +95,8 @@
 		ResourceDetailedAssetStructure resourceAssetMetadata = AssetRestUtils.getResourceAssetMetadata(assetResponse);
 		AssetRestUtils.resourceMetadataValidatior(resourceAssetMetadata, resourceVF, AssetTypeEnum.RESOURCES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory
-				.getDefaultAssetMetadataAudit(AssetTypeEnum.RESOURCES, resourceVF);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+		/*// Validate audit message
+		validateAudit(resourceVF, AssetTypeEnum.RESOURCES);*/
 	}
 
 	@Test // (enabled = false)
@@ -137,11 +125,8 @@
 		ResourceDetailedAssetStructure resourceAssetMetadata = AssetRestUtils.getResourceAssetMetadata(assetResponse);
 		AssetRestUtils.resourceMetadataValidatior(resourceAssetMetadata, resourceVF, AssetTypeEnum.RESOURCES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.RESOURCES, resourceVF);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+	/*	// Validate audit message
+		validateAudit(resourceVF, AssetTypeEnum.RESOURCES);*/
 	}
 
 	@Test // (enabled = false)
@@ -170,11 +155,8 @@
 		ResourceDetailedAssetStructure resourceAssetMetadata = AssetRestUtils.getResourceAssetMetadata(assetResponse);
 		AssetRestUtils.resourceMetadataValidatior(resourceAssetMetadata, resourceVF, AssetTypeEnum.RESOURCES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.RESOURCES, resourceVF);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+	/*	// Validate audit message
+		validateAudit(resourceVF, AssetTypeEnum.RESOURCES);*/
 	}
 
 	@Test // (enabled = false)
@@ -203,11 +185,8 @@
 		ResourceDetailedAssetStructure resourceAssetMetadata = AssetRestUtils.getResourceAssetMetadata(assetResponse);
 		AssetRestUtils.resourceMetadataValidatior(resourceAssetMetadata, resourceVF, AssetTypeEnum.RESOURCES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.RESOURCES, resourceVF);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+		/*// Validate audit message
+		validateAudit(resourceVF, AssetTypeEnum.RESOURCES);*/
 	}
 
 	@Test // (enabled = false)
@@ -236,11 +215,8 @@
 		ResourceDetailedAssetStructure resourceAssetMetadata = AssetRestUtils.getResourceAssetMetadata(assetResponse);
 		AssetRestUtils.resourceMetadataValidatior(resourceAssetMetadata, resourceVF, AssetTypeEnum.RESOURCES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.RESOURCES, resourceVF);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+	/*	// Validate audit message
+		validateAudit(resourceVF, AssetTypeEnum.RESOURCES);*/
 	}
 
 	@Test // (enabled = false)
@@ -265,13 +241,11 @@
 		ResourceDetailedAssetStructure resourceAssetMetadata = AssetRestUtils.getResourceAssetMetadata(assetResponse);
 		AssetRestUtils.resourceMetadataValidatior(resourceAssetMetadata, resourceVF, AssetTypeEnum.RESOURCES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.RESOURCES, resourceVF);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+		/*// Validate audit message
+		validateAudit(resourceVF, AssetTypeEnum.RESOURCES);*/
 	}
 
+
 	// Import CSAR
 
 	// Service
@@ -286,11 +260,8 @@
 		ServiceDetailedAssetStructure serviceAssetMetadata = AssetRestUtils.getServiceAssetMetadata(assetResponse);
 		AssetRestUtils.serviceMetadataValidatior(serviceAssetMetadata, service, AssetTypeEnum.SERVICES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.SERVICES, service);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+		/*// Validate audit message
+		validateAudit(service, AssetTypeEnum.SERVICES);*/
 	}
 
 	@Test // (enabled = false)
@@ -309,11 +280,8 @@
 		ServiceDetailedAssetStructure serviceAssetMetadata = AssetRestUtils.getServiceAssetMetadata(assetResponse);
 		AssetRestUtils.serviceMetadataValidatior(serviceAssetMetadata, service, AssetTypeEnum.SERVICES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.SERVICES, service);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+		/*// Validate audit message
+		validateAudit(service, AssetTypeEnum.SERVICES);*/
 
 	}
 
@@ -345,11 +313,8 @@
 		ServiceDetailedAssetStructure serviceAssetMetadata = AssetRestUtils.getServiceAssetMetadata(assetResponse);
 		AssetRestUtils.serviceMetadataValidatior(serviceAssetMetadata, service, AssetTypeEnum.SERVICES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.SERVICES, service);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+		/*// Validate audit message
+		validateAudit(service, AssetTypeEnum.SERVICES);*/
 
 	}
 
@@ -385,11 +350,8 @@
 		ServiceDetailedAssetStructure serviceAssetMetadata = AssetRestUtils.getServiceAssetMetadata(assetResponse);
 		AssetRestUtils.serviceMetadataValidatior(serviceAssetMetadata, service, AssetTypeEnum.SERVICES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.SERVICES, service);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+		/*// Validate audit message
+		validateAudit(service, AssetTypeEnum.SERVICES);*/
 
 	}
 
@@ -424,11 +386,8 @@
 		ServiceDetailedAssetStructure serviceAssetMetadata = AssetRestUtils.getServiceAssetMetadata(assetResponse);
 		AssetRestUtils.serviceMetadataValidatior(serviceAssetMetadata, service, AssetTypeEnum.SERVICES);
 
-		// Validate audit message
-		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(AssetTypeEnum.SERVICES, service);
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-        body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
-        AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+		/*// Validate audit message
+		validateAudit(service, AssetTypeEnum.SERVICES);*/
 	}
 
 	@Test // (enabled = false)
@@ -443,4 +402,11 @@
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.SERVICE_NOT_FOUND.name(), variables, assetResponse.getResponse());
 	}
 
+	/*private void validateAudit(Component component, AssetTypeEnum assetType) throws Exception {
+		ExpectedExternalAudit expectedAssetListAudit = ElementFactory.getDefaultAssetMetadataAudit(assetType, component);
+		Map<AuditingFieldsKeysEnum, String> body = new HashMap<>();
+		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedAssetListAudit.getRESOURCE_URL());
+		AuditValidationUtils.validateExternalAudit(expectedAssetListAudit, AuditingActionEnum.GET_ASSET_METADATA.getName(), body);
+	}*/
+
 }
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/SearchFilterCategoryExternalAPI.java b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/SearchFilterCategoryExternalAPI.java
index ca7c5ae..8b174e5 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/SearchFilterCategoryExternalAPI.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/SearchFilterCategoryExternalAPI.java
@@ -20,13 +20,10 @@
 
 package org.openecomp.sdc.externalApis;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
 import org.json.simple.parser.JSONParser;
 import org.junit.Rule;
 import org.junit.rules.TestName;
@@ -36,34 +33,29 @@
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.category.CategoryDefinition;
 import org.openecomp.sdc.be.model.category.SubCategoryDefinition;
-import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
 import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
 import org.openecomp.sdc.ci.tests.config.Config;
 import org.openecomp.sdc.ci.tests.datatypes.ResourceReqDetails;
-import org.openecomp.sdc.ci.tests.datatypes.enums.ErrorInfo;
 import org.openecomp.sdc.ci.tests.datatypes.enums.NormativeTypesEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.ResourceCategoryEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.SearchCriteriaEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
-import org.openecomp.sdc.ci.tests.datatypes.expected.ExpectedExternalAudit;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.general.AtomicOperationUtils;
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
 import org.openecomp.sdc.ci.tests.utils.rest.CategoryRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtils;
-import org.openecomp.sdc.ci.tests.utils.validation.AuditValidationUtils;
 import org.openecomp.sdc.ci.tests.utils.validation.ErrorValidationUtils;
-import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
 
 public class SearchFilterCategoryExternalAPI extends ComponentBaseTest {
 
@@ -101,15 +93,19 @@
 		List<String> variables = Arrays.asList("resourceTypeinvalid", "[resourceType, subCategory, category]");
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.INVALID_FILTER_KEY.name(), variables, restResponse.getResponse());
 
+		/*validateFailureAudit(variables);*/
+	}
+
+	/*private void validateFailureAudit(List<String> variables) throws Exception {
 		ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalAuditObject(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST, "?" + SearchCriteriaEnum.RESOURCE_TYPE.getValue() + "invalid=" + ResourceTypeEnum.VFC.toString());
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.INVALID_FILTER_KEY.name());
 		expectedExternalAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
 		expectedExternalAudit.setSTATUS("400");
-		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
+		Map<AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedExternalAudit.getRESOURCE_URL());
 		AuditValidationUtils.validateAuditExternalSearchAPI(expectedExternalAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
-	}
-	
+	}*/
+
 	@DataProvider(name="searchForResourceTypeNegativeTest", parallel=true) 
 	public static Object[][] dataProviderSearchForResourceTypeNegativeTest() {
 		return new Object[][] {
@@ -129,13 +125,13 @@
 		List<String> variables = Arrays.asList();
 		ErrorValidationUtils.checkBodyResponseOnError(ActionStatus.INVALID_CONTENT.name(), variables, restResponse.getResponse());
 
-		ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalAuditObject(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST, "?" + SearchCriteriaEnum.RESOURCE_TYPE.getValue() + "=" + resourceType);
+		/*ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalAuditObject(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST, "?" + SearchCriteriaEnum.RESOURCE_TYPE.getValue() + "=" + resourceType);
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.INVALID_CONTENT.name());
 		expectedExternalAudit.setDESC(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
 		expectedExternalAudit.setSTATUS("400");
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedExternalAudit.getRESOURCE_URL());
-		AuditValidationUtils.validateAuditExternalSearchAPI(expectedExternalAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+		AuditValidationUtils.validateAuditExternalSearchAPI(expectedExternalAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);*/
 	}
 	
 	// Searching for resource filter incorrect resource type using external API
@@ -160,10 +156,10 @@
 			}
 			
 			
-			ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalAuditObject(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST, "?" + SearchCriteriaEnum.RESOURCE_TYPE.getValue() + "=" + resourceTypeEnum.toString());
+			/*ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalAuditObject(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST, "?" + SearchCriteriaEnum.RESOURCE_TYPE.getValue() + "=" + resourceTypeEnum.toString());
 			Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 			body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedExternalAudit.getRESOURCE_URL());
-			AuditValidationUtils.validateAuditExternalSearchAPI(expectedExternalAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+			AuditValidationUtils.validateAuditExternalSearchAPI(expectedExternalAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);*/
 		}
 	}
 	
@@ -182,10 +178,10 @@
 			Assert.assertEquals(restResponse.getErrorCode(), expectedResponseCode);
 			validateJsonContainResource(restResponse.getResponse(), createdResoucesName, true);
 			
-			ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalAuditObject(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST, "?" + SearchCriteriaEnum.RESOURCE_TYPE.getValue() + "=" + resourceTypeEnum.toString());
+			/*ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalAuditObject(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST, "?" + SearchCriteriaEnum.RESOURCE_TYPE.getValue() + "=" + resourceTypeEnum.toString());
 			Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 			body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_URL, expectedExternalAudit.getRESOURCE_URL());
-			AuditValidationUtils.validateAuditExternalSearchAPI(expectedExternalAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);
+			AuditValidationUtils.validateAuditExternalSearchAPI(expectedExternalAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), body);*/
 		}
 	}
 	
@@ -209,8 +205,8 @@
 		Assert.assertEquals(restResponse.getErrorCode(), expectedResponseCode);
 		validateJsonContainResource(restResponse.getResponse(), createdResoucesName, true);
 		
-		ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalAuditObject(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST, "?" + SearchCriteriaEnum.RESOURCE_TYPE.getValue() + "=" + ResourceTypeEnum.VFCMT.toString());
-		AuditValidationUtils.validateAuditExternalSearchAPI(expectedExternalAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), null);
+		/*ExpectedExternalAudit expectedExternalAudit = ElementFactory.getDefaultExternalAuditObject(AssetTypeEnum.RESOURCES, AuditingActionEnum.GET_FILTERED_ASSET_LIST, "?" + SearchCriteriaEnum.RESOURCE_TYPE.getValue() + "=" + ResourceTypeEnum.VFCMT.toString());
+		AuditValidationUtils.validateAuditExternalSearchAPI(expectedExternalAudit, AuditingActionEnum.GET_FILTERED_ASSET_LIST.getName(), null);*/
 	}
 	
 	
diff --git a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/VFCMTExternalAPI.java b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/VFCMTExternalAPI.java
index cd96af2..4cd5c1c 100644
--- a/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/VFCMTExternalAPI.java
+++ b/test-apis-ci/src/main/java/org/openecomp/sdc/externalApis/VFCMTExternalAPI.java
@@ -20,21 +20,16 @@
 
 package org.openecomp.sdc.externalApis;
 
-import static java.util.Arrays.asList;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
 import org.json.simple.parser.JSONParser;
 import org.junit.Rule;
 import org.junit.rules.TestName;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.datatypes.enums.AssetTypeEnum;
-import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
 import org.openecomp.sdc.be.model.User;
-import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
 import org.openecomp.sdc.ci.tests.api.ComponentBaseTest;
 import org.openecomp.sdc.ci.tests.config.Config;
 import org.openecomp.sdc.ci.tests.datatypes.ResourceAssetStructure;
@@ -45,25 +40,22 @@
 import org.openecomp.sdc.ci.tests.datatypes.enums.ResourceCategoryEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.SearchCriteriaEnum;
 import org.openecomp.sdc.ci.tests.datatypes.enums.UserRoleEnum;
-import org.openecomp.sdc.ci.tests.datatypes.expected.ExpectedResourceAuditJavaObject;
 import org.openecomp.sdc.ci.tests.datatypes.http.RestResponse;
 import org.openecomp.sdc.ci.tests.utils.general.ElementFactory;
 import org.openecomp.sdc.ci.tests.utils.rest.AssetRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtils;
 import org.openecomp.sdc.ci.tests.utils.rest.ResourceRestUtilsExternalAPI;
-import org.openecomp.sdc.ci.tests.utils.validation.AuditValidationUtils;
 import org.openecomp.sdc.ci.tests.utils.validation.ErrorValidationUtils;
-import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
-import org.openecomp.sdc.common.util.ValidationUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
+import java.util.List;
+
+import static java.util.Arrays.asList;
+import static org.testng.Assert.assertTrue;
 
 public class VFCMTExternalAPI extends ComponentBaseTest {
 
@@ -110,12 +102,12 @@
 		RestResponse restResponse = ResourceRestUtilsExternalAPI.createResource(defaultResource, defaultUser);
 		ResourceAssetStructure parsedCreatedResponse = gson.fromJson(restResponse.getResponse(), ResourceAssetStructure.class);
 
-		// auditing verification
+	/*	// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CREATE_RESOURCE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, parsedCreatedResponse.getName());
-		ExpectedResourceAuditJavaObject expectedResourceAuditJavaObject = ElementFactory.getDefaultCreateResourceExternalAPI(parsedCreatedResponse.getName());	
-		AuditValidationUtils.validateAuditExternalCreateResource(expectedResourceAuditJavaObject, action.getName(), body);
+		ExpectedResourceAuditJavaObject expectedResourceAuditJavaObject = ElementFactory.getDefaultCreateResourceExternalAPI(parsedCreatedResponse.getName());
+		AuditValidationUtils.validateAuditExternalCreateResource(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 		// search for vfcmt via external api - validate created resource exist
 		RestResponse searchResult = ResourceRestUtils.getResourceListFilterByCriteria(ElementFactory.getDefaultUser(UserRoleEnum.DESIGNER), AssetTypeEnum.RESOURCES.getValue(), SearchCriteriaEnum.RESOURCE_TYPE.getValue(), ResourceTypeEnum.VFCMT.toString());
@@ -158,28 +150,28 @@
 		RestResponse firstTryToCreate = ResourceRestUtilsExternalAPI.createResource(defaultResource, defaultUser);
 		ResourceAssetStructure parsedCreatedResponse = gson.fromJson(firstTryToCreate.getResponse(), ResourceAssetStructure.class);
 
-		// auditing verification
+		/*// auditing verification
 		AuditingActionEnum action = AuditingActionEnum.CREATE_RESOURCE_BY_API;
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
 		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, parsedCreatedResponse.getName());
 		ExpectedResourceAuditJavaObject expectedResourceAuditJavaObject = ElementFactory.getDefaultCreateResourceExternalAPI(parsedCreatedResponse.getName());	
-		AuditValidationUtils.validateAuditExternalCreateResource(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalCreateResource(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 		// try to create another vfcmt wit same name
 		RestResponse secondTryToCreate = ResourceRestUtilsExternalAPI.createResource(defaultResource, defaultUser);
 		Assert.assertEquals((int)secondTryToCreate.getErrorCode(), 409);
 		
-		body.put(AuditingFieldsKeysEnum.AUDIT_STATUS, "409");
+		/*body.put(AuditingFieldsKeysEnum.AUDIT_STATUS, "409");
 		ErrorInfo errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_NAME_ALREADY_EXIST.name());
 		List<String> variables = asList(ComponentTypeEnum.RESOURCE.getValue(), defaultResource.getName());
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
 		expectedResourceAuditJavaObject.setStatus("409");
-		AuditValidationUtils.validateAuditExternalCreateResource(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalCreateResource(expectedResourceAuditJavaObject, action.getName(), body);*/
 	}
 	
 	
 	
-	@DataProvider(name="createVfcmtVariousFailureFlows", parallel=true) 
+	@DataProvider(name="createVfcmtVariousFailureFlows", parallel=true)
 	public static Object[][] dataProviderCreateVfcmtVariousFailureFlows() {
 		return new Object[][] {
 			{"name_missing"},
@@ -217,11 +209,11 @@
 		ResourceExternalReqDetails defaultResource = ElementFactory.getDefaultResourceByType("ci", ResourceCategoryEnum.TEMPLATE_MONITORING_TEMPLATE, defaultUser.getUserId(), ResourceTypeEnum.VFCMT.toString());
 		
 		ErrorInfo errorInfo = null;
-		List<String> variables = null;
+		/*List<String> variables = null;
 		AuditingActionEnum action = AuditingActionEnum.CREATE_RESOURCE_BY_API;
 		ExpectedResourceAuditJavaObject expectedResourceAuditJavaObject = ElementFactory.getDefaultCreateResourceExternalAPI(defaultResource.getName());	
 		Map <AuditingFieldsKeysEnum, String> body = new HashMap<>();
-		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, defaultResource.getName());
+		body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, defaultResource.getName());*/
 		
 		switch (flow) {
 		case "name_missing":
@@ -229,149 +221,149 @@
 			List<String> resourceTags = defaultResource.getTags();
 			resourceTags.add("");
 			defaultResource.setTags(resourceTags);
-			expectedResourceAuditJavaObject.setResourceName("");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.MISSING_COMPONENT_NAME.name());
+			/*expectedResourceAuditJavaObject.setResourceName("");
 			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
-			body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, "");
+			body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, "");*/
 			break;
 		case "name_to_long":
 			defaultResource.setName("asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1");
-			expectedResourceAuditJavaObject.setResourceName("asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1");	
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_NAME_EXCEEDS_LIMIT.name());
+			/*expectedResourceAuditJavaObject.setResourceName("asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1");
 			variables = asList(ComponentTypeEnum.RESOURCE.getValue(), "1024");
-			
-			body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, "asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1");
+			body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, "asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1");*/
 			break;
 		case "name_with_invalid_char":
 			defaultResource.setName("!@#$%^&*(");
-			expectedResourceAuditJavaObject.setResourceName("!@#$%^&*(");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.INVALID_COMPONENT_NAME.name());
+			/*expectedResourceAuditJavaObject.setResourceName("!@#$%^&*(");
 			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
-			body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, "!@#$%^&*(");
+			body.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_NAME, "!@#$%^&*(");*/
 			break;
 		case "description_missing":
 			defaultResource.setDescription("");
-			expectedResourceAuditJavaObject.setDesc("");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_MISSING_DESCRIPTION.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*expectedResourceAuditJavaObject.setDesc("");
+			variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "description_to_long":
 			defaultResource.setDescription("asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1");
-			expectedResourceAuditJavaObject.setDesc("asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_DESCRIPTION_EXCEEDS_LIMIT.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue(), "1024");
+			/*expectedResourceAuditJavaObject.setDesc("asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1asdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjklasdfghjk1");
+			variables = asList(ComponentTypeEnum.RESOURCE.getValue(), "1024");*/
 			break;
 		case "description_with_invalid_char":
 			defaultResource.setDescription("\uC2B5");
-			expectedResourceAuditJavaObject.setDesc("t");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_INVALID_DESCRIPTION.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*expectedResourceAuditJavaObject.setDesc("t");
+			variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		// TODO: defect on the flow - need to get error instead create VFC
 		case "resource_type_missing":
 			defaultResource.setResourceType("");
-			expectedResourceAuditJavaObject.setResourceType("");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.INVALID_CONTENT.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*expectedResourceAuditJavaObject.setResourceType("");
+			variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		// TODO: in audit RESOURCE_NAME is empty
 		case "resource_type_invalid":
 			defaultResource.setResourceType("invalid");
-			expectedResourceAuditJavaObject.setResourceType(ComponentTypeEnum.RESOURCE.getValue());
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.INVALID_RESOURCE_TYPE.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*expectedResourceAuditJavaObject.setResourceType(ComponentTypeEnum.RESOURCE.getValue());
+			variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "category_type_missing":
 			defaultResource.setCategory("");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_MISSING_CATEGORY.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		// TODO: not correct response code in this flow - 500 instead 400
 		case "category_type_invalid":
 			defaultResource.setCategory("invalid");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_INVALID_CATEGORY.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "subcategory_type_missing":
 			defaultResource.setSubcategory("");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_MISSING_SUBCATEGORY.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		// TODO: not correct error - it not missing it not correct
 		case "subcategory_type_invalid":
 			defaultResource.setSubcategory("invalid");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_INVALID_SUBCATEGORY.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "vendor_name_missing":
 			defaultResource.setVendorName("");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.MISSING_VENDOR_NAME.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "vendor_name_to_long":
 			defaultResource.setVendorName("asdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdff");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.VENDOR_NAME_EXCEEDS_LIMIT.name());
-			variables = asList(ValidationUtils.VENDOR_NAME_MAX_LENGTH.toString());
+			/*variables = asList(ValidationUtils.VENDOR_NAME_MAX_LENGTH.toString());*/
 			break;
 		case "vendor_name_with_invalid_char":
 			defaultResource.setVendorName("!@#$*()&*^%$#@");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.INVALID_VENDOR_NAME.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "vendor_release_missing":
 			defaultResource.setVendorRelease("");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.MISSING_VENDOR_RELEASE.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "vendor_release_to_long":
 			defaultResource.setVendorRelease("asdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdff");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.VENDOR_RELEASE_EXCEEDS_LIMIT.name());
-			variables = asList("25");
+			/*variables = asList("25");*/
 			break;
 		case "vendor_release_with_invalid_char":
 			defaultResource.setVendorRelease("!@#$*()&*^%$#@");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.INVALID_VENDOR_RELEASE.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "tags_missing":
 			defaultResource.setTags(asList(""));
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.INVALID_FIELD_FORMAT.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue(), "tag");
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue(), "tag");*/
 			break;
 		case "tags_to_long":
 			defaultResource.setTags(asList("asdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdffasdff"));
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_SINGLE_TAG_EXCEED_LIMIT.name());
-			variables = asList("1024");
+			/*variables = asList("1024");*/
 			break;
 		case "tags_invalid":
 			defaultResource.setTags(asList("asfdg"));
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_INVALID_TAGS_NO_COMP_NAME.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "icon_missing":
 			defaultResource.setIcon("");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_MISSING_ICON.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "user_contact_missing":
 			defaultResource.setContactId("");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_MISSING_CONTACT.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		case "user_contact_invalid":
 		default:
 			defaultResource.setContactId("abcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfdabcderfffdfdfd");
 			errorInfo = ErrorValidationUtils.parseErrorConfigYaml(ActionStatus.COMPONENT_INVALID_CONTACT.name());
-			variables = asList(ComponentTypeEnum.RESOURCE.getValue());
+			/*variables = asList(ComponentTypeEnum.RESOURCE.getValue());*/
 			break;
 		}
 			
 		// create vfcmt
 		RestResponse restResponse = ResourceRestUtilsExternalAPI.createResource(defaultResource, defaultUser);
+		assertTrue(errorInfo.getCode().equals(restResponse.getErrorCode()), "Expected response code on [" + flow + "] is: " + errorInfo.getCode() + ", actual is: " + restResponse.getErrorCode());
 		
-		expectedResourceAuditJavaObject.setStatus(errorInfo.getCode().toString());
+		/*expectedResourceAuditJavaObject.setStatus(errorInfo.getCode().toString());
 		expectedResourceAuditJavaObject.setDesc(AuditValidationUtils.buildAuditDescription(errorInfo, variables));
-		AuditValidationUtils.validateAuditExternalCreateResource(expectedResourceAuditJavaObject, action.getName(), body);
+		AuditValidationUtils.validateAuditExternalCreateResource(expectedResourceAuditJavaObject, action.getName(), body);*/
 		
 	}
 	
diff --git a/test-apis-ci/src/main/resources/ci/conf/attsdc.yaml b/test-apis-ci/src/main/resources/ci/conf/attsdc.yaml
index 904b3d1..5ee9d05 100644
--- a/test-apis-ci/src/main/resources/ci/conf/attsdc.yaml
+++ b/test-apis-ci/src/main/resources/ci/conf/attsdc.yaml
@@ -42,6 +42,8 @@
 cassandraArtifactKeySpace: sdcartifact
 url: http://localhost:8181/sdc1/proxy-designer1#/dashboard
 
+sdcHttpMethod: https
+localDataCenter: DC-Automate01
 
 stopOnClassFailure: false
 
diff --git a/test-apis-ci/src/main/resources/ci/scripts/addUsersFromList_new.sh b/test-apis-ci/src/main/resources/ci/scripts/addUsersFromList_new.sh
index 1b6f025..e695db2 100644
--- a/test-apis-ci/src/main/resources/ci/scripts/addUsersFromList_new.sh
+++ b/test-apis-ci/src/main/resources/ci/scripts/addUsersFromList_new.sh
@@ -46,12 +46,12 @@
             firstName=`echo $user|awk '{print $3}'`
             lastName=`echo $user|awk '{print $4}'`
             email=`echo $user|awk '{print $5}'`
-			curl --noproxy '*' -i -X post -d '{ "userId" : "'${userId}'", "role" : "'${role}'", "firstName" : "'${firstName}'", "lastName" : "'${lastName}'", "email" : "'${email}'" }'  -H "Content-Type: application/json" -H "USER_ID: jh0003" http://${IP}:8080/sdc2/rest/v1/user
+			curl --noproxy '*' -i -X post -d '{ "userId" : "'${userId}'", "role" : "'${role}'", "firstName" : "'${firstName}'", "lastName" : "'${lastName}'", "email" : "'${email}'" }'  -H "Content-Type: application/json" -H "USER_ID: jh0003" https://${IP}:8443/sdc2/rest/v1/user
 		else
 			echo "Host" $IP "Is Unreachable"
 		fi
 	done
-curl --noproxy '*' -i -X post -d '{"consumerName": "ci","consumerSalt": "2a1f887d607d4515d4066fe0f5452a50","consumerPassword": "0a0dc557c3bf594b1a48030e3e99227580168b21f44e285c69740b8d5b13e33b"}'  -H "Content-Type: application/json" -H "USER_ID: jh0003" -H "Authorization:Basic Y2k6MTIzNDU2" http://${IP}:8080/sdc2/rest/v1/consumers
+curl --noproxy '*' -i -X post -d '{"consumerName": "ci","consumerSalt": "2a1f887d607d4515d4066fe0f5452a50","consumerPassword": "0a0dc557c3bf594b1a48030e3e99227580168b21f44e285c69740b8d5b13e33b"}'  -H "Content-Type: application/json" -H "USER_ID: jh0003" -H "Authorization:Basic Y2k6MTIzNDU2" https://${IP}:8443/sdc2/rest/v1/consumers
 	
 }
 
diff --git a/test-apis-ci/src/main/resources/ci/scripts/sendMail.sh b/test-apis-ci/src/main/resources/ci/scripts/sendMail.sh
index 4c23a79..d2b142a 100644
--- a/test-apis-ci/src/main/resources/ci/scripts/sendMail.sh
+++ b/test-apis-ci/src/main/resources/ci/scripts/sendMail.sh
@@ -6,9 +6,9 @@
 VERSION=$2
 ENV=$3
 
-RECIPIENTS1="dl-sdcqa@intl.att.com,ml636r@intl.att.com,bl5783intl.att.com,ak314p@intl.att.com,el489u@intl.att.com,hk096q@intl.att.com,bs5719@intl.att.com"
-RECIPIENTS2="dl-asdcqa@intl.att.com"
-
+RECIPIENTS1="dl-sdcqa@att.com,ml636r@att.com,bl5783@att.com,ak314p@att.com,el489u@att.com,hk096q@att.com,bs5719@att.com"
+#RECIPIENTS2="dl-asdcqa@intl.att.com"
+RECIPIENTS2="md9897@att.com,ms656r@att.com,al714h@att.com,ak991p@att.com,ya107f@att.com,bv095y@att.com,st198j@att.com,th0695@att.com,vk195d@att.com,gg980r@att.com,il0695@att.com,el489u@att.com"
 source ExtentReport/versions.info
 if [ -z "$REPORT_NAME" ]
  then
diff --git a/test-apis-ci/src/main/resources/ci/scripts/startTest.sh b/test-apis-ci/src/main/resources/ci/scripts/startTest.sh
index 764e046..88c9521 100644
--- a/test-apis-ci/src/main/resources/ci/scripts/startTest.sh
+++ b/test-apis-ci/src/main/resources/ci/scripts/startTest.sh
@@ -91,7 +91,7 @@
 USER_LIST="conf/userList.txt"
 chmod +x ${ADD_USERS_SCRIPT}
 echo "add users..."
-`./${ADD_USERS_SCRIPT} -ip ${BE_IP} -f ${USER_LIST}`
+./${ADD_USERS_SCRIPT} -ip ${BE_IP} -f ${USER_LIST}
 
 
 
@@ -137,7 +137,7 @@
 COPY_REPORT_SCRIPT="copyToStorage.sh"
 chmod +x ${COPY_REPORT_SCRIPT}
 echo "copy report to storage..."
-sh ./${COPY_REPORT_SCRIPT} ${REPORT_NAME} ${VERSION} ${MYENV}
+( ./${COPY_REPORT_SCRIPT} ${REPORT_NAME} ${VERSION} ${MYENV} )
 
 
 MAILING_SCRIPT_NAME="sendMail.sh"
diff --git a/test-apis-ci/src/main/resources/ci/testSuites/ExternalApiSanity.xml b/test-apis-ci/src/main/resources/ci/testSuites/ExternalApiSanity.xml
new file mode 100644
index 0000000..0259452
--- /dev/null
+++ b/test-apis-ci/src/main/resources/ci/testSuites/ExternalApiSanity.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
+<suite name="CRUDArtifacts" configfailurepolicy="continue" verbose="2"  parallel="methods" thread-count="2" data-provider-thread-count="2">
+
+  <test name="Test">
+    <classes>
+      <class name="org.openecomp.sdc.externalApis.CRUDExternalAPI">
+   		<methods>
+			<include name="uploadArtifactOnVfcVlCpViaExternalAPI" invocation-numbers="0" />
+			<include name="uploadArtifactOnVFViaExternalAPI" invocation-numbers="0" />
+			<include name="uploadArtifactOnServiceViaExternalAPI" invocation-numbers="0" />
+			<include name="uploadArtifactOnRIViaExternalAPI" invocation-numbers="0" />
+			<include name="uploadArtifactOnVfcVlCpRIViaExternalAPI" invocation-numbers="0" />
+			<include name="updateArtifactForServiceViaExternalAPI" invocation-numbers="0" />
+			<include name="updateArtifactForVFViaExternalAPI" invocation-numbers="0" />
+			<include name="updateArtifactForVfcVlCpViaExternalAPI" invocation-numbers="0" />
+			<include name="updateArtifactOfVfcVlCpForVfciVliCpiViaExternalAPI" invocation-numbers="0" />
+			<include name="updateArtifactOnRIViaExternalAPI" invocation-numbers="0" />
+			<include name="updateArtifactOnVfcVlCpRIViaExternalAPI" invocation-numbers="0" />
+			<include name="deleteArtifactForServiceViaExternalAPI" invocation-numbers="0" />
+			<include name="deleteArtifactForVFViaExternalAPI" invocation-numbers="0" />
+			<include name="deleteArtifactOnRIViaExternalAPI" invocation-numbers="0" />
+			<include name="deleteArtifactOnVfcVlCpRIViaExternalAPI" invocation-numbers="0" />
+			<include name="deleteArtifactOnAssetWhichNotExist" />			
+		</methods>
+      </class>
+      <class name="org.openecomp.sdc.ci.tests.execute.artifacts.DownloadComponentArt">
+        <methods>
+            <include name="downloadArtifactOfComponentInstanceFromServiceViaExternalAPI"/>
+        </methods>
+      </class>
+      <class name="org.openecomp.sdc.externalApis.GetFilteredAssetServlet">
+        <methods>
+            <include name="getResourceAssetBySpecifiedCategory"/>
+            <include name="getServiceAssetBySpecifiedCategory"/>
+        </methods>
+      </class>
+      <class name="org.openecomp.sdc.externalApis.SearchFilterCategoryExternalAPI">
+        <methods>
+            <include name="normativeResourceCategory" invocation-numbers="0"/>
+        </methods>
+      </class>      
+      <class name="org.openecomp.sdc.externalApis.GetCSARofVF">
+        <methods>
+            <include name="getServiceToscaModelCheckInState"/>
+            <include name="getRsourceToscaModelCertifyState"/>
+        </methods>
+      </class>
+      <class name="org.openecomp.sdc.externalApis.GetFilteredAssetServlet">
+        <methods>
+            <include name="getResourceAssetBySpecifiedCategory"/>
+            <include name="getServiceAssetBySpecifiedCategory"/>
+        </methods>
+      </class>
+      <class name="org.openecomp.sdc.externalApis.GetSpecificAssetMetadataServlet">
+        <methods>
+            <include name="getResourceAssetMetadataSuccess"/>
+            <include name="getServiceAssetMetadataWithResourceInstancesSuccess"/>
+        </methods>
+      </class>
+      <class name="org.openecomp.sdc.externalApis.AssetLifeCycle">
+        <methods>
+            <include name="theFlow"/>
+        </methods>
+      </class>
+    </classes>
+  </test> <!-- Test -->
+</suite> <!-- Suite -->
\ No newline at end of file
diff --git a/test-apis-ci/src/main/resources/ci/testSuites/externalAPIs.xml b/test-apis-ci/src/main/resources/ci/testSuites/externalAPIs.xml
index d32839b..6440dc1 100644
--- a/test-apis-ci/src/main/resources/ci/testSuites/externalAPIs.xml
+++ b/test-apis-ci/src/main/resources/ci/testSuites/externalAPIs.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
-<suite name="externalApis" configfailurepolicy="continue" verbose="2" parallel="methods" thread-count="1" data-provider-thread-count="1">
+<suite name="externalApis" configfailurepolicy="continue" verbose="2" parallel="methods" thread-count="1" data-provider-thread-count="10">
 	<test name="ExternalApis"> 
 		<classes>	
 			
diff --git a/test-apis-ci/src/main/resources/ci/testSuites/onap.xml b/test-apis-ci/src/main/resources/ci/testSuites/onap.xml
index 4aad368..707500a 100644
--- a/test-apis-ci/src/main/resources/ci/testSuites/onap.xml
+++ b/test-apis-ci/src/main/resources/ci/testSuites/onap.xml
@@ -7,17 +7,6 @@
 		<classes>	
 			
 			<class name="org.openecomp.sdc.ci.tests.sanity.Onboard"/>
-
-<!-- 	      <class name="org.openecomp.sdc.ci.tests.execute.product.ChangeServiceInstanceVersionTest"/>
-			      <class name="org.openecomp.sdc.ci.tests.execute.product.ProductCheckinTest"/>
-			      <class name="org.openecomp.sdc.ci.tests.execute.product.ProductCheckoutTest"/>
-			      <class name="org.openecomp.sdc.ci.tests.execute.product.ProductComponentInstanceCRUDTest"/>
-			      <class name="org.openecomp.sdc.ci.tests.execute.product.ProductCreateWithValidationsTest"/>
-			      <class name="org.openecomp.sdc.ci.tests.execute.product.ProductCrudTest"/>
-			      <class name="org.openecomp.sdc.ci.tests.execute.product.ProductGetFollowedTest"/>
-			      <class name="org.openecomp.sdc.ci.tests.execute.product.ProductUndoCheckoutTest"/>    -->
-			
-			
 		</classes>
 	</test>
 </suite> 
\ No newline at end of file
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/conf/TestAPIConfDependentTest.java b/test-apis-ci/src/test/java/org/openecomp/sdc/conf/TestAPIConfDependentTest.java
new file mode 100644
index 0000000..99b6888
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/conf/TestAPIConfDependentTest.java
@@ -0,0 +1,13 @@
+package org.openecomp.sdc.conf;
+
+import org.junit.BeforeClass;
+import org.openecomp.sdc.common.test.BaseConfDependent;
+
+public class TestAPIConfDependentTest extends BaseConfDependent{
+	@BeforeClass
+	public static void setupBeforeClass() {
+		componentName = "test-apis-ci";
+		confPath = "src/test/resources/config";
+		setUp();
+	}
+}
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/runners/RunTenantIsolationCucumberCI.java b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/runners/RunTenantIsolationCucumberCI.java
new file mode 100644
index 0000000..d9183fc
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/runners/RunTenantIsolationCucumberCI.java
@@ -0,0 +1,31 @@
+package org.openecomp.sdc.cucumber.runners;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.openecomp.sdc.conf.TestAPIConfDependentTest;
+
+import cucumber.api.CucumberOptions;
+import cucumber.api.junit.Cucumber;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(features = "classpath:cucumber/tenantIsolation.feature", glue = "org.openecomp.sdc.cucumber.steps")
+
+public class RunTenantIsolationCucumberCI extends TestAPIConfDependentTest {
+
+	@BeforeClass
+	public static void beforeClass() {
+	}
+
+	@AfterClass
+	public static void afterClassJUnit() {
+	}
+
+	@org.testng.annotations.BeforeClass
+	public static void beforeClassTestNg() {
+	}
+
+	@org.testng.annotations.AfterClass
+	public static void afterClassTestNG() {
+	}
+}
\ No newline at end of file
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/spring/ImportTableConfig.java b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/spring/ImportTableConfig.java
new file mode 100644
index 0000000..f0c7610
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/spring/ImportTableConfig.java
@@ -0,0 +1,19 @@
+package org.openecomp.sdc.cucumber.spring;
+
+import org.openecomp.sdc.be.dao.cassandra.CassandraClient;
+import org.openecomp.sdc.be.dao.cassandra.OperationalEnvironmentDao;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class ImportTableConfig {
+	@Bean(name = "cassandra-client")
+	public CassandraClient cassandraClient() {
+		return new CassandraClient();
+	}
+	
+	@Bean(name = "operational-environment-dao")
+	public OperationalEnvironmentDao operationalEnvironmentDao() {
+		return new OperationalEnvironmentDao();
+	}
+}
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/PrecannedTestExpectationCallback.java b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/PrecannedTestExpectationCallback.java
new file mode 100644
index 0000000..56802ec
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/PrecannedTestExpectationCallback.java
@@ -0,0 +1,31 @@
+package org.openecomp.sdc.cucumber.steps;
+
+import static org.mockserver.model.HttpResponse.response;
+
+import org.apache.http.entity.ContentType;
+import org.mockserver.mock.action.ExpectationCallback;
+import org.mockserver.model.Header;
+import org.mockserver.model.HttpRequest;
+import org.mockserver.model.HttpResponse;
+
+import com.google.common.net.HttpHeaders;
+
+public class PrecannedTestExpectationCallback implements ExpectationCallback  {
+	private static volatile int countRequests;
+
+	static HttpResponse httpResponse = response()
+			.withStatusCode(200)
+			.withHeaders(new Header(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType()));
+
+	@Override
+	public HttpResponse handle(HttpRequest httpRequest) {
+		countRequests++;
+		
+		System.out.println(
+				String.format("MSO Server Simulator Recieved %s Final Distribution Complete Rest Reports From ASDC",
+						countRequests));
+		
+		return httpResponse;
+	}
+	
+}
\ No newline at end of file
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/StepsTenantIsolationCI.java b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/StepsTenantIsolationCI.java
new file mode 100644
index 0000000..490b3e0
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/steps/StepsTenantIsolationCI.java
@@ -0,0 +1,597 @@
+package org.openecomp.sdc.cucumber.steps;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.mockserver.model.HttpCallback.callback;
+import static org.mockserver.model.HttpRequest.request;
+import static org.mockserver.model.HttpResponse.response;
+import static org.openecomp.sdc.common.datastructure.FunctionalInterfaces.retryMethodOnResult;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections.CollectionUtils;
+//import org.openecomp.sdc.dmaap.DmaapPublisher;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.mockserver.integration.ClientAndServer;
+import org.mockserver.model.Header;
+import org.mockserver.model.HttpRequest;
+import org.openecomp.sdc.api.IDistributionClient;
+import org.openecomp.sdc.api.consumer.IConfiguration;
+import org.openecomp.sdc.api.consumer.IFinalDistrStatusMessage;
+import org.openecomp.sdc.api.consumer.INotificationCallback;
+import org.openecomp.sdc.api.notification.IArtifactInfo;
+import org.openecomp.sdc.api.notification.INotificationData;
+import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;
+import org.openecomp.sdc.api.results.IDistributionClientResult;
+import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
+import org.openecomp.sdc.be.dao.cassandra.OperationalEnvironmentDao;
+import org.openecomp.sdc.be.datatypes.enums.EnvironmentStatusEnum;
+import org.openecomp.sdc.be.resources.data.OperationalEnvironmentEntry;
+import org.openecomp.sdc.common.datastructure.FunctionalInterfaces;
+import org.openecomp.sdc.common.datastructure.Wrapper;
+import org.openecomp.sdc.cucumber.spring.ImportTableConfig;
+import org.openecomp.sdc.http.HttpAsdcClient;
+import org.openecomp.sdc.http.HttpAsdcResponse;
+import org.openecomp.sdc.http.IHttpAsdcClient;
+import org.openecomp.sdc.impl.DistributionClientFactory;
+import org.openecomp.sdc.utils.ArtifactTypeEnum;
+import org.openecomp.sdc.utils.DistributionActionResultEnum;
+import org.openecomp.sdc.utils.DistributionStatusEnum;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+import com.google.common.base.Strings;
+import com.google.common.net.HttpHeaders;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+
+import cucumber.api.java.After;
+import cucumber.api.java.Before;
+import cucumber.api.java.en.Given;
+import cucumber.api.java.en.Then;
+import cucumber.api.java.en.When;
+import fj.data.Either;
+
+public class StepsTenantIsolationCI {
+
+	private Map<String, OperationalEnvironmentEntry> recordMap = new HashMap<>();
+	private OperationalEnvironmentDao operationalEnvironmentDao;
+	private ClientAndServer aaiMockServer;
+	private ClientAndServer msoMockServer;
+	private List<IDistributionClient> distributionClients = new ArrayList<>();
+
+	private List<String> wdFinalStatusSent = new ArrayList<>();
+
+	private HttpRequest msoHttpRequest;
+	private List<String> uuidServicesList;
+	private boolean cleanFlag = true;
+	private int maxStepWaitTimeMs;
+
+	private List<String> envIds = new ArrayList<>();
+	private List<OperationalEnvironmentEntry> envList = new ArrayList<>();
+	private String asdcAddress;
+	private volatile int numberOfFinalDistributionsSentByASDC;
+	private int numOfArtifactsToDownload;
+	private volatile int totalNumOfArtifactsToDownload;
+	private List<String> envNames = new ArrayList<>(Arrays.asList("Apple", "Orange", "Grape", "Pear", "Watermelon", "Bannana", "Cherry", "Coconut", "Fig", "Mango", "Peach", "Pineapple", "Plum", "Strawberries", "Apricot"));
+
+	private static final String AAI_RESPONSE_BODY_FMT = "{\"operational-environment-id\":\"UUID of Operational Environment\","
+			+ "\"operational-environment-name\":\"Op Env Name\"," + "\"operational-environment-type\":\"ECOMP\","
+			+ "\"operational-environment-status\":\"Activate\"," + "\"tenant-context\":\"%s\","
+			+ "\"workload-context\":\"%s\"," + "\"resource-version\":\"1505228226913\"," + "\"relationship-list\":{}}";
+
+	private static final String AAI_PATH_REGEX = "/aai/v12/cloud-infrastructure/operational-environments/.*";
+
+	private static final String MSO_PATH_REGEX = "/onap/mso/infra/modelDistributions/v1/distributions/.*";
+
+	@Before
+	public void beforeScenario() {
+		Collections.shuffle(envNames);
+		aaiMockServer = ClientAndServer.startClientAndServer(1111);
+		msoMockServer = ClientAndServer.startClientAndServer(1112);
+
+		this.operationalEnvironmentDao = createDaoObj();
+	}
+
+	@After
+	public void afterScenario() {
+		System.out.println("Cleaning Up After Scenario...");
+		aaiMockServer.stop();
+		msoMockServer.stop();
+		if (cleanFlag) {
+			envIds.stream().forEach(operationalEnvironmentDao::delete);
+		}
+		distributionClients.stream().forEach(IDistributionClient::stop);
+		System.out.println("Cleaning Up After Scenario Done");
+	}
+
+	// ############################# Given - Start #############################
+
+	@Given("^clean db after test is (.*)$")
+	public void clean_db_after_test_is(boolean cleanFlag) {
+		this.cleanFlag = cleanFlag;
+	}
+
+	@Given("^AAI returns (.*) and aai_body contains (.*) and (.*)$")
+	public void aai_returns(int retCode, String tenant, String workload) throws Throwable {
+		String aaiResponseBody = String.format(AAI_RESPONSE_BODY_FMT, tenant, workload);
+
+		setAaiMockServer(aaiResponseBody);
+
+		System.out.println(aaiMockServer.getClass());
+	}
+
+	@Given("^MSO-WD Simulators Started with topic name (.*)$")
+	public void notification_listner_simulators_started(String topicName) throws Throwable {
+		envList.forEach(env -> {
+			final IDistributionClient distClientSim = simulateDistributionClientWD(topicName, env);
+			distributionClients.add(distClientSim);
+		});
+
+	}
+
+	@Given("^MSO Final Distribution Simulator is UP$")
+	public void mso_Final_Distribution_Simulator_is_UP() throws Throwable {
+		msoHttpRequest = request().withPath(MSO_PATH_REGEX);
+		msoMockServer.when(msoHttpRequest).callback(
+				callback().withCallbackClass("org.openecomp.sdc.cucumber.steps.PrecannedTestExpectationCallback"));
+	}
+
+	@Given("^ASDC Address is (.*)$")
+	public void asdc_Address_is(String asdcAddress) throws Throwable {
+		this.asdcAddress = asdcAddress;
+
+	}
+
+	@Given("^ASDC Contains the following services (.*)$")
+	public void asdc_Contains_the_following_services(String listOfServicesUUID) throws Throwable {
+		uuidServicesList = Arrays.asList(listOfServicesUUID.split(",")).stream().map(String::trim)
+				.collect(Collectors.toList());
+
+		int maxMinWait = uuidServicesList.size() * envIds.size();
+		this.maxStepWaitTimeMs = 60000 * maxMinWait;
+		System.out.println(String.format("Set Max Step Wait Time To: %s Minutes", maxMinWait));
+	}
+
+	@Given("^The number of complete environments is (.*)$")
+	public void the_number_of_complete_environments_is(int envNum) throws Throwable {
+
+		int counter = 1;
+		while( envNum > envNames.size()){
+			envNames.add(String.valueOf(counter));
+			counter++;
+		}
+		
+		
+		for (int i = 0; i < envNum; i++) {
+			OperationalEnvironmentEntry preSaveEntry = new OperationalEnvironmentEntry();
+
+			preSaveEntry.setStatus(EnvironmentStatusEnum.COMPLETED);
+			preSaveEntry.setLastModified(new Date(System.currentTimeMillis()));
+
+			Set<String> uebAdresses = new HashSet<>();
+			uebAdresses.add("uebsb92sfdc.it.att.com");
+			preSaveEntry.setDmaapUebAddress(uebAdresses);
+			preSaveEntry.setIsProduction(false);
+			preSaveEntry.setUebApikey("sSJc5qiBnKy2qrlc");
+			preSaveEntry.setUebSecretKey("4ZRPzNJfEUK0sSNBvccd2m7X");
+			preSaveEntry.setTenant("TEST");
+			preSaveEntry.setEcompWorkloadContext("ECOMP_E2E-IST");
+
+			// String envId = UUID.randomUUID().toString();
+			String envId = envNames.get(i);
+			preSaveEntry.setEnvironmentId(envId);
+			envIds.add(envId);
+			envList.add(preSaveEntry);
+			operationalEnvironmentDao.save(preSaveEntry);
+		}
+	}
+
+	@Given("^The number of artifacts each Simulator downloads from a service is (.*)$")
+	public void number_of_artifacts_each_simulator_downloads(int numOfArtifactsToDownload) throws Throwable {
+		this.numOfArtifactsToDownload = numOfArtifactsToDownload;
+	}
+
+	// ############################# Given - End #############################
+
+	// ############################# When - Start #############################
+	@When("^Distribution Requests are Sent By MSO$")
+	public void distribution_Requests_are_Sent_By_MSO() throws Throwable {
+		envList.stream().forEach(this::distributeServiceInEnv);
+
+	}
+
+	@When("^The Number Of Operational Envrinoments that created is (.*) and Records are added with data (.*)$")
+	public void operational_envrinoments_records_are_added_with_data(int numOfRecords, String recordData)
+			throws Throwable {
+		for (int i = 0; i < numOfRecords; i++) {
+			OperationalEnvironmentEntry preSaveEntry = new OperationalEnvironmentEntry();
+			JsonElement root = new JsonParser().parse(recordData);
+
+			String originalStatus = root.getAsJsonObject().get("status").getAsString();
+			int delta = root.getAsJsonObject().get("last_modified_delta").getAsInt();
+			preSaveEntry.setStatus(EnvironmentStatusEnum.getByName(originalStatus));
+			long last_modified = System.currentTimeMillis() + delta * 1000;
+			preSaveEntry.setLastModified(new Date(last_modified));
+			String envId = UUID.randomUUID().toString();
+			preSaveEntry.setEnvironmentId(envId);
+			envIds.add(envId);
+			// envrionmentIds.add(envId);
+			operationalEnvironmentDao.save(preSaveEntry);
+
+		}
+
+	}
+
+	// ############################# When - End #############################
+
+	// ############################# Then - Start #############################
+	@Then("^Operational Environment record contains tenant field (.*$)")
+	public void operational_environment_record_contains_tenant(boolean tenantExist) throws Throwable {
+		envIds.forEach(envId -> {
+			validateStringFieldPresent(tenantExist, OperationalEnvironmentEntry::getTenant, envId,
+					"Tenant is not as expected");
+		});
+	}
+
+	@Then("^Operational Environment record contains workload field (.*$)")
+	public void operational_environment_record_contains_workload(boolean workloadExist) throws Throwable {
+		envIds.forEach(envId -> {
+			validateStringFieldPresent(workloadExist, OperationalEnvironmentEntry::getEcompWorkloadContext, envId,
+					"Workload is not as expected");
+		});
+	}
+
+	@Then("^Operational Environment record contains UEB Address field (.*$)")
+	public void operational_environment_record_contains_ueb_address(boolean uebAddresExist) throws Throwable {
+		envIds.forEach(envId -> {
+			validateStringFieldPresent(uebAddresExist, this::convertUebAddressToList, envId,
+					"UEB Address is not as expected");
+		});
+	}
+
+	@Then("^The Number Of Environment is (.*) with status (.*)$")
+	public void the_Number_Of_Environment_Created_is(int numberOfEnvsCreated, String status) throws Throwable {
+		// Write code here that turns the phrase above into concrete actions
+
+		retryMethodOnResult(() -> getCurrentEnvironmets(status), envList -> envList.size() == numberOfEnvsCreated,
+				40000, 500);
+
+		List<OperationalEnvironmentEntry> environmentsFound = getCurrentEnvironmets(status);
+
+		assertThat(environmentsFound.size(), is(numberOfEnvsCreated));
+
+		environmentsFound.forEach(env -> recordMap.put(env.getEnvironmentId(), env));
+		envList.addAll(environmentsFound);
+	}
+
+	@Then("^MSO Final Distribution Recieved Correct Number Of Request$")
+	public void mso_final_distribution_recieved_request() throws Throwable {
+		int expectedNumberOfRequestsSentByASDC = calculateExcpectedNumberOfDistributionRequets();
+		Function<Integer, Boolean> resultVerifier = actualStatusList -> actualStatusList >= expectedNumberOfRequestsSentByASDC;
+		retryMethodOnResult(() -> numberOfFinalDistributionsSentByASDC(expectedNumberOfRequestsSentByASDC),
+				resultVerifier, maxStepWaitTimeMs, 500);
+		int actualNumberOfRequestsSentByASDC = numberOfFinalDistributionsSentByASDC(expectedNumberOfRequestsSentByASDC);
+		assertThat(actualNumberOfRequestsSentByASDC, is(expectedNumberOfRequestsSentByASDC));
+	}
+
+	@Then("^All MSO-WD Simulators Sent The Distribution Complete Notifications$")
+	public void all_mso_wd_simulators_sent_the_distribution_complete_notifications() {
+		// Wait Watch Dogs To Send Final Distribution
+		int excpectedNumberOfDistributionCompleteNotifications = calculateExcpectedNumberOfDistributionRequets();
+		final Function<List<String>, Boolean> resultVerifier = actualStatusList -> actualStatusList
+				.size() == excpectedNumberOfDistributionCompleteNotifications;
+		retryMethodOnResult(() -> wdFinalStatusSent, resultVerifier, maxStepWaitTimeMs, 500);
+		assertThat(wdFinalStatusSent.size(), is(excpectedNumberOfDistributionCompleteNotifications));
+	}
+	@Then("^All Artifacts were downloaded by Simulators$")
+	public void all_artifacts_downloaded() {
+		// Wait Watch Dogs To Send Final Distribution
+		int excpectedNumberOfArtifactsToDownload = numOfArtifactsToDownload * envIds.size() * uuidServicesList.size();
+		assertThat(totalNumOfArtifactsToDownload, is(excpectedNumberOfArtifactsToDownload));
+	}
+	// ############################# Then - End #############################
+
+	private List<OperationalEnvironmentEntry> getCurrentEnvironmets(String status) {
+		Either<List<OperationalEnvironmentEntry>, CassandraOperationStatus> eitherStatus = operationalEnvironmentDao
+				.getByEnvironmentsStatus(EnvironmentStatusEnum.getByName(status));
+		assertThat(eitherStatus.isLeft(), is(true));
+
+		List<OperationalEnvironmentEntry> environmentsRetrieved = eitherStatus.left().value();
+
+		List<OperationalEnvironmentEntry> environmentsFound = environmentsRetrieved.stream()
+				.filter(env -> envIds.contains(env.getEnvironmentId())).collect(Collectors.toList());
+		return environmentsFound;
+	}
+
+	private int numberOfFinalDistributionsSentByASDC(int expectedNumberOfRequestsSentByASDC) {
+		final int newVal = msoMockServer.retrieveRecordedRequests(msoHttpRequest).length;
+		if (newVal != numberOfFinalDistributionsSentByASDC) {
+			System.out.println(String.format(
+					"MSO Server Simulator Recieved %s/%s Final Distribution Complete Rest Reports From ASDC", newVal,
+					expectedNumberOfRequestsSentByASDC));
+			numberOfFinalDistributionsSentByASDC = newVal;
+		}
+
+		return newVal;
+	}
+
+	private int calculateExcpectedNumberOfDistributionRequets() {
+		int numberOfDistributionRequests = envList.size() * uuidServicesList.size();
+		return numberOfDistributionRequests;
+	}
+
+	private static OperationalEnvironmentDao createDaoObj() {
+		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ImportTableConfig.class);
+		final OperationalEnvironmentDao openvDao = (OperationalEnvironmentDao) context
+				.getBean("operational-environment-dao");
+		return openvDao;
+	}
+
+	private OperationalEnvironmentEntry getRecord(String environmentId) {
+		Either<OperationalEnvironmentEntry, CassandraOperationStatus> result = operationalEnvironmentDao
+				.get(environmentId);
+		return result.isLeft() ? result.left().value() : null;
+	}
+
+	private void validateStringFieldPresent(boolean fieldExist,
+			Function<OperationalEnvironmentEntry, String> getFieldFunc, String envId, String msg) {
+		OperationalEnvironmentEntry record = recordMap.computeIfAbsent(envId, this::getRecord);
+
+		assertNotNull(record, "Expected DB record was not found");
+
+		String actualValue = getFieldFunc.apply(record);
+
+		assertEquals(fieldExist, !Strings.isNullOrEmpty(actualValue), msg);
+	}
+
+	private void setAaiMockServer(String aaiResponseBody) {
+		HttpRequest httpRequest = request().withMethod("GET").withPath(AAI_PATH_REGEX)
+				.withHeaders(new Header(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType()));
+
+		aaiMockServer.when(httpRequest)
+				.respond(response()
+						.withHeaders(new Header(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType()))
+						.withBody(aaiResponseBody));
+	}
+
+	private IDistributionClient simulateDistributionClientWD(String topicName, OperationalEnvironmentEntry opEnv) {
+
+		IDistributionClient client = DistributionClientFactory.createDistributionClient();
+		final IConfiguration buildDistributionClientConfiguration = buildDistributionClientConfiguration(topicName,
+				opEnv);
+		IDistributionClientResult initResult = client.init(buildDistributionClientConfiguration,
+				new INotificationCallback() {
+
+					@Override
+					public void activateCallback(INotificationData data) {
+						buildWdSimulatorCallback(opEnv, client, buildDistributionClientConfiguration, data);
+
+					}
+
+				});
+		assertThat(initResult.getDistributionActionResult(), is(DistributionActionResultEnum.SUCCESS));
+		IDistributionClientResult startResult = client.start();
+		assertThat(startResult.getDistributionActionResult(), is(DistributionActionResultEnum.SUCCESS));
+		System.out.println(String.format("WD Simulator On Environment:\"%s\" Started Successfully",
+				buildDistributionClientConfiguration.getConsumerID()));
+		return client;
+	}
+
+	private IFinalDistrStatusMessage buildFinalDistribution() {
+		return new IFinalDistrStatusMessage() {
+
+			@Override
+			public long getTimestamp() {
+				return System.currentTimeMillis();
+			}
+
+			@Override
+			public DistributionStatusEnum getStatus() {
+				return DistributionStatusEnum.DISTRIBUTION_COMPLETE_OK;
+			}
+
+			@Override
+			public String getDistributionID() {
+				return "FakeDistributionId";
+			}
+		};
+	}
+
+	private IConfiguration buildDistributionClientConfiguration(String topicName, OperationalEnvironmentEntry opEnv) {
+		return new IConfiguration() {
+
+			public String getUser() {
+				return "ci";
+			}
+
+			public int getPollingTimeout() {
+				return 20;
+			}
+
+			public int getPollingInterval() {
+				return 20;
+			}
+
+			public String getPassword() {
+				return "123456";
+			}
+
+			public String getEnvironmentName() {
+				return topicName;
+			}
+
+			public String getConsumerID() {
+				return opEnv.getEnvironmentId();
+			}
+
+			public String getConsumerGroup() {
+				return String.format("BenchMarkDistributionClientConsumerGroup%s", opEnv.getEnvironmentId());
+			}
+
+			public String getAsdcAddress() {
+				return String.format("%s:8443", asdcAddress);
+			}
+
+			@Override
+			public String getKeyStorePath() {
+				// TODO Auto-generated method stub
+				return null;
+			}
+
+			@Override
+			public String getKeyStorePassword() {
+				// TODO Auto-generated method stub
+				return null;
+			}
+
+			@Override
+			public boolean activateServerTLSAuth() {
+				// TODO Auto-generated method stub
+				return false;
+			}
+
+			@Override
+			public List<String> getRelevantArtifactTypes() {
+				return Arrays.asList(ArtifactTypeEnum.values()).stream()
+						.map(artifactTypeEnum -> artifactTypeEnum.name()).collect(Collectors.toList());
+			}
+
+			@Override
+			public boolean isFilterInEmptyResources() {
+				// TODO Auto-generated method stub
+				return false;
+			}
+
+			@Override
+			public Boolean isUseHttpsWithDmaap() {
+				return null;
+			}
+
+			@Override
+			public List<String> getMsgBusAddress() {
+				return opEnv.getDmaapUebAddress().stream().map(this::extractHost).collect(Collectors.toList());
+			}
+
+			private String extractHost(String url) {
+				return url.split(":")[0];
+			}
+		};
+	}
+
+	private void distributeServiceInEnv(OperationalEnvironmentEntry env) {
+		uuidServicesList.stream().forEach(serviceUUID -> distributeSingleService(env, serviceUUID));
+	}
+
+	private void distributeSingleService(OperationalEnvironmentEntry env, String serviceUUID) {
+		IHttpAsdcClient client = new HttpAsdcClient(buildDistributionClientConfiguration(StringUtils.EMPTY, env));
+		String pattern = "/sdc/v1/catalog/services/%s/distribution/%s/activate";
+		String requestUrl = String.format(pattern, serviceUUID, env.getEnvironmentId());
+		String requestBody = String.format("{\"workloadContext\":\"%s\"}", env.getEnvironmentId());
+		StringEntity body = new StringEntity(requestBody, ContentType.APPLICATION_JSON);
+		Map<String, String> headersMap = new HashMap<>();
+		headersMap.put("USER_ID", "cs0008");
+		headersMap.put("X-ECOMP-InstanceID", "test");
+		headersMap.put("Content-Type", "application/json");
+
+		HttpAsdcResponse postRequest = FunctionalInterfaces.retryMethodOnResult(
+				() -> distributeMethod(client, requestUrl, serviceUUID, body, headersMap, env.getEnvironmentId()),
+				resp -> resp.getStatus() == HttpStatus.SC_ACCEPTED);
+		assertThat(postRequest.getStatus(), is(HttpStatus.SC_ACCEPTED));
+
+	}
+
+	private HttpAsdcResponse distributeMethod(IHttpAsdcClient client, String requestUrl, String serviceUUID,
+			StringEntity body, Map<String, String> headersMap, String envId) {
+
+		final HttpAsdcResponse postRequest = client.postRequest(requestUrl, body, headersMap);
+		final String message = String.format(
+				"MSO Client Simulator Distributes Service:%s On Environment:\"%s\" - Recieved Response: %s", serviceUUID, envId,
+				postRequest.getStatus());
+		if (postRequest.getStatus() != HttpStatus.SC_ACCEPTED) {
+			System.err.println(message);
+		} else {
+			System.out.println(message);
+		}
+
+		return postRequest;
+	}
+
+	private String convertUebAddressToList(OperationalEnvironmentEntry op) {
+		Set<String> dmaapUebAddress = op.getDmaapUebAddress();
+		Wrapper<String> resultWrapper = new Wrapper<>(StringUtils.EMPTY);
+		if (!CollectionUtils.isEmpty(dmaapUebAddress)) {
+			dmaapUebAddress.stream()
+					.forEach(uebAddress -> resultWrapper.setInnerElement(resultWrapper.getInnerElement() + uebAddress));
+		}
+
+		return resultWrapper.getInnerElement();
+	}
+
+	private void buildWdSimulatorCallback(OperationalEnvironmentEntry opEnv, IDistributionClient client,
+			final IConfiguration buildDistributionClientConfiguration, INotificationData data) {
+		if (StringUtils.equals(data.getWorkloadContext(), opEnv.getEnvironmentId())) {
+			
+			final String expectedArtifactType = org.openecomp.sdc.common.api.ArtifactTypeEnum.MODEL_INVENTORY_PROFILE.name();
+			Optional<IArtifactInfo> optional = data.getServiceArtifacts().stream().filter( artifact -> {
+				return StringUtils.equals(artifact.getArtifactType(), expectedArtifactType);
+			}).findAny();
+			
+			for (int i = 0; i < numOfArtifactsToDownload; i++) {
+				optional.ifPresent( artifactInfo -> simulateDownload(client , artifactInfo, data) );
+				optional.orElseThrow( () -> handleArtifactNotFound(expectedArtifactType, data));
+				
+			}
+			if(  numOfArtifactsToDownload > 0 ){
+				System.out.println(String.format(
+						"ASDC Consumer Simulator On Environment:\"%s\" Downloaded %s Artifacts From ASDC Service with UUID:%s  Total Artifacts Downloaded from ASDC is: %s",
+						data.getWorkloadContext(), numOfArtifactsToDownload,
+						data.getServiceUUID(), totalNumOfArtifactsToDownload));
+			}
+			
+			IDistributionClientResult finalDistrStatus = client.sendFinalDistrStatus(buildFinalDistribution());
+			assertThat(finalDistrStatus.getDistributionActionResult(), is(DistributionActionResultEnum.SUCCESS));
+			wdFinalStatusSent.add(data.getWorkloadContext());
+
+			System.out.println(String.format(
+					"WD Simulator On Environment:\"%s\" Recieved Notification From ASDC On WorkLoad: %s And Service UUID:%s And Sends Distribution Complete Notification",
+					buildDistributionClientConfiguration.getConsumerID(), data.getWorkloadContext(),
+					data.getServiceUUID()));
+		}
+	}
+	
+	private IllegalStateException handleArtifactNotFound(String expectedArtifactType, INotificationData data ){
+		final String stringMessage = String.format("Did Not Find Artifact of type: %s to download from service with UUID:%s", expectedArtifactType, data.getServiceUUID());
+		System.err.println(stringMessage); 
+		return new IllegalStateException(stringMessage);
+	 
+	}
+	
+	private void simulateDownload(IDistributionClient client, IArtifactInfo info, INotificationData data){
+		IDistributionClientDownloadResult downloadResult = client.download(info);
+		if( downloadResult.getDistributionActionResult() != DistributionActionResultEnum.SUCCESS ){
+			System.err.println(String.format("Client Simulator %s Failed to download artifact from service : %s", client.getConfiguration().getConsumerID(), data.getServiceUUID()));
+			assertThat(downloadResult.getDistributionActionResult(), is(DistributionActionResultEnum.SUCCESS));
+		}
+		else{
+			totalNumOfArtifactsToDownload++;
+		
+		}
+	}
+}
diff --git a/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/utils/RunnerSession.java b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/utils/RunnerSession.java
new file mode 100644
index 0000000..c93b3d2
--- /dev/null
+++ b/test-apis-ci/src/test/java/org/openecomp/sdc/cucumber/utils/RunnerSession.java
@@ -0,0 +1,61 @@
+package org.openecomp.sdc.cucumber.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Store Data here that is relevant for the whole runner and not just a single scenario.
+ * @author ms172g
+ *
+ */
+public class RunnerSession {
+	private static final RunnerSession instance = new RunnerSession();
+	private Map<String, String> stringElements;
+	private Map<String, Integer> intElements;
+	private Map<String, Object> elements;
+	private RunnerSession(){
+		stringElements = new HashMap<>();
+		intElements = new HashMap<>();
+		elements = new HashMap<>();
+	}
+	public static RunnerSession getSession(){
+		return instance;
+	}
+
+	public void putInSession(String key, String value){
+		stringElements.put(key, value);
+	}
+	
+	public String getString(String key){
+		return stringElements.get(key);
+		
+	}
+	
+	public void putInSession(String key, Integer value){
+		intElements.put(key, value);
+	}
+	
+	
+	public Integer getInt(String key){
+		return intElements.get(key);
+	}
+	
+	public void putInSession(String key, Object value) {
+		elements.put(key, value);
+		
+	}
+	
+	public Object get(String key){
+		return elements.get(key);
+	}
+	
+	public void clean(){
+		intElements.clear();
+		stringElements.clear();
+	}
+	
+	
+	
+	
+	
+}
diff --git a/test-apis-ci/src/test/resources/CI/tests/tenantIsolationCI/aai_error.properties b/test-apis-ci/src/test/resources/CI/tests/tenantIsolationCI/aai_error.properties
new file mode 100644
index 0000000..b4ae9e3
--- /dev/null
+++ b/test-apis-ci/src/test/resources/CI/tests/tenantIsolationCI/aai_error.properties
@@ -0,0 +1,10 @@
+400=Bad Request
+401=Unauthorized
+403=Forbidden
+404=Not Found
+405=Method Not Allowed
+409=The request could not be completed due to a conflict with the current state of the target resource
+410=You are using a version of the API that has been retired
+412=Precondition failed
+415=Unsupported Media Type
+500=Internal Server Error
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/catalogMgmtTest.properties b/test-apis-ci/src/test/resources/catalogMgmtTest.properties
new file mode 100644
index 0000000..7a26a0c
--- /dev/null
+++ b/test-apis-ci/src/test/resources/catalogMgmtTest.properties
@@ -0,0 +1,34 @@
+TransportType=DME2
+Latitude =32.109333
+Longitude =34.855499
+Version =1.0
+ServiceName =dmaap-v1.dev.dmaap.dt.saat.acsi.att.com/events
+Environment =TEST
+Partner=BOT_R
+routeOffer=MR1
+SubContextPath =/
+Protocol =http
+MethodType =POST
+username = m09875@sdc.att.com
+password =Aa123456
+contenttype = application/json
+Authorization = Basic bTEzMzMxQGNjZC5hdHQuY29tOkFhMTIzNDU2
+authKey=
+authDate=
+#Dmaap Server Url port 3904-HTTP 3905-https
+host=olsd004.wnsnet.attws.com:3904
+###topic=com.att.ccd.CCD-CatalogManagement-go539p or  com.att.sdc.SDCforTestDev | com.att.sdc.23911-SDCforTestDev-v001
+topic=com.att.sdc.23911-SDCforTestDev-v001
+partition=1
+maxBatchSize=100
+maxAgeMs=250
+AFT_DME2_EXCHANGE_REQUEST_HANDLERS=com.att.nsa.test.PreferredRouteRequestHandler
+AFT_DME2_EXCHANGE_REPLY_HANDLERS=com.att.nsa.test.PreferredRouteReplyHandler
+AFT_DME2_REQ_TRACE_ON=true
+AFT_ENVIRONMENT=AFTUAT
+AFT_DME2_EP_CONN_TIMEOUT=15000
+AFT_DME2_ROUNDTRIP_TIMEOUT_MS=240000
+AFT_DME2_EP_READ_TIMEOUT_MS=50000
+sessionstickinessrequired=NO
+DME2preferredRouterFilePath=src/test/resources/preferredRouter.txt
+MessageSentThreadOccurance=50
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/catalogMgmtTest.yaml b/test-apis-ci/src/test/resources/catalogMgmtTest.yaml
new file mode 100644
index 0000000..ee419f4
--- /dev/null
+++ b/test-apis-ci/src/test/resources/catalogMgmtTest.yaml
@@ -0,0 +1,6 @@
+publisherPropertiesFilePath: "catalogMgmtTest.properties"
+topicMessages:
+  - "{\"transactionId\": \"221e8cbe-493d-4848-b46c-a552b8928075\",\"notificationReason\":[\"product\"],\"republish\":\"No\",\"Authorization\": \"Basic bTEzMzMxQGNjZC5hdHQuY29tOkFhMTIzNDU2\"}"
+  #- "{\"transactionId\": \"221e8cbe-493d-4848-b46c-a552b8928075\",\"notificationReason\":[\"logo\"],\"republish\":\"No\"}"
+  #- "{\"transactionId\": \"221e8cbe-493d-4848-b46c-a552b8928075\",\"notificationReason\":[\"availabilitymatrix\"],\"republish\":\"No\"}"
+  #- "{\"transactionId\": \"221e8cbe-493d-4848-b46c-a552b8928075\",\"notificationReason\":[\"product\",\"availabilitymatrix\"],\"republish\":\"No\"}"
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/configuration1.yaml b/test-apis-ci/src/test/resources/config/configuration1.yaml
new file mode 100644
index 0000000..12ab2c7
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/configuration1.yaml
@@ -0,0 +1,17 @@
+version: 1.0
+released: 2012-11-30
+
+# Connection parameters
+connection:
+    url: jdbc:mysql://localhost:3306/db
+    poolSize: 5
+
+# Protocols
+protocols:
+   - http
+   - https
+
+# Users
+users:
+    tom: passwd
+    bob: passwd
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/elasticsearch.yml b/test-apis-ci/src/test/resources/config/elasticsearch.yml
new file mode 100644
index 0000000..a6a2c1b
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/elasticsearch.yml
@@ -0,0 +1,387 @@
+
+cluster.name: elasticsearch_1_5_2
+  
+discovery.zen.ping.multicast.enabled: false
+discovery.zen.ping.unicast.enabled: true
+discovery.zen.ping.unicast.hosts: elasticsearch_host
+
+
+
+##################### Elasticsearch Configuration Example #####################
+
+# This file contains an overview of various configuration settings,
+# targeted at operations staff. Application developers should
+# consult the guide at <http://elasticsearch.org/guide>.
+#
+# The installation procedure is covered at
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html>.
+#
+# Elasticsearch comes with reasonable defaults for most settings,
+# so you can try it out without bothering with configuration.
+#
+# Most of the time, these defaults are just fine for running a production
+# cluster. If you're fine-tuning your cluster, or wondering about the
+# effect of certain configuration option, please _do ask_ on the
+# mailing list or IRC channel [http://elasticsearch.org/community].
+
+# Any element in the configuration can be replaced with environment variables
+# by placing them in ${...} notation. For example:
+#
+# node.rack: ${RACK_ENV_VAR}
+
+# For information on supported formats and syntax for the config file, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html>
+
+
+################################### Cluster ###################################
+
+# Cluster name identifies your cluster for auto-discovery. If you're running
+# multiple clusters on the same network, make sure you're using unique names.
+#
+# cluster.name: elasticsearch
+
+
+#################################### Node #####################################
+
+# Node names are generated dynamically on startup, so you're relieved
+# from configuring them manually. You can tie this node to a specific name:
+#
+# node.name: "Franz Kafka"
+
+# Every node can be configured to allow or deny being eligible as the master,
+# and to allow or deny to store the data.
+#
+# Allow this node to be eligible as a master node (enabled by default):
+#
+# node.master: true
+#
+# Allow this node to store data (enabled by default):
+#
+# node.data: true
+
+# You can exploit these settings to design advanced cluster topologies.
+#
+# 1. You want this node to never become a master node, only to hold data.
+#    This will be the "workhorse" of your cluster.
+#
+# node.master: false
+# node.data: true
+#
+# 2. You want this node to only serve as a master: to not store any data and
+#    to have free resources. This will be the "coordinator" of your cluster.
+#
+# node.master: true
+# node.data: false
+#
+# 3. You want this node to be neither master nor data node, but
+#    to act as a "search load balancer" (fetching data from nodes,
+#    aggregating results, etc.)
+#
+# node.master: false
+# node.data: false
+
+# Use the Cluster Health API [http://localhost:9200/_cluster/health], the
+# Node Info API [http://localhost:9200/_nodes] or GUI tools
+# such as <http://www.elasticsearch.org/overview/marvel/>,
+# <http://github.com/karmi/elasticsearch-paramedic>,
+# <http://github.com/lukas-vlcek/bigdesk> and
+# <http://mobz.github.com/elasticsearch-head> to inspect the cluster state.
+
+# A node can have generic attributes associated with it, which can later be used
+# for customized shard allocation filtering, or allocation awareness. An attribute
+# is a simple key value pair, similar to node.key: value, here is an example:
+#
+# node.rack: rack314
+
+# By default, multiple nodes are allowed to start from the same installation location
+# to disable it, set the following:
+# node.max_local_storage_nodes: 1
+
+
+#################################### Index ####################################
+
+# You can set a number of options (such as shard/replica options, mapping
+# or analyzer definitions, translog settings, ...) for indices globally,
+# in this file.
+#
+# Note, that it makes more sense to configure index settings specifically for
+# a certain index, either when creating it or by using the index templates API.
+#
+# See <http://elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules.html> and
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html>
+# for more information.
+
+# Set the number of shards (splits) of an index (5 by default):
+#
+# index.number_of_shards: 5
+
+# Set the number of replicas (additional copies) of an index (1 by default):
+#
+# index.number_of_replicas: 1
+
+# Note, that for development on a local machine, with small indices, it usually
+# makes sense to "disable" the distributed features:
+#
+index.number_of_shards: 1
+index.number_of_replicas: 0
+
+# These settings directly affect the performance of index and search operations
+# in your cluster. Assuming you have enough machines to hold shards and
+# replicas, the rule of thumb is:
+#
+# 1. Having more *shards* enhances the _indexing_ performance and allows to
+#    _distribute_ a big index across machines.
+# 2. Having more *replicas* enhances the _search_ performance and improves the
+#    cluster _availability_.
+#
+# The "number_of_shards" is a one-time setting for an index.
+#
+# The "number_of_replicas" can be increased or decreased anytime,
+# by using the Index Update Settings API.
+#
+# Elasticsearch takes care about load balancing, relocating, gathering the
+# results from nodes, etc. Experiment with different settings to fine-tune
+# your setup.
+
+# Use the Index Status API (<http://localhost:9200/A/_status>) to inspect
+# the index status.
+
+
+#################################### Paths ####################################
+
+# Path to directory containing configuration (this file and logging.yml):
+#
+path.conf: /src/test/resources
+
+# Path to directory where to store index data allocated for this node.
+#
+path.data: target/esdata
+#
+# Can optionally include more than one location, causing data to be striped across
+# the locations (a la RAID 0) on a file level, favouring locations with most free
+# space on creation. For example:
+#
+# path.data: /path/to/data1,/path/to/data2
+
+# Path to temporary files:
+#
+path.work: /target/eswork
+
+# Path to log files:
+#
+path.logs: /target/eslogs
+
+# Path to where plugins are installed:
+#
+# path.plugins: /path/to/plugins
+
+
+#################################### Plugin ###################################
+
+# If a plugin listed here is not installed for current node, the node will not start.
+#
+# plugin.mandatory: mapper-attachments,lang-groovy
+
+
+################################### Memory ####################################
+
+# Elasticsearch performs poorly when JVM starts swapping: you should ensure that
+# it _never_ swaps.
+#
+# Set this property to true to lock the memory:
+#
+# bootstrap.mlockall: true
+
+# Make sure that the ES_MIN_MEM and ES_MAX_MEM environment variables are set
+# to the same value, and that the machine has enough memory to allocate
+# for Elasticsearch, leaving enough memory for the operating system itself.
+#
+# You should also make sure that the Elasticsearch process is allowed to lock
+# the memory, eg. by using `ulimit -l unlimited`.
+
+
+############################## Network And HTTP ###############################
+
+# Elasticsearch, by default, binds itself to the 0.0.0.0 address, and listens
+# on port [9200-9300] for HTTP traffic and on port [9300-9400] for node-to-node
+# communication. (the range means that if the port is busy, it will automatically
+# try the next port).
+
+# Set the bind address specifically (IPv4 or IPv6):
+#
+# network.bind_host: 192.168.0.1
+
+# Set the address other nodes will use to communicate with this node. If not
+# set, it is automatically derived. It must point to an actual IP address.
+#
+# network.publish_host: 192.168.0.1
+
+# Set both 'bind_host' and 'publish_host':
+#
+# network.host: 192.168.0.1
+
+# Set a custom port for the node to node communication (9300 by default):
+#
+# transport.tcp.port: 9300
+
+# Enable compression for all communication between nodes (disabled by default):
+#
+# transport.tcp.compress: true
+
+# Set a custom port to listen for HTTP traffic:
+#
+# http.port: 9200
+
+# Set a custom allowed content length:
+#
+# http.max_content_length: 100mb
+
+# Disable HTTP completely:
+#
+# http.enabled: false
+
+
+################################### Gateway ###################################
+
+# The gateway allows for persisting the cluster state between full cluster
+# restarts. Every change to the state (such as adding an index) will be stored
+# in the gateway, and when the cluster starts up for the first time,
+# it will read its state from the gateway.
+
+# There are several types of gateway implementations. For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-gateway.html>.
+
+# The default gateway type is the "local" gateway (recommended):
+#
+# gateway.type: local
+
+# Settings below control how and when to start the initial recovery process on
+# a full cluster restart (to reuse as much local data as possible when using shared
+# gateway).
+
+# Allow recovery process after N nodes in a cluster are up:
+#
+gateway.recover_after_nodes: 1
+
+# Set the timeout to initiate the recovery process, once the N nodes
+# from previous setting are up (accepts time value):
+#
+# gateway.recover_after_time: 5m
+
+# Set how many nodes are expected in this cluster. Once these N nodes
+# are up (and recover_after_nodes is met), begin recovery process immediately
+# (without waiting for recover_after_time to expire):
+#
+gateway.expected_nodes: 1
+
+
+############################# Recovery Throttling #############################
+
+# These settings allow to control the process of shards allocation between
+# nodes during initial recovery, replica allocation, rebalancing,
+# or when adding and removing nodes.
+
+# Set the number of concurrent recoveries happening on a node:
+#
+# 1. During the initial recovery
+#
+# cluster.routing.allocation.node_initial_primaries_recoveries: 4
+#
+# 2. During adding/removing nodes, rebalancing, etc
+#
+# cluster.routing.allocation.node_concurrent_recoveries: 2
+
+# Set to throttle throughput when recovering (eg. 100mb, by default 20mb):
+#
+# indices.recovery.max_bytes_per_sec: 20mb
+
+# Set to limit the number of open concurrent streams when
+# recovering a shard from a peer:
+#
+# indices.recovery.concurrent_streams: 5
+
+
+################################## Discovery ##################################
+
+# Discovery infrastructure ensures nodes can be found within a cluster
+# and master node is elected. Multicast discovery is the default.
+
+# Set to ensure a node sees N other master eligible nodes to be considered
+# operational within the cluster. Its recommended to set it to a higher value
+# than 1 when running more than 2 nodes in the cluster.
+#
+# discovery.zen.minimum_master_nodes: 1
+
+# Set the time to wait for ping responses from other nodes when discovering.
+# Set this option to a higher value on a slow or congested network
+# to minimize discovery failures:
+#
+# discovery.zen.ping.timeout: 3s
+
+# For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html>
+
+# Unicast discovery allows to explicitly control which nodes will be used
+# to discover the cluster. It can be used when multicast is not present,
+# or to restrict the cluster communication-wise.
+#
+# 1. Disable multicast discovery (enabled by default):
+#
+# discovery.zen.ping.multicast.enabled: false
+#
+# 2. Configure an initial list of master nodes in the cluster
+#    to perform discovery when new nodes (master or data) are started:
+#
+# discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
+
+# EC2 discovery allows to use AWS EC2 API in order to perform discovery.
+#
+# You have to install the cloud-aws plugin for enabling the EC2 discovery.
+#
+# For more information, see
+# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-ec2.html>
+#
+# See <http://elasticsearch.org/tutorials/elasticsearch-on-ec2/>
+# for a step-by-step tutorial.
+
+# GCE discovery allows to use Google Compute Engine API in order to perform discovery.
+#
+# You have to install the cloud-gce plugin for enabling the GCE discovery.
+#
+# For more information, see <https://github.com/elasticsearch/elasticsearch-cloud-gce>.
+
+# Azure discovery allows to use Azure API in order to perform discovery.
+#
+# You have to install the cloud-azure plugin for enabling the Azure discovery.
+#
+# For more information, see <https://github.com/elasticsearch/elasticsearch-cloud-azure>.
+
+################################## Slow Log ##################################
+
+# Shard level query and fetch threshold logging.
+
+#index.search.slowlog.threshold.query.warn: 10s
+#index.search.slowlog.threshold.query.info: 5s
+#index.search.slowlog.threshold.query.debug: 2s
+#index.search.slowlog.threshold.query.trace: 500ms
+
+#index.search.slowlog.threshold.fetch.warn: 1s
+#index.search.slowlog.threshold.fetch.info: 800ms
+#index.search.slowlog.threshold.fetch.debug: 500ms
+#index.search.slowlog.threshold.fetch.trace: 200ms
+
+#index.indexing.slowlog.threshold.index.warn: 10s
+#index.indexing.slowlog.threshold.index.info: 5s
+#index.indexing.slowlog.threshold.index.debug: 2s
+#index.indexing.slowlog.threshold.index.trace: 500ms
+
+################################## GC Logging ################################
+
+#monitor.jvm.gc.young.warn: 1000ms
+#monitor.jvm.gc.young.info: 700ms
+#monitor.jvm.gc.young.debug: 400ms
+
+#monitor.jvm.gc.old.warn: 10s
+#monitor.jvm.gc.old.info: 5s
+#monitor.jvm.gc.old.debug: 2s
+
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/DME2preferredRouter.txt b/test-apis-ci/src/test/resources/config/test-apis-ci/DME2preferredRouter.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/DME2preferredRouter.txt
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/configuration.yaml
new file mode 100644
index 0000000..f138ba1
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/configuration.yaml
@@ -0,0 +1,677 @@
+identificationHeaderFields:
+   - HTTP_IV_USER
+   - HTTP_CSP_FIRSTNAME
+   - HTTP_CSP_LASTNAME
+   - HTTP_IV_REMOTE_ADDRESS
+   - HTTP_CSP_WSTYPE
+
+# catalog backend hostname
+beFqdn: localhost
+# sdccatalog.att.com
+
+# catalog backend http port
+beHttpPort: 8080
+
+# catalog backend http context
+beContext: /sdc/rest/config/get
+
+# catalog backend protocol
+beProtocol: http
+
+# catalog backend ssl port
+beSslPort: 8443
+
+version: 1.1.0
+released: 2012-11-30
+toscaConformanceLevel: 5.0
+minToscaConformanceLevel: 3.0
+
+titanCfgFile: /home/vagrant/catalog-be/config/catalog-be/titan.properties
+titanInMemoryGraph: false
+titanLockTimeout: 1800
+
+# The interval to try and reconnect to titan DB when it is down during ASDC startup:
+titanReconnectIntervalInSeconds: 3
+
+# The read timeout towards Titan DB when health check is invoked:
+titanHealthCheckReadTimeout: 1
+
+# The interval to try and reconnect to Elasticsearch when it is down during ASDC startup:
+esReconnectIntervalInSeconds: 3
+uebHealthCheckReconnectIntervalInSeconds: 15
+uebHealthCheckReadTimeout: 4
+
+# Protocols
+protocols:
+   - http
+   - https
+
+# Default imports
+defaultImports:
+   - nodes:
+        file: nodes.yml
+   - datatypes:
+        file: data.yml
+   - capabilities:
+        file: capabilities.yml
+   - relationships:
+        file: relationships.yml
+   - groups:
+        file: groups.yml
+   - policies:
+        file: policies.yml
+
+# Users
+users:
+    tom: passwd
+    bob: passwd
+
+neo4j:
+    host: neo4jhost
+    port: 7474
+    user: neo4j
+    password: "12345"
+
+cassandraConfig:
+    cassandraHosts: ['localhost']
+    localDataCenter: datacenter1
+    reconnectTimeout : 30000
+    authenticate: false
+    username: koko
+    password: bobo
+    ssl: false
+    truststorePath : /path/path
+    truststorePassword : 123123
+    keySpaces:
+        - { name: sdcaudit, replicationStrategy: SimpleStrategy, replicationInfo: ['1']}
+        - { name: sdcartifact, replicationStrategy: SimpleStrategy, replicationInfo: ['1']}
+        - { name: sdccomponent, replicationStrategy: SimpleStrategy, replicationInfo: ['1']}
+        - { name: sdcrepository, replicationStrategy: SimpleStrategy, replicationInfo: ['1']}
+
+#Application-specific settings of ES
+elasticSearch:
+    # Mapping of index prefix to time-based frame. For example, if below is configured:
+    #
+    # - indexPrefix: auditingevents
+    #    creationPeriod: minute
+    #
+    # then ES object of type which is mapped to "auditingevents-*" template, and created on 2015-12-23 13:24:54, will enter "auditingevents-2015-12-23-13-24" index.
+    # Another object created on 2015-12-23 13:25:54, will enter "auditingevents-2015-12-23-13-25" index.
+    # If creationPeriod: month, both of the above will enter "auditingevents-2015-12" index.
+    #
+    # PLEASE NOTE: the timestamps are created in UTC/GMT timezone! This is needed so that timestamps will be correctly presented in Kibana.
+    #
+    # Legal values for creationPeriod - year, month, day, hour, minute, none (meaning no time-based behaviour).
+    #
+    # If no creationPeriod is configured for indexPrefix, default behavour is creationPeriod: month.
+    
+    indicesTimeFrequency:
+      - indexPrefix: auditingevents
+        creationPeriod: month
+      - indexPrefix: monitoring_events
+        creationPeriod: month
+
+artifactTypes:
+   - CHEF
+   - PUPPET
+   - SHELL
+   - YANG
+   - YANG_XML
+   - HEAT
+   - BPEL
+   - DG_XML
+   - MURANO_PKG
+   - WORKFLOW
+   - NETWORK_CALL_FLOW
+   - TOSCA_TEMPLATE
+   - TOSCA_CSAR
+   - AAI_SERVICE_MODEL
+   - AAI_VF_MODEL
+   - AAI_VF_MODULE_MODEL
+   - AAI_VF_INSTANCE_MODEL
+   - OTHER
+   - SNMP_POLL
+   - SNMP_TRAP
+   - GUIDE
+
+licenseTypes:
+   - User
+   - Installation
+   - CPU
+
+#Deployment artifacts placeHolder
+resourceTypes: &allResourceTypes
+  - VFC
+  - CP
+  - VL
+  - VF
+  - VFCMT
+  - Abstract
+  - CVFC
+
+# validForResourceTypes usage
+#     validForResourceTypes:
+#        - VF
+#        - VL
+deploymentResourceArtifacts:
+#  heat:
+#      displayName: "Base HEAT Template"
+#      type: HEAT
+#      validForResourceTypes: *allResourceTypes
+#  heatVol:
+#      displayName: "Volume HEAT Template"
+#      type: HEAT_VOL
+#      validForResourceTypes: *allResourceTypes
+#  heatNet:
+#      displayName: "Network HEAT Template"
+#      type: HEAT_NET
+#      validForResourceTypes: *allResourceTypes
+
+deploymentResourceInstanceArtifacts:
+  heatEnv:
+      displayName: "HEAT ENV"
+      type: HEAT_ENV
+      description: "Auto-generated HEAT Environment deployment artifact"
+      fileExtension: "env"
+  VfHeatEnv:
+      displayName: "VF HEAT ENV"
+      type: HEAT_ENV
+      description: "VF Auto-generated HEAT Environment deployment artifact"
+      fileExtension: "env"
+
+#tosca artifacts placeholders
+toscaArtifacts:
+  assetToscaTemplate:
+      artifactName: -template.yml
+      displayName: Tosca Template
+      type: TOSCA_TEMPLATE
+      description: TOSCA representation of the asset
+  assetToscaCsar:
+      artifactName: -csar.csar
+      displayName: Tosca Model
+      type: TOSCA_CSAR
+      description: TOSCA definition package of the asset
+
+
+#Informational artifacts placeHolder
+excludeResourceCategory:
+  - Generic
+excludeResourceType:
+  - PNF  
+informationalResourceArtifacts:
+  features:
+      displayName: Features
+      type: OTHER
+  capacity:
+      displayName: Capacity
+      type: OTHER
+  vendorTestResult:
+      displayName: Vendor Test Result
+      type: OTHER
+  testScripts:
+      displayName: Test Scripts
+      type: OTHER
+  CloudQuestionnaire:
+      displayName: Cloud Questionnaire (completed)
+      type: OTHER
+  HEATTemplateFromVendor:
+      displayName: HEAT Template from Vendor
+      type: HEAT
+  resourceSecurityTemplate:
+      displayName: Resource Security Template
+      type: OTHER
+
+excludeServiceCategory:
+
+informationalServiceArtifacts:
+  serviceArtifactPlan:
+      displayName: Service Artifact Plan
+      type: OTHER
+  summaryOfImpactsToECOMPElements:
+      displayName: Summary of impacts to ECOMP elements,OSSs, BSSs
+      type: OTHER
+  controlLoopFunctions:
+      displayName: Control Loop Functions
+      type: OTHER
+  dimensioningInfo:
+      displayName: Dimensioning Info
+      type: OTHER
+  affinityRules:
+      displayName: Affinity Rules
+      type: OTHER
+  operationalPolicies:
+      displayName: Operational Policies
+      type: OTHER
+  serviceSpecificPolicies:
+      displayName: Service-specific Policies
+      type: OTHER
+  engineeringRules:
+      displayName: Engineering Rules (ERD)
+      type: OTHER
+  distributionInstructions:
+      displayName: Distribution Instructions
+      type: OTHER
+  certificationTestResults:
+      displayName: TD Certification Test Results
+      type: OTHER
+  deploymentVotingRecord:
+      displayName: Deployment Voting Record
+      type: OTHER
+  serviceQuestionnaire:
+      displayName: Service Questionnaire
+      type: OTHER
+  serviceSecurityTemplate:
+      displayName: Service Security Template
+      type: OTHER
+
+serviceApiArtifacts:
+  configuration:
+      displayName: Configuration
+      type: OTHER
+  instantiation:
+      displayName: Instantiation
+      type: OTHER
+  monitoring:
+      displayName: Monitoring
+      type: OTHER
+  reporting:
+      displayName: Reporting
+      type: OTHER
+  logging:
+      displayName: Logging
+      type: OTHER
+  testing:
+      displayName: Testing
+      type: OTHER
+
+additionalInformationMaxNumberOfKeys: 50
+
+systemMonitoring:
+    enabled: false
+    isProxy: false
+    probeIntervalInSeconds: 15
+
+defaultHeatArtifactTimeoutMinutes: 60
+
+serviceDeploymentArtifacts:
+    YANG_XML:
+        acceptedTypes:
+            - xml
+    VNF_CATALOG:
+        acceptedTypes:
+            - xml
+    MODEL_INVENTORY_PROFILE:
+        acceptedTypes:
+            - xml
+    MODEL_QUERY_SPEC:
+        acceptedTypes:
+            - xml
+    UCPE_LAYER_2_CONFIGURATION:
+        acceptedTypes:
+            - xml
+
+#AAI Artifacts
+    AAI_SERVICE_MODEL:
+        acceptedTypes:
+            - xml
+    AAI_VF_MODULE_MODEL:
+        acceptedTypes:
+            - xml
+    AAI_VF_INSTANCE_MODEL:
+        acceptedTypes:
+            - xml 
+    OTHER:
+        acceptedTypes:
+
+resourceDeploymentArtifacts:
+    HEAT:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes: *allResourceTypes
+    HEAT_VOL:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes: *allResourceTypes
+    HEAT_NET:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes: *allResourceTypes
+    HEAT_NESTED:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes: *allResourceTypes
+    HEAT_ARTIFACT:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    YANG_XML:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    VNF_CATALOG:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    VF_LICENSE:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    VENDOR_LICENSE:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    MODEL_INVENTORY_PROFILE:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    MODEL_QUERY_SPEC:
+        acceptedTypes:
+            - xml
+        validForResourceTypes: *allResourceTypes
+    LIFECYCLE_OPERATIONS:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes:
+            - VF
+            - VFC
+    VES_EVENTS:
+        acceptedTypes:
+            - yaml
+            - yml
+        validForResourceTypes: *allResourceTypes
+    PERFORMANCE_COUNTER:
+        acceptedTypes:
+            - csv
+        validForResourceTypes: *allResourceTypes
+    APPC_CONFIG:
+        acceptedTypes:
+        validForResourceTypes:
+            - VF
+    DCAE_TOSCA:
+        acceptedTypes:
+            - yml
+            - yaml
+        validForResourceTypes:
+            - VF
+            - VFCMT
+    DCAE_JSON:
+        acceptedTypes:
+            - json
+        validForResourceTypes:
+            - VF
+            - VFCMT
+    DCAE_POLICY:
+        acceptedTypes:
+            - emf
+        validForResourceTypes:
+            - VF
+            - VFCMT
+    DCAE_DOC:
+        acceptedTypes:
+        validForResourceTypes:
+            - VF 
+            - VFCMT       
+    DCAE_EVENT:
+        acceptedTypes:
+        validForResourceTypes:
+            - VF
+            - VFCMT
+    AAI_VF_MODEL:
+        acceptedTypes:
+            - xml
+        validForResourceTypes:
+            - VF
+    AAI_VF_MODULE_MODEL:
+        acceptedTypes:
+            - xml
+        validForResourceTypes:
+            - VF
+    OTHER:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    SNMP_POLL:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    SNMP_TRAP:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+
+resourceInstanceDeploymentArtifacts:
+    HEAT_ENV:
+        acceptedTypes:
+            - env
+    VF_MODULES_METADATA:
+        acceptedTypes:
+            - json
+    VES_EVENTS:
+        acceptedTypes:
+            - yaml
+            - yml
+    PERFORMANCE_COUNTER:
+        acceptedTypes:
+            - csv
+    DCAE_INVENTORY_TOSCA:
+        acceptedTypes:
+            - yml
+            - yaml
+    DCAE_INVENTORY_JSON:
+        acceptedTypes:
+            - json
+    DCAE_INVENTORY_POLICY:
+      acceptedTypes:
+            - emf
+    DCAE_INVENTORY_DOC:
+      acceptedTypes:
+    DCAE_INVENTORY_BLUEPRINT:
+      acceptedTypes:
+    DCAE_INVENTORY_EVENT:
+      acceptedTypes:
+    SNMP_POLL:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    SNMP_TRAP:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+
+resourceInformationalArtifacts:
+    CHEF:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    PUPPET:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    SHELL:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    YANG:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    YANG_XML:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    HEAT:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    BPEL:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    DG_XML:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    MURANO_PKG:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    OTHER:
+        acceptedTypes:
+        validForResourceTypes: 
+            - VFC
+            - CVFC
+            - CP
+            - VL
+            - VF
+            - VFCMT
+            - Abstract
+            - PNF
+    SNMP_POLL:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    SNMP_TRAP:
+        acceptedTypes:
+        validForResourceTypes: *allResourceTypes
+    GUIDE:
+        acceptedTypes:
+        validForResourceTypes:
+            - VF
+            - VFC
+            - CVFC
+
+resourceInformationalDeployedArtifacts:
+
+requirementsToFulfillBeforeCert:
+
+capabilitiesToConsumeBeforeCert:
+
+unLoggedUrls:
+   - /sdc2/rest/healthCheck
+
+cleanComponentsConfiguration:
+    cleanIntervalInMinutes: 1440
+    componentsToClean:
+       - Resource
+       - Service
+
+artifactsIndex: resources
+
+heatEnvArtifactHeader: ""
+heatEnvArtifactFooter: ""
+
+onboarding:
+    protocol: http
+    host: localhost
+    port: 8080
+    downloadCsarUri: "/onboarding-api/v1.0/vendor-software-products/packages"
+    healthCheckUri: "/onboarding-api/v1.0/healthcheck"
+
+dcae:
+    protocol: http
+    host: 127.0.0.1
+    port: 8080
+    healthCheckUri: "/dcae/healthCheck"
+
+switchoverDetector:
+    gBeFqdn: AIO-BE.ecomp.idns.cip.com
+    gFeFqdn: AIO-FE.ecomp.idns.cip.com
+    beVip: 0.0.0.0
+    feVip: 0.0.0.0
+    beResolveAttempts: 3
+    feResolveAttempts: 3
+    enabled: false
+    interval: 60
+    changePriorityUser: ecompasdc
+    changePriorityPassword: ecompasdc123
+    publishNetworkUrl: "http://xxx.com/crt/CipDomain.ECOMP-ASDC-DEVST/config/update_network?user=root"
+    publishNetworkBody: '{"note":"publish network"}'
+    groups:
+      beSet: { changePriorityUrl: "http://xxx.com/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-BE.ecomp.idns.com?user=root",
+               changePriorityBody: '{"name":"AIO-BE.ecomp.idns.com","uri":"/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-BE.ecomp.idns.com","no_ad_redirection":false,"v4groups":{"failover_groups":["/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_mg_be","/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_bs_be"],"failover_policy":["FAILALL"]},"comment":"AIO BE G-fqdn","intended_app_proto":"DNS"}'}
+      feSet: { changePriorityUrl: "http://xxx.com/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-FE.ecomp.idns.com?user=root",
+               changePriorityBody: '{"comment":"AIO G-fqdn","name":"AIO-FE.ecomp.idns.com","v4groups":{"failover_groups":["/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_mg_fe","/crt/CipDomain.ECOMP-ASDC-DEVST/config/groups/group_bs_fe"],"failover_policy":["FAILALL"]},"no_ad_redirection":false,"intended_app_proto":"DNS","uri":"/crt/CipDomain.ECOMP-ASDC-DEVST/config/sites/AIO-FE.ecomp.idns.com"}'}
+
+applicationL1Cache:
+    datatypes:
+        enabled: true
+        firstRunDelay: 10
+        pollIntervalInSec: 60
+
+applicationL2Cache:
+    enabled: true
+    catalogL1Cache:
+        enabled: true
+        resourcesSizeInCache: 300
+        servicesSizeInCache: 200
+        productsSizeInCache: 100
+    queue:
+        syncIntervalInSecondes: 43200
+        waitOnShutDownInMinutes: 10
+        numberOfCacheWorkers: 4
+
+toscaValidators:
+    stringMaxLength: 2500
+
+disableAudit: false
+
+vfModuleProperties:
+    min_vf_module_instances:
+        forBaseModule: 1
+        forNonBaseModule: 0
+    max_vf_module_instances:
+        forBaseModule: 1
+        forNonBaseModule:
+    initial_count:
+        forBaseModule: 1
+        forNonBaseModule: 0
+    vf_module_type:
+        forBaseModule: Base
+        forNonBaseModule: Expansion
+
+genericAssetNodeTypes:
+  VFC: org.openecomp.resource.abstract.nodes.VFC
+  CVFC: org.openecomp.resource.abstract.nodes.VFC
+  VF : org.openecomp.resource.abstract.nodes.VF
+  PNF: org.openecomp.resource.abstract.nodes.PNF
+  Service: org.openecomp.resource.abstract.nodes.service
+
+workloadContext: Production
+environmentContext:
+    defaultValue: General_Revenue-Bearing
+    validValues:
+       - Critical_Revenue-Bearing
+       - Vital_Revenue-Bearing
+       - Essential_Revenue-Bearing
+       - Important_Revenue-Bearing
+       - Needed_Revenue-Bearing
+       - Useful_Revenue-Bearing
+       - General_Revenue-Bearing
+       - Critical_Non-Revenue
+       - Vital_Non-Revenue
+       - Essential_Non-Revenue
+       - Important_Non-Revenue
+       - Needed_Non-Revenue
+       - Useful_Non-Revenue
+       - General_Non-Revenue
+
+dmaapConsumerConfiguration:
+    hosts: olsd004.wnsnet.attws.com:3905
+    consumerGroup: asdc
+    consumerId: mama
+    timeoutMs: 15000
+    limit: 1
+    pollingInterval: 2
+    topic: com.att.sdc.23911-SDCforTestDev-v001
+    latitude: 32.109333
+    longitude: 34.855499
+    version: 1.0
+    serviceName: dmaap-v1.dev.dmaap.dt.saat.acsi.att.com/events
+    environment: TEST
+    partner: BOT_R
+    routeOffer: MR1
+    protocol: https
+    contenttype: application/json
+    dme2TraceOn: true
+    aftEnvironment: AFTUAT
+    aftDme2ConnectionTimeoutMs: 15000
+    aftDme2RoundtripTimeoutMs: 240000
+    aftDme2ReadTimeoutMs: 50000
+    dme2preferredRouterFilePath: DME2preferredRouter.txt 
+    timeLimitForNotificationHandleMs: 0
+    credential:
+        username: m09875@sdc.att.com
+        password: hmXYcznAljMSisdy8zgcag==
+        
+dmeConfiguration:
+    dme2Search: DME2SEARCH
+    dme2Resolve: DME2RESOLVE
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/distribution-engine-configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/distribution-engine-configuration.yaml
new file mode 100644
index 0000000..00ae8f5
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/distribution-engine-configuration.yaml
@@ -0,0 +1,77 @@
+uebServers:
+   - uebsb91kcdc.it.att.com
+   - uebsb92kcdc.it.att.com
+#   - uebsb93kcdc.it.att.com
+
+uebPublicKey: 8F3MDAtMSBwwpSMy
+
+uebSecretKey: gzFmsTxSCtO5RQfAccM6PqqX
+
+distributionNotifTopicName: ASDC-DISTR-NOTIF-TOPIC
+distributionStatusTopicName: ASDC-DISTR-STATUS-TOPIC
+
+initRetryIntervalSec: 5
+initMaxIntervalSec: 60
+
+distribNotifServiceArtifactTypes:
+  info:
+      - MURANO-PKG
+
+distribNotifResourceArtifactTypes:
+  lifecycle:
+      - HEAT
+      - DG-XML
+
+environments:
+   - PROD
+
+distributionStatusTopic:
+   pollingIntervalSec: 60
+   fetchTimeSec: 15
+   consumerGroup: asdc
+   consumerId: asdc-id
+
+distributionNotificationTopic:
+   minThreadPoolSize: 0
+   maxThreadPoolSize: 10
+   maxWaitingAfterSendingSeconds: 5
+
+createTopic:
+   partitionCount: 1
+   replicationCount: 1
+
+startDistributionEngine: true
+
+
+aaiConfig:
+   serverRootUrl: https://127.0.0.1/aai/v1
+   resourceNamespaces:
+      operationalEnvironments: /aai/cloud-infrastructure/operational-environments
+
+   httpRequestConfig:
+      readTimeoutMs: 5000
+      connectTimeoutMs: 1000
+      maxReadConnectionRetry: 3
+      userName: abcd
+      password: hmXYcznAljMSisdy8zgcag==
+      clientSslAuthentication: false
+      keyStore: opt/app/catalog-be/cert/.keystore
+      keyStorePassword: hmXYcznAljMSisdy8zgcag==
+  
+   httpRequestHeaders:
+      XFromAppId: asdc
+  
+opEnvRecoveryIntervalSec: 180
+allowedTimeBeforeStaleSec: 300
+
+msoConfig:
+    serverRootUrl: https://127.0.0.1/onap/so/infra/modelDistributions/v1
+    resourceNamespaces:
+        distributions: /distributions
+
+    httpClientConfig:
+        readTimeout: 2000
+        connectTimeout: 500
+        numOfRetries: 3
+        userName: asdc
+        password: OTLEp5lfVhYdyw5EAtTUBQ==
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/ecomp-error-configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/ecomp-error-configuration.yaml
new file mode 100644
index 0000000..9d7cd74
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/ecomp-error-configuration.yaml
@@ -0,0 +1,383 @@
+###########################################
+# Note the conventions of the field values:
+# type can be one of: CONFIG_ERROR, SYSTEM_ERROR, DATA_ERROR, CONNECTION_PROBLEM, AUTHENTICATION_PROBLEM
+# severity can be one of: WARN, ERROR, FATAL
+# alarmSeverity can be one of: CRITICAL,MAJOR,MINOR,INFORMATIONAL,NONE
+# code is a unique integer in range of 3003-9999 (3000-3002 are occupied for internal usage)
+# The above enumeration values are out-of-the-box and can be changed in code. 
+# In case of config and code mismatch, the appropriate error will be printed to log
+#
+## Range of BE codes - 3010-7999
+
+errors:
+
+    BeRestApiGeneralError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4000,
+        severity: ERROR,
+        description: "Unexpected error during BE REST API execution",
+        alarmSeverity: CRITICAL
+    }
+
+    BeHealthCheckError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3010,
+        severity: ERROR,
+        description: "Error during BE Health Check",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeInitializationError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4019,
+        severity: ERROR,
+        description: "Catalog-BE was not initialized properly",
+        alarmSeverity: CRITICAL
+    }
+
+    BeResourceMissingError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3011,
+        severity: ERROR,
+        description: "Mandatory resource %s cannot be found in repository",
+        alarmSeverity: MAJOR
+    }
+    
+    BeServiceMissingError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3012,
+        severity: ERROR,
+        description: "Mandatory service %s cannot be found in repository",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedAddingResourceInstanceError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3013,
+        severity: ERROR,
+        description: "Failed to add resource instance of resource %s to service %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeIncorrectServiceError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3014,
+        severity: ERROR,
+        description: "Service %s is not valid",
+        alarmSeverity: MAJOR
+    }
+     
+    BeRepositoryDeleteError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3015,
+        severity: ERROR,
+        description: "Failed to delete object %s from repository",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeRepositoryQueryError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3016,
+        severity: ERROR,
+        description: "Failed to fetch from repository %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeInvalidConfigurationError: {
+        type: CONFIG_ERROR,
+        code: ASDC_3017,
+        severity: FATAL,
+        description: "Configuration parameter %s is invalid. Value configured is %s",
+        alarmSeverity: MAJOR
+    }
+   
+    BeUebConnectionError: {
+        type: CONNECTION_PROBLEM,
+        code: ASDC_4001,
+        severity: ERROR,
+        description: "Connection problem towards U-EB server. Reason: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3019,
+        severity: ERROR,
+        description: "Error occured during access to U-EB Server. Operation: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebObjectNotFoundError: {
+        type: DATA_ERROR,
+        code: ASDC_4005,
+        severity: ERROR,
+        description: "Error occured during access to U-EB Server. Data not found: %s",
+        alarmSeverity: MAJOR
+    }
+
+    BeDistributionEngineSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3021,
+        severity: ERROR,
+        description: "Error occured in Distribution Engine. Failed operation: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebAuthenticationError: {
+        type: AUTHENTICATION_PROBLEM,
+        code: ASDC_4003,
+        severity: ERROR,
+        description: "Authentication problem towards U-EB server. Reason: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUebUnkownHostError: {
+        type: CONNECTION_PROBLEM,
+        code: ASDC_4002,
+        severity: ERROR,
+        description: "Connection problem towards U-EB server. Cannot reach host %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeDistributionEngineInvalidArtifactType: {
+        type: DATA_ERROR,
+        code: ASDC_4006,
+        severity: WARN,
+        description: "The artifact type %s does not appear in the list of valid artifacts %s",
+        alarmSeverity: MAJOR
+    }
+    BeInvalidTypeError: {
+        type: DATA_ERROR,
+        code: ASDC_4008,
+        severity: WARN,
+        description: "The type %s of %s is invalid",
+        alarmSeverity: MAJOR
+    }
+    BeInvalidValueError: {
+        type: DATA_ERROR,
+        code: ASDC_3028,
+        severity: WARN,
+        description: "The value %s of %s from type %s is invalid",
+        alarmSeverity: MAJOR
+    } 
+    
+    BeFailedDeletingResourceInstanceError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_3029,
+        severity: ERROR,
+        description: "Failed to delete resource instance %s from service %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeMissingConfigurationError: {
+        type: CONFIG_ERROR,
+        code: ASDC_3030,
+        severity: FATAL,
+        description: "Configuration parameter %s is missing",
+        alarmSeverity: MAJOR
+    }
+    
+    BeConfigurationInvalidListSizeError: {
+        type: CONFIG_ERROR,
+        code: ASDC_3031,
+        severity: FATAL,
+        description: "Configuration parameter %s is invalid. At least %s values shall be configured",
+        alarmSeverity: MAJOR
+    }
+    
+    ErrorConfigFileFormat: {
+        type: CONFIG_ERROR,
+        code: ASDC_3032,
+        severity: ERROR,
+        description: "Error element not found in YAML name: %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeMissingArtifactInformationError: {
+        type: DATA_ERROR,
+        code: ASDC_4010,
+        severity: ERROR,
+        description: "Artifact uploaded has missing information. Missing %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeArtifactMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4011,
+        severity: ERROR,
+        description: "Artifact %s requested is not found",
+        alarmSeverity: MAJOR
+    }
+    
+    BeArtifactPayloadInvalid: {
+        type: DATA_ERROR,
+        code: ASDC_4012,
+        severity: ERROR,
+        description: "Payload of artifact uploaded is invalid (invalid MD5 or encryption)",
+        alarmSeverity: MAJOR
+    }
+    
+    BeUserMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4009,
+        severity: ERROR,
+        description: "User %s requested is not found",
+        alarmSeverity: MAJOR
+    }
+    
+    BeArtifactInformationInvalidError: {
+        type: DATA_ERROR,
+        code: ASDC_4013,
+        severity: ERROR,
+        description: "Input for artifact metadata is invalid",
+        alarmSeverity: MAJOR
+    }
+    BeFailedAddingCapabilityTypeError: {
+        type: DATA_ERROR,
+        code: ASDC_4015,
+        severity: ERROR,
+        description: "Failed adding capability type",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeCapabilityTypeMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4016,
+        severity: ERROR,
+        description: "Capability Type %s not found",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeInterfaceMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4020,
+        severity: ERROR,
+        description: "Interface %s required is missing",
+        alarmSeverity: MAJOR
+    }
+    
+    BeDaoSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4014,
+        severity: ERROR,
+        description: "Operation towards database failed",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4017,
+        severity: ERROR,
+        description: "Unexpected error during operation",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeFailedLockObjectError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4007,
+        severity: WARN,
+        description: "Failed to lock object for update",
+        alarmSeverity: CRITICAL
+    }
+    
+    BeInvalidJsonInput: {
+        type: SYSTEM_ERROR,
+        code: ASDC_4018,
+        severity: ERROR,
+        description: "Failed to convert json input to object",
+        alarmSeverity: MAJOR
+    }
+    
+    BeDistributionMissingError: {
+        type: DATA_ERROR,
+        code: ASDC_4021,
+        severity: ERROR,
+        description: "Distribution %s required is missing",
+        alarmSeverity: MAJOR
+    }
+    
+    BeHealthCheckRecovery: {
+        type: RECOVERY,
+        code: ASDC_4022,
+        severity: INFO,
+        description: "BE Health Check Recovery",
+        alarmSeverity: INFORMATIONAL
+    }
+    BeFailedCreateNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6000,
+        severity: ERROR,
+        description: "Failed to create node %s on graph. status is %s",
+        alarmSeverity: MAJOR
+    }
+    BeFailedUpdateNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6001,
+        severity: ERROR,
+        description: "Failed to update node %s on graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedDeleteNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6002,
+        severity: ERROR,
+        description: "Failed to delete node %s on graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedRetrieveNodeError: {
+        type: DATA_ERROR,
+        code: ASDC_6003,
+        severity: ERROR,
+        description: "Failed to retrieve node %s from graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeExecuteRollbackError: {
+        type: DATA_ERROR,
+        code: ASDC_6004,
+        severity: ERROR,
+        description: "Going to execute rollback on graph.",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindParentError: {
+        type: DATA_ERROR,
+        code: ASDC_6005,
+        severity: ERROR,
+        description: "Failed to find parent node %s on graph. Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindAllNodesError: {
+        type: DATA_ERROR,
+        code: ASDC_6006,
+        severity: ERROR,
+        description: "Failed to fetch all nodes with type %s of parent node %s . Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindAssociationError: {
+        type: DATA_ERROR,
+        code: ASDC_6007,
+        severity: ERROR,
+        description: "Cannot find node with type %s associated with node %s . Status is %s",
+        alarmSeverity: MAJOR
+    }
+    
+    BeFailedFindAssociationError: {
+        type: DATA_ERROR,
+        code: ASDC_6008,
+        severity: ERROR,
+        description: "Cannot find node with type %s associated with node %s . Status is %s",
+        alarmSeverity: MAJOR
+    }
+    BeComponentCleanerSystemError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_6009,
+        severity: ERROR,
+        description: "Error occured in Component Cleaner Task. Failed operation: %s",
+        alarmSeverity: MAJOR
+    }
+    
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/error-configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/error-configuration.yaml
new file mode 100644
index 0000000..5494c2f
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/error-configuration.yaml
@@ -0,0 +1,1883 @@
+﻿# Errors
+errors:
+    OK: {
+        code: 200,
+        message: "OK"
+    }
+    CREATED: {
+        code: 201,
+        message: "OK"
+    }
+    ACCEPTED: {
+        code: 202,
+        message: "Accepted"
+    }
+    NO_CONTENT: {
+        code: 204,
+        message: "No Content"
+    }
+#--------POL4050-----------------------------
+    NOT_ALLOWED: {
+        code: 405,
+        message: "Error: Method not allowed.",
+        messageId: "POL4050"
+    }
+#--------POL5000-----------------------------
+    GENERAL_ERROR: {
+        code: 500,
+        message: "Error: Internal Server Error. Please try again later.",
+        messageId: "POL5000"
+    }
+#---------POL5001------------------------------
+    MISSING_X_ECOMP_INSTANCE_ID: {
+        code: 400  ,
+        message: "Error: Missing 'X-ECOMP-InstanceID' HTTP header.",
+        messageId: "POL5001"
+    }
+#---------POL5002------------------------------
+    AUTH_REQUIRED: {
+        code: 401  ,
+        message: "Error: Authentication is required to use the API.",
+        messageId: "POL5002"
+    }
+#---------POL5003------------------------------
+    AUTH_FAILED: {
+        code: 403  ,
+        message: "Error: Not authorized to use the API.",
+        messageId: "POL5003"
+    }
+#---------POL5004------------------------------
+    MISSING_USER_ID: {
+        code: 400  ,
+        message: "Error: Missing 'USER_ID' HTTP header.",
+        messageId: "POL5004"
+    }
+#---------SVC4000-----------------------------
+    INVALID_CONTENT: {
+        code: 400,
+        message: "Error: Invalid content.",
+        messageId: "SVC4000"
+    }
+#---------SVC4002-----------------------------
+    MISSING_INFORMATION: {
+        code: 403,
+        message: "Error: Missing information.",
+        messageId: "SVC4002"
+    }
+#---------SVC4003------------------------------
+# %1 - Users's ID
+    USER_NOT_FOUND: {
+        code: 404,
+        message: "Error: User '%1' was not found.",
+        messageId: "SVC4003"
+    }
+#---------SVC4004-----------------------------
+# %1 - Users's email address
+    INVALID_EMAIL_ADDRESS: {
+        code: 400,
+        message: "Error: Invalid email address '%1'.",
+        messageId: "SVC4004"
+    }
+#---------SVC4005------------------------------
+# %1 - role
+    INVALID_ROLE: {
+        code: 400,
+        message: "Error: Invalid role '%1'.",
+        messageId: "SVC4005"
+    }
+#---------SVC4006------------------------------
+# %1 - Users's USER_ID
+    USER_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: User with '%1' ID already exists.",
+        messageId: "SVC4006"
+    }
+#---------SVC4007------------------------------
+    DELETE_USER_ADMIN_CONFLICT: {
+        code: 409,
+        message: "Error: An administrator can only be deleted by another administrator.",
+        messageId: "SVC4007"
+    }
+#---------SVC4008-----------------------------
+# %1 - Users's userId
+    INVALID_USER_ID: {
+        code: 400,
+        message: "Error: Invalid userId '%1'.",
+        messageId: "SVC4008"
+    }
+
+#---------SVC4049------------------------------
+# %1 - service/resource
+    COMPONENT_MISSING_CONTACT: {
+        code: 400,
+        message: "Error: Invalid Content. Missing %1 contact.",
+        messageId: "SVC4051"
+    }
+#---------SVC4050-----------------------------
+# %1 - Service/Resource/Additional parameter
+# %2 - service/resource/label name
+    COMPONENT_NAME_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: %1 with name '%2' already exists.",
+        messageId: "SVC4050"
+    }
+#---------SVC4051------------------------------
+# %1 - resource/service
+    COMPONENT_MISSING_CATEGORY: {
+        code: 400,
+        message: "Error: Invalid Content. Missing %1 category.",
+        messageId: "SVC4051"
+    }
+
+#---------SVC4052------------------------------
+    COMPONENT_MISSING_TAGS: {
+        code: 400,
+        message: "Error: Invalid Content. At least one tag has to be specified.",
+        messageId: "SVC4052"
+    }
+
+#---------SVC4053------------------------------
+# %1 - service/resource
+    COMPONENT_MISSING_DESCRIPTION: {
+        code: 400,
+        message: "Error: Invalid Content. Missing %1 description.",
+        messageId: "SVC4053"
+    }
+#---------SVC4054------------------------------
+# %1 - resource/service
+    COMPONENT_INVALID_CATEGORY: {
+        code: 400,
+        message: "Error: Invalid Content. Invalid %1 category.",
+        messageId: "SVC4054"
+    }
+#---------SVC4055------------------------------
+    MISSING_VENDOR_NAME: {
+        code: 400,
+        message: "Error: Invalid Content. Missing vendor name.",
+        messageId: "SVC4055"
+    }
+#---------SVC4056------------------------------
+    MISSING_VENDOR_RELEASE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing vendor release.",
+        messageId: "SVC4056"
+    }
+
+#---------SVC4057------------------------------
+    MISSING_DERIVED_FROM_TEMPLATE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing derived from template specification.",
+        messageId: "SVC4057"
+    }
+
+#---------SVC4058------------------------------
+# %1 - service/resource
+    COMPONENT_MISSING_ICON: {
+        code: 400,
+        message: "Error: Invalid Content. Missing %1 icon.",
+        messageId: "SVC4058"
+    }
+#---------SVC4059------------------------------
+# %1 - service/resource
+    COMPONENT_INVALID_ICON: {
+        code: 400,
+        message: "Error: Invalid Content. Invalid %1 icon.",
+        messageId: "SVC4059"
+    }
+#---------SVC4060------------------------------
+    PARENT_RESOURCE_NOT_FOUND: {
+        code: 400,
+        message: "Error: Invalid Content. Derived from resource template was not found.",
+        messageId: "SVC4060"
+    }
+#---------SVC4061------------------------------
+    MULTIPLE_PARENT_RESOURCE_FOUND: {
+        code: 400,
+        message: "Error: Invalid Content. Multiple derived from resource template is not allowed.",
+        messageId: "SVC4061"
+    }
+
+#---------SVC4062------------------------------
+# %1 - service/resource
+    MISSING_COMPONENT_NAME: {
+        code: 400,
+        message: "Error: Invalid Content. Missing %1 name.",
+        messageId: "SVC4062"
+    }
+#---------SVC4063------------------------------
+    #%1  -  resource/service name
+    RESOURCE_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' resource was not found.",
+        messageId: "SVC4063"
+    }
+
+#---------SVC4064------------------------------
+# %1 - Service/Resource/Property
+    COMPONENT_INVALID_DESCRIPTION: {
+        code: 400,
+        message: "Error: Invalid Content. %1 description contains non-english characters.",
+        messageId: "SVC4064"
+    }
+#---------SVC4065------------------------------
+# %1 - Service/Resource/Property
+# %2 - max resource/service name length
+    COMPONENT_DESCRIPTION_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. %1 description exceeds limit of %2 characters.",
+        messageId: "SVC4065"
+    }
+#---------SVC4066------------------------------
+# %1 - max length
+    COMPONENT_TAGS_EXCEED_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Tags overall length exceeds limit of %1 characters.",
+        messageId: "SVC4066"
+    }
+#---------SVC4067------------------------------
+# %1 - max length
+    VENDOR_NAME_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Vendor name exceeds limit of %1 characters.",
+        messageId: "SVC4067"
+    }
+#---------SVC4068------------------------------
+# %1 - max length
+    VENDOR_RELEASE_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Vendor release exceeds limit of %1 characters.",
+        messageId: "SVC4068"
+    }
+
+#---------SVC4069------------------------------
+# %1 - Service/Resource/Product
+    COMPONENT_INVALID_CONTACT: {
+        code: 400,
+        message: "Error: Invalid Content. %1 Contact Id should be in format 'mnnnnnn' or 'aannna' or 'aannnn', where m=m ,a=a-zA-Z and n=0-9",
+        messageId: "SVC4069"
+    }
+#---------SVC4070------------------------------
+# %1 - Service/Resource
+    INVALID_COMPONENT_NAME: {
+        code: 400,
+        message: 'Error: Invalid Content. %1 name is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4070"
+    }
+
+#---------SVC4071------------------------------
+    INVALID_VENDOR_NAME: {
+        code: 400,
+        message: 'Error: Invalid Content. Vendor name is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4071"
+    }
+#---------SVC4072------------------------------
+    INVALID_VENDOR_RELEASE: {
+        code: 400,
+        message: 'Error: Invalid Content. Vendor release is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4072"
+    }
+#---------SVC4073------------------------------
+# %1 - Service/Resource
+# %2 - max  resource/service name
+    COMPONENT_NAME_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. %1 name exceeds limit of %2 characters.",
+        messageId: "SVC4073"
+    }
+#---------SVC4080------------------------------
+# %1 - resource/service name
+# %2 - resource/service
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_IN_CHECKOUT_STATE: {
+        code: 403,
+        message: "Error: Requested '%1' %2 is locked for modification by %3 %4(%5).",
+        messageId: "SVC4080"
+    }
+#---------SVC4081-----------------------------
+# %1 - resource/service name
+# %2 - resource/service
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_IN_CERT_IN_PROGRESS_STATE: {
+        code: 403,
+        message: "Error: Requested '%1' %2 is locked for certification by %3 %4(%5).",
+        messageId: "SVC4081"
+    }
+
+#-----------SVC4082---------------------------
+# %1 - resource/service name
+# %2 - resource/service
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_SENT_FOR_CERTIFICATION: {
+        code: 403,
+        message: "Error: Requested '%1' %2 is sent for certification by %3 %4(%5).",
+        messageId: "SVC4082"
+    }
+#-----------SVC4083---------------------------
+    COMPONENT_VERSION_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Version of this %1 was already promoted.",
+        messageId: "SVC4083"
+    }
+#-----------SVC4084---------------------------
+# %1 - resource/service/product name
+# %2 - resource/service/product
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_ALREADY_CHECKED_IN: {
+        code: 409,
+        message: "Error: The current version of '%1' %2 was already checked-in by %3 %4(%5).",
+        messageId: "SVC4084"
+    }
+#-----------SVC4085---------------------------
+# %1 - resource/service/product name
+# %2 - resource/service/product
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_CHECKOUT_BY_ANOTHER_USER: {
+        code: 403,
+        message: "Error: %1 %2 has already been checked out by %3 %4(%5).",
+        messageId: "SVC4085"
+    }
+#-----------SVC4086---------------------------
+# %1  - resource/service name
+# %2  - resource/service
+    COMPONENT_IN_USE: {
+        code: 403,
+        message: "Error: Requested '%1' %2 is in use by another user.",
+        messageId: "SVC4086"
+    }
+#-----------SVC4087---------------------------
+# %1 - component name
+# %2 - resource/service/product
+    COMPONENT_HAS_NEWER_VERSION: {
+        code: 409,
+        message: "Error: Checking out of the requested version of the '%1' %2 is not allowed as a newer version exists.",
+        messageId: "SVC4087"
+    }
+#-----------SVC4088---------------------------
+# %1 - resource/service name
+# %2 - resource/service
+# %3 - First name of last modifier
+# %4 - Last name of last modifier
+# %5 - USER_ID of last modifier
+    COMPONENT_ALREADY_CERTIFIED: {
+        code: 403,
+        message: "Error: Requested %1 %2 has already been certified by %3 %4(%5).",
+        messageId: "SVC4088"
+    }
+#-----------SVC4089---------------------------
+# %1 - resource/service name
+# %2 - resource/service
+    COMPONENT_NOT_READY_FOR_CERTIFICATION: {
+        code: 403,
+        message: "Error: Requested '%1' %2 is not ready for certification.",
+        messageId: "SVC4089"
+    }
+#-----------SVC4100---------------------------
+#%1 - property name
+    PROPERTY_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' property was not found.",
+        messageId: "SVC4100"
+    }
+#-----------SVC4101---------------------------
+#%1 - property name
+    PROPERTY_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Property with '%1' name already exists.",
+        messageId: "SVC4101"
+    }
+
+#-----------SVC4102---------------------------
+# %1 - capability type name
+    CAPABILITY_TYPE_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Capability Type with name '%1' already exists.",
+        messageId: "SVC4102"
+    }
+#-----------SVC4114---------------------------
+    AUTH_FAILED_INVALIDE_HEADER: {
+        code: 400,
+        message: "Error: Invalid Authorization header.",
+        messageId: "SVC4114"
+    }
+#-----------SVC4115---------------------------
+# %1 - capability type name
+    MISSING_CAPABILITY_TYPE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing Capability Type '%1'.",
+        messageId: "SVC4115"
+    }
+    RESOURCE_INSTANCE_BAD_REQUEST: {
+        code: 400,
+        message: "Error: Invalid Content.",
+        messageId: "SVC4116"
+    }
+#-----------SVC4117---------------------------
+# %1 - resource instance name
+# %2 - resource instance name
+# %3 - requirement name
+    RESOURCE_INSTANCE_MATCH_NOT_FOUND: {
+        code: 404,
+        message: "Error: Match not found between resource instance '%1' and resource instance '%2' for requirement '%3'.",
+        messageId: "SVC4117"
+    }
+#-----------SVC4118---------------------------
+# %1 - resource instance name
+# %2 - resource instance name
+# %3 - requirement name
+    RESOURCE_INSTANCE_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Resource instances '%1' and '%2' are already associated with requirement '%3'.",
+        messageId: "SVC4118"
+    }
+#-----------SVC4119---------------------------
+# %1 - resource instance name
+# %2 - resource instance name
+# %3 - requirement name
+    RESOURCE_INSTANCE_RELATION_NOT_FOUND: {
+        code: 404,
+        message: "Error: No relation found between resource instances '%1' and '%2' for requirement '%3'.",
+        messageId: "SVC4119"
+    }
+#-----------SVC4120---------------------------
+# %1 - User's USER_ID
+    USER_INACTIVE: {
+        code: 404,
+        message: "Error: User %1 was not found.",
+        messageId: "SVC4120"
+    }
+#-----------SVC4121---------------------------
+# %1 - User's USER_ID
+    USER_HAS_ACTIVE_ELEMENTS: {
+        code: 403,
+        message: "Error: User with %1 ID can not be deleted since it has active elements(resources/services/artifacts).",
+        messageId: "SVC4121"
+    }
+#-----------SVC4122---------------------------
+# %1 - artifact type
+    ARTIFACT_TYPE_NOT_SUPPORTED: {
+        code: 400,
+        message: "Error: Invalid artifact type '%1'.",
+        messageId: "SVC4122"
+    }
+#-----------SVC4123---------------------------
+    ARTIFACT_LOGICAL_NAME_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Artifact logical name cannot be changed.",
+        messageId: "SVC4123"
+    }
+#-----------SVC4124---------------------------
+    MISSING_ARTIFACT_TYPE: {
+        code: 400,
+        message: "Error: Missing artifact type.",
+        messageId: "SVC4124"
+    }
+#-----------SVC4125---------------------------
+# %1-artifact name
+    ARTIFACT_EXIST: {
+        code: 400,
+        message: "Error: Artifact '%1' already exists.",
+        messageId: "SVC4125"
+    }
+#---------SVC4126------------------------------
+# %1 - resource/service/product/...
+# %2 - field (tag, vendor name...)
+    INVALID_FIELD_FORMAT: {
+        code: 400,
+        message: "Error:  Invalid %1 %2 format.",
+        messageId: "SVC4126"
+    }
+#-----------SVC4127---------------------------
+    ARTIFACT_INVALID_MD5: {
+        code: 400,
+        message: "Error: Invalid artifact checksum.",
+        messageId: "SVC4127"
+    }
+#-----------SVC4128---------------------------
+    MISSING_ARTIFACT_NAME: {
+        code: 400,
+        message: "Error: Invalid content. Missing artifact name.",
+        messageId: "SVC4128"
+    }
+#-----------SVC4129---------------------------
+    MISSING_PROJECT_CODE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing PROJECT_CODE number.",
+        messageId: "SVC4129"
+    }
+#-----------SVC4130---------------------------
+    INVALID_PROJECT_CODE: {
+        code: 400,
+        message: "Error: Invalid Content. PROJECT_CODE must be from 3 up to 50 characters.",
+        messageId: "SVC4130"
+    }
+#-----------SVC4131---------------------------
+# %1-resource/service
+# %2-srtifact/artifacts
+# %3-semicolomn separated list of artifact
+    COMPONENT_MISSING_MANDATORY_ARTIFACTS: {
+        code: 403,
+        message: "Error: Missing mandatory informational %1 %2: [%3].",
+        messageId: "SVC4131"
+    }
+#-----------SVC4132---------------------------
+# %1 - lifecycle  type name
+    LIFECYCLE_TYPE_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Lifecycle Type with name '%1' already exists.",
+        messageId: "SVC4132"
+    }
+#-----------SVC4133---------------------------
+# %1 - service version
+# %2 - service name
+    SERVICE_NOT_AVAILABLE_FOR_DISTRIBUTION: {
+        code: 403,
+        message: "Error: Version %1 of '%2' service is not available for distribution.",
+        messageId: "SVC4133"
+    }
+#-----------SVC4134---------------------------
+    MISSING_LIFECYCLE_TYPE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing interface life-cycle type.",
+        messageId: "SVC4134"
+    }
+#---------SVC4135------------------------------
+    SERVICE_CATEGORY_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Service category cannot be changed once the service is certified.",
+        messageId: "SVC4135"
+    }
+#---------SVC4136------------------------------
+# %1 - distribution environment name
+    DISTRIBUTION_ENVIRONMENT_NOT_AVAILABLE: {
+        code: 500,
+        message: "Error: Requested distribution environment '%1' is not available.",
+        messageId: "SVC4136"
+    }
+#---------SVC4137------------------------------
+# %1 - distribution environment name
+    DISTRIBUTION_ENVIRONMENT_NOT_FOUND: {
+        code: 400,
+        message: "Error: Requested distribution environment '%1' was not found.",
+        messageId: "SVC4137"
+    }
+#---------SVC4138------------------------------
+    DISTRIBUTION_ENVIRONMENT_INVALID: {
+        code: 400,
+        message: "Error: Invalid distribution environment.",
+        messageId: "SVC4138"
+    }
+#---------SVC4139------------------------------
+# %1 - service name
+    DISTRIBUTION_ARTIFACT_NOT_FOUND: {
+        code: 409,
+        message: "Error: Service '%1' cannot be distributed due to missing deployment artifacts.",
+        messageId: "SVC4139"
+    }
+#---------SVC4200------------------------------
+# %1 - Service/Resource
+# %2 - max icon name length
+    COMPONENT_ICON_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. %1 icon name exceeds limit of %2 characters.",
+        messageId: "SVC4200"
+    }
+#---------SVC4300------------------------------
+    RESTRICTED_ACCESS: {
+        code: 403,
+        message: "Error: Restricted access.",
+        messageId: "SVC4300"
+    }
+#---------SVC4301------------------------------
+    RESTRICTED_OPERATION: {
+        code: 409,
+        message: "Error: Restricted operation.",
+        messageId: "SVC4301"
+    }
+#---------SVC4500------------------------------
+    MISSING_BODY: {
+        code: 400  ,
+        message: "Error: Missing request body.",
+        messageId: "SVC4500"
+    }
+#---------SVC4501------------------------------
+    MISSING_PUBLIC_KEY: {
+        code: 400  ,
+        message: "Error: Invalid Content. Missing mandatory parameter 'apiPublicKey'." ,
+        messageId: "SVC4501"
+    }
+#---------SVC4502------------------------------
+    DISTRIBUTION_ENV_DOES_NOT_EXIST: {
+        code: 400  ,
+        message: "Error: Invalid  Body  : Missing mandatory parameter 'distrEnvName'." ,
+        messageId: "SVC4502"
+    }
+#-----------SVC4503---------------------------
+# %1 - service name
+    SERVICE_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' service was not found.",
+        messageId: "SVC4503"
+    }
+
+#---------SVC4504------------------------------
+# %1 - Service/Resource
+# %2 - service/resource version
+    COMPONENT_VERSION_NOT_FOUND: {
+        code: 404,
+        message: "Error: %1 version %2 was not found.",
+        messageId: "SVC4504"
+    }
+#-----------SVC4505---------------------------
+    #%1-artifact name
+
+    ARTIFACT_NOT_FOUND: {
+        code: 404,
+        message: "Error: Artifact '%1' was not found.",
+        messageId: "SVC4505"
+    }
+#---------SVC4506------------------------------
+    MISSING_ENV_NAME: {
+        code: 400  ,
+        message: "Error: Invalid Content. Missing mandatory parameter 'distrEnvName'.",
+        messageId: "SVC4506"
+    }
+#---------SVC4507------------------------------
+    COMPONENT_INVALID_TAGS_NO_COMP_NAME: {
+        code: 400,
+        message: "Error: Invalid Content. One of the tags should be the component name.",
+        messageId: "SVC4507"
+    }
+
+#---------SVC4508------------------------------
+    SERVICE_NAME_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Service name cannot be changed once the service is certified.",
+        messageId: "SVC4508"
+    }
+
+#---------SVC4509------------------------------
+    SERVICE_ICON_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Icon cannot be changed once the service is certified.",
+        messageId: "SVC4509"
+    }
+#---------SVC4510------------------------------
+# %1 - icon name max length
+    SERVICE_ICON_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Icon name exceeds limit of %1 characters.",
+        messageId: "SVC4510"
+    }
+#---------SVC4511------------------------------
+    DISTRIBUTION_REQUESTED_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested distribution was not found.",
+        messageId: "SVC4511"
+    }
+#---------SVC4512------------------------------
+# %1 - Distribution ID
+    DISTRIBUTION_REQUESTED_FAILED: {
+        code: 403,
+        message: "Error: Requested distribution '%1' failed.",
+        messageId: "SVC4512"
+    }
+#---------SVC4513------------------------------
+    RESOURCE_CATEGORY_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Resource category cannot be changed once the resource is certified.",
+        messageId: "SVC4513"
+    }
+#---------SVC4514------------------------------
+    RESOURCE_NAME_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Resource name cannot be changed once the resource is certified.",
+        messageId: "SVC4514"
+    }
+#---------SVC4515------------------------------
+    RESOURCE_ICON_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Icon cannot be changed once the resource is certified.",
+        messageId: "SVC4515"
+    }
+#---------SVC4516------------------------------
+    RESOURCE_VENDOR_NAME_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Vendor name cannot be changed once the resource is certified.",
+        messageId: "SVC4516"
+    }
+#---------SVC4517------------------------------
+    RESOURCE_DERIVED_FROM_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: Derived from resource template cannot be changed once the resource is certified.",
+        messageId: "SVC4517"
+    }
+#---------SVC4518------------------------------
+# %1 - max length
+    COMPONENT_SINGLE_TAG_EXCEED_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Single tag exceeds limit of %1 characters.",
+        messageId: "SVC4518"
+    }
+#---------SVC4519------------------------------
+    INVALID_DEFAULT_VALUE: {
+        code: 400,
+        message: "Error: mismatch in data-type occurred for property %1. data type is %2 and default value found is %3.",
+        messageId: "SVC4519"
+    }
+#---------SVC4520------------------------------
+# %1 - service or resource
+    ADDITIONAL_INFORMATION_MAX_NUMBER_REACHED: {
+        code: 409,
+        message: "Error: Maximal number of additional %1 parameters was reached.",
+        messageId: "SVC4520"
+    }
+#---------SVC4521------------------------------
+    ADDITIONAL_INFORMATION_EMPTY_STRING_NOT_ALLOWED: {
+        code: 400,
+        message: "Error: Invalid Content. The Additional information label and value cannot be empty.",
+        messageId: "SVC4521"
+    }
+#---------SVC4522------------------------------
+# %1 - label/value
+# %2 - Maximal length of %1
+    ADDITIONAL_INFORMATION_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Additional information %1 exceeds limit of %2 characters.",
+        messageId: "SVC4522"
+    }
+#---------SVC4523------------------------------
+    ADDITIONAL_INFORMATION_KEY_NOT_ALLOWED_CHARACTERS: {
+        code: 400,
+        message: 'Error: Invalid Content. Additional information label is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4523"
+    }
+#---------SVC4524------------------------------
+    ADDITIONAL_INFORMATION_NOT_FOUND: {
+        code: 409,
+        message: "Error: Requested additional information was not found.",
+        messageId: "SVC4524"
+    }
+#---------SVC4525------------------------------
+    ADDITIONAL_INFORMATION_VALUE_NOT_ALLOWED_CHARACTERS: {
+        code: 400,
+        message: 'Error: Invalid Content. Additional information contains non-english characters.',
+        messageId: "SVC4525"
+    }
+#---------SVC4526------------------------------
+    RESOURCE_INSTANCE_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' resource instance was not found.",
+        messageId: "SVC4526"
+    }
+#---------SVC4527------------------------------
+    ASDC_VERSION_NOT_FOUND: {
+        code: 500,
+        message: 'Error: ASDC version cannot be displayed.',
+        messageId: "SVC4527"
+    }
+#---------SVC4528------------------------------
+# %1-artifact url/artifact label/artifact description/VNF Service Indicator
+    MISSING_DATA: {
+        code: 400,
+        message: "Error: Invalid content. Missing %1.",
+        messageId: "SVC4528"
+    }
+#---------SVC4529------------------------------
+# %1-artifact url/artifact label/artifact description/artifact name
+# %2 - Maximal length of %1
+    EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. %1 exceeds limit of %2 characters.",
+        messageId: "SVC4529"
+    }
+#---------SVC4530------------------------------
+    ARTIFACT_INVALID_TIMEOUT: {
+        code: 400,
+        message: "Error: Invalid Content. Artifact Timeout should be set to valid positive non-zero number of minutes.",
+        messageId: "SVC4530"
+    }
+#---------SVC4531------------------------------
+    SERVICE_IS_VNF_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: VNF Indicator cannot be updated for certified service.",
+        messageId: "SVC4531"
+    }
+ #---------SVC4532------------------------------
+    RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE: {
+        code: 404,
+        message: "Error: Requested '%1' resource instance was not found on the service '%2.",
+        messageId: "SVC4532"
+    }
+ #---------SVC4533------------------------------
+ # %1 -  "HEAT"/"HEAT_ENV"/"MURANO_PKG"/"YANG_XML"
+    WRONG_ARTIFACT_FILE_EXTENSION: {
+        code: 400,
+        message: "Error: Invalid file extension for %1 artifact type.",
+        messageId: "SVC4533"
+    }
+
+#---------SVC4534------------------------------
+# %1 -  "HEAT"/"HEAT_ENV"
+    INVALID_YAML: {
+        code: 400,
+        message: "Error: Uploaded YAML file for %1 artifact is invalid.",
+        messageId: "SVC4534"
+    }
+
+#---------SVC4535------------------------------
+# %1 -  "HEAT"
+    INVALID_DEPLOYMENT_ARTIFACT_HEAT: {
+        code: 400,
+        message: "Error: Invalid %1 artifact.",
+        messageId: "SVC4535"
+    }
+#---------SVC4536------------------------------
+# %1 - "Resource"/"Service"
+# %2 -  resource/service name
+# %3 -  "HEAT"/"HEAT_ENV"/"MURANO_PKG"
+# %4 -  "HEAT"/"HEAT_ENV"/"MURANO_PKG
+    DEPLOYMENT_ARTIFACT_OF_TYPE_ALREADY_EXISTS: {
+        code: 400,
+        message: "Error: %1 '%2' already has a deployment artifact of %3 type .Please delete or update an existing %4 artifact.",
+        messageId: "SVC4536"
+    }
+
+#---------SVC4537------------------------------
+    MISSING_HEAT: {
+        code: 400,
+        message: "Error: Missing HEAT artifact. HEAT_ENV artifact cannot be uploaded without corresponding HEAT template.",
+        messageId: "SVC4537"
+    }
+#---------SVC4538------------------------------
+    MISMATCH_HEAT_VS_HEAT_ENV: {
+        code: 400,
+        message: "Error: Invalid artifact content. Parameter's set in HEAT_ENV '%1' artifact doesn't match the parameters in HEAT '%2' artifact.",
+        messageId: "SVC4538"
+    }
+#---------SVC4539------------------------------
+    INVALID_RESOURCE_PAYLOAD: {
+        code: 400,
+        message: "Error: Invalid resource payload.",
+        messageId: "SVC4539"
+    }
+#---------SVC4540------------------------------
+    INVALID_TOSCA_FILE_EXTENSION: {
+        code: 400,
+        message: "Error: Invalid file extension for TOSCA template.",
+        messageId: "SVC4540"
+    }
+#---------SVC4541------------------------------
+    INVALID_YAML_FILE: {
+        code: 400,
+        message: "Error: Invalid YAML file.",
+        messageId: "SVC4541"
+    }
+#---------SVC4542------------------------------
+    INVALID_TOSCA_TEMPLATE: {
+        code: 400,
+        message: "Error: Invalid TOSCA template.",
+        messageId: "SVC4542"
+    }
+#---------SVC4543------------------------------
+    NOT_RESOURCE_TOSCA_TEMPLATE: {
+        code: 400,
+        message: "Error: Imported Service TOSCA template.",
+        messageId: "SVC4543"
+    }
+#---------SVC4544------------------------------
+    NOT_SINGLE_RESOURCE: {
+        code: 400,
+        message: "Error: Imported TOSCA template should contain one resource definition.",
+        messageId: "SVC4544"
+    }
+#---------SVC4545------------------------------
+    INVALID_RESOURCE_NAMESPACE: {
+        code: 400,
+        message: "Error: Invalid resource namespace.",
+        messageId: "SVC4545"
+    }
+#---------SVC4546------------------------------
+    RESOURCE_ALREADY_EXISTS: {
+        code: 400,
+        message: "Error: Imported resource already exists in ASDC Catalog.",
+        messageId: "SVC4546"
+    }
+#---------SVC4549------------------------------
+    INVALID_RESOURCE_CHECKSUM: {
+        code: 400,
+        message: "Error: Invalid resource checksum.",
+        messageId: "SVC4549"
+    }
+#---------SVC4550------------------------------
+    #%1  -  Consumer salt
+    INVALID_LENGTH: {
+        code: 400,
+        message: "Error: Invalid %1 length.",
+        messageId: "SVC4550"
+    }
+    #---------SVC4551------------------------------
+    #%1  -  ECOMP User name
+    ECOMP_USER_NOT_FOUND: {
+        code: 404,
+        message: "Error: ECOMP User '%1' was not found.",
+        messageId: "SVC4551"
+    }
+#---------SVC4552------------------------------
+    CONSUMER_ALREADY_EXISTS: {
+        code: 409,
+        message: "Error: ECOMP User already exists.",
+        messageId: "SVC4552"
+    }
+#---------SVC4553-----------------------------
+    #%1  -  Consumer name / Consumer password/ Consumer salt
+    INVALID_CONTENT_PARAM: {
+        code: 400,
+        message: "Error: %1 is invalid.",
+        messageId: "SVC4553"
+    }
+    #---------SVC4554------------------------------
+# %1 - "Resource"/"Service"
+    COMPONENT_ARTIFACT_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested artifact doesn't belong to specified %1.",
+        messageId: "SVC4554"
+    }
+#---------SVC4554------------------------------
+# %1 - "Service name"
+    SERVICE_DEPLOYMENT_ARTIFACT_NOT_FOUND: {
+        code: 403,
+        message: "Error: Requested '%1' service is not ready for certification. Service has to have at least one deployment artifact.",
+        messageId: "SVC4554"
+    }
+#---------SVC4555------------------------------
+#%1 - "Resource"/"Service"/"Product"
+#%2 - "category"
+    COMPONENT_ELEMENT_INVALID_NAME_LENGTH: {
+        code: 400,
+        message: "Error: Invalid %1 %2 name length.",
+        messageId: "SVC4555"
+    }
+#---------SVC4556------------------------------
+#%1 - "Resource"/"Service"/"Product"
+#%2 - "category"
+    COMPONENT_ELEMENT_INVALID_NAME_FORMAT: {
+        code: 400,
+        message: "Error: Invalid %1 %2 name format.",
+        messageId: "SVC4556"
+    }
+#---------SVC4557------------------------------
+#%1 - "Resource"/"Service"/"Product"
+#%2 - "category name"
+    COMPONENT_CATEGORY_ALREADY_EXISTS: {
+        code: 409,
+        message: "Error: %1 category name '%2' already exists.",
+        messageId: "SVC4557"
+    }
+#---------SVC4558------------------------------
+# %1 - "service"/"VF"
+# %2 - "Resource name"
+    VALIDATED_RESOURCE_NOT_FOUND: {
+        code: 403,
+        message: "Error: Submit for Testing is not permitted as your '%1' includes non-validated '%2' resource.",
+        messageId: "SVC4558"
+    }
+#---------SVC4559------------------------------
+# %1 - "service"/"VF"
+# %2 - "Resource name"
+    FOUND_ALREADY_VALIDATED_RESOURCE: {
+        code: 403,
+        message: "Error: Submit for Testing is not permitted as your '%1' includes non-validated '%2' resource. Please use already available validated resource version.",
+        messageId: "SVC4559"
+    }
+#---------SVC4560------------------------------
+# %1 - "service"/"VF"
+# %2 - "Resource name"
+    FOUND_LIST_VALIDATED_RESOURCES: {
+        code: 403,
+        message: "Error: Submit for Testing is not permitted as your '%1' includes non-validated '%2' resource. Please use one of available validated resource versions.",
+        messageId: "SVC4560"
+    }
+#---------SVC4561------------------------------
+# %1 - "resource"/"product"
+# %2 - "category"
+# %3 - "category name"
+    COMPONENT_CATEGORY_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested %1 %2 '%3' was not found.",
+        messageId: "SVC4561"
+    }
+#---------SVC4562------------------------------
+# %1 - "Resource"/"Product"
+# %2 - "sub-category name"
+# %3 - "category name"
+    COMPONENT_SUB_CATEGORY_EXISTS_FOR_CATEGORY: {
+        code: 409,
+        message: "Error: %1 sub-category '%2' already exists under '%3' category.",
+        messageId: "SVC4562"
+    }
+#---------SVC4563------------------------------
+# %1 - "Product"
+# %2 - "grouping name"
+# %3 - "sub-category name"
+    COMPONENT_GROUPING_EXISTS_FOR_SUB_CATEGORY: {
+        code: 409,
+        message: "Error: %1 grouping '%2' already exists under '%3' sub-category.",
+        messageId: "SVC4563"
+    }
+#---------SVC4564------------------------------
+# %1 - product name
+    PRODUCT_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' product was not found.",
+        messageId: "SVC4564"
+    }
+#---------SVC4565------------------------------
+# %1 - "HEAT"
+# %2  - parameter type ("string" , "boolean" , "number")
+# %3 -  parameter name
+    INVALID_HEAT_PARAMETER_VALUE: {
+        code: 400,
+        message: "Error: Invalid %1 artifact. Invalid %2 value set for '%3' parameter.",
+        messageId: "SVC4565"
+    }
+#---------SVC4566------------------------------
+# %1 - "HEAT"
+# %2  - parameter type ("string" , "boolean" , "number")
+    INVALID_HEAT_PARAMETER_TYPE: {
+        code: 400,
+        message: "Error: Invalid %1 artifact. Unsupported '%2' parameter type.",
+        messageId: "SVC4566"
+    }
+#---------SVC4567------------------------------
+# %1 -  "YANG_XML"
+    INVALID_XML: {
+        code: 400,
+        message: "Error: Uploaded XML file for %1 artifact is invalid.",
+        messageId: "SVC4567"
+    }
+#---------SVC4567------------------------------
+# %1 - "User Name and UserId"
+# %2  -"checked-out"/"in-certification"
+    CANNOT_DELETE_USER_WITH_ACTIVE_ELEMENTS: {
+        code: 409,
+        message: "Error: User cannot be deleted. User '%1' has %2 projects.",
+        messageId: "SVC4567"
+    }
+#---------SVC4568------------------------------
+# %1 - "User Name and UserId"
+# %2  -"checked-out"/"in-certification"
+    CANNOT_UPDATE_USER_WITH_ACTIVE_ELEMENTS: {
+        code: 409,
+        message: "Error: Role cannot be changed. User '%1' has %2 projects.",
+        messageId: "SVC4568"
+    }
+#---------SVC4570------------------------------
+    UPDATE_USER_ADMIN_CONFLICT: {
+        code: 409,
+        message: "Error: An administrator is not allowed to change his/her role.",
+        messageId: "SVC4570"
+    }
+#---------SVC4571------------------------------
+    SERVICE_CANNOT_CONTAIN_SUBCATEGORY: {
+        code: 400,
+        message: "Error: Sub category cannot be defined for service",
+        messageId: "SVC4571"
+    }
+#---------SVC4572------------------------------
+# %1 - "Resource"/"Service"
+    COMPONENT_TOO_MUCH_CATEGORIES: {
+        code: 400,
+        message: "Error: %1 must have only 1 category",
+        messageId: "SVC4572"
+    }
+#---------SVC4574------------------------------
+    RESOURCE_TOO_MUCH_SUBCATEGORIES: {
+        code: 400,
+        message: "Error: Resource must have only 1 sub category",
+        messageId: "SVC4574"
+    }
+#---------SVC4575------------------------------
+    COMPONENT_MISSING_SUBCATEGORY: {
+        code: 400,
+        message: "Error: Missing sub category",
+        messageId: "SVC4575"
+    }
+ #---------SVC4576------------------------------
+# %1 - "component type"
+    UNSUPPORTED_ERROR: {
+        code: 400,
+        message: "Error : Requested component type %1 is unsupported.",
+        messageId: "SVC4576"
+    }
+    #---------SVC4577------------------------------
+# %1 - "resource type"
+    RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES: {
+        code: 409,
+        message: "Error : Resource of type %1 cannot contain resource instances.",
+        messageId: "SVC4577"
+    }
+#---------SVC4578------------------------------
+# %1 - "Resource"/"Service"
+# %2 -  resource/service name
+# %3 -  "artifact name"
+    DEPLOYMENT_ARTIFACT_NAME_ALREADY_EXISTS: {
+        code: 400,
+        message: "Error: %1 '%2' already has a deployment artifact named '%3'.",
+        messageId: "SVC4578"
+    }
+#---------SVC4579------------------------------
+# %1 - "Category"/"Sub-Category"/"Group"
+# %2 -  category/sub-category/grouping name.
+    INVALID_GROUP_ASSOCIATION: {
+        code: 400,
+        message: "Error: Invalid group association. %1 '%2' was not found.",
+        messageId: "SVC4579"
+    }
+#---------SVC4580------------------------------
+    EMPTY_PRODUCT_CONTACTS_LIST: {
+        code: 400,
+        message: "Error: Invalid content. At least one Product Contact has to be specified.",
+        messageId: "SVC4580"
+    }
+#---------SVC4581------------------------------
+# %1 - UserId
+    INVALID_PRODUCT_CONTACT: {
+        code: 400,
+        message: "Error: Invalid content. User '%1' cannot be set as Product Contact.",
+        messageId: "SVC4581"
+    }
+#---------SVC4582------------------------------
+# %1 - Product
+# %2 - "abbreviated"/"full"
+    MISSING_ONE_OF_COMPONENT_NAMES: {
+        code: 400,
+        message: "Error: Invalid content. Missing %1 %2 name.",
+        messageId: "SVC4582"
+    }
+#---------SVC4583------------------------------
+# %1 - "Icon"
+# %2 - "resource"/"service"/"product"
+    COMPONENT_PARAMETER_CANNOT_BE_CHANGED: {
+        code: 400,
+        message: "Error: %1 cannot be changed once the %2 is certified.",
+        messageId: "SVC4583"
+    }
+#---------SVC4584------------------------------
+# %1  - service/VF name
+# %2 - "service" /"VF"
+# %3 -  resource instance origin type
+# %4 -  resource instance name
+# %5 -  requirement/capability
+# %6 -  requirement/capability name
+# %7 -  "fulfilled" (for req)/"consumed (for cap)"
+    REQ_CAP_NOT_SATISFIED_BEFORE_CERTIFICATION: {
+        code: 403,
+        message: "Error:  Requested '%1' %2 is not ready for certification.  %3 '%4' has to have %5 '%6' %7.",
+        messageId: "SVC4584"
+    }
+#---------SVC4585------------------------------
+    INVALID_OCCURRENCES: {
+        code: 400,
+        message: "Error: Invalid occurrences format.",
+        messageId: "SVC4585"
+    }
+#---------SVC4586------------------------------
+#---------SVC4586------------------------------
+    INVALID_SERVICE_API_URL: {
+        code: 400,
+        message: 'Error: Invalid Service API URL. Please check whether your URL has a valid domain extension and does not contain the following characters - #?&@%+;,=$<>~^`\[]{}|"*!',
+        messageId: "SVC4586"
+    }
+#---------SVC4587------------------------------
+# %1  - Data type name
+    DATA_TYPE_ALREADY_EXIST: {
+        code: 409,
+        message: 'Error: Data type %1 already exists.',
+        messageId: "SVC4587"
+    }
+#---------SVC4588------------------------------
+# %1  - Data type name
+    DATA_TYPE_NOR_PROPERTIES_NEITHER_DERIVED_FROM: {
+        code: 400,
+        message: 'Error: Invalid Data type %1. Data type must have either a valid derived from declaration or at least one valid property',
+        messageId: "SVC4588"
+    }
+#---------SVC4589------------------------------
+# %1  - Data type name
+    DATA_TYPE_PROPERTIES_CANNOT_BE_EMPTY: {
+        code: 400,
+        message: "Error: Invalid Data type %1. 'properties' parameter cannot be empty if provided.",
+        messageId: "SVC4589"
+    }
+#---------SVC4590------------------------------
+# %1  - Property type name
+# %2  - Property name
+    INVALID_PROPERTY_TYPE: {
+        code: 400,
+        message: "Error: Invalid Property type %1 in property %2.",
+        messageId: "SVC4590"
+    }
+#---------SVC4591------------------------------
+# %1  - Property inner type
+# %2  - Property name
+    INVALID_PROPERTY_INNER_TYPE: {
+        code: 400,
+        message: "Error: Invalid property inner type %1, in property %2",
+        messageId: "SVC4591"
+    }
+#---------SVC4592------------------------------
+# %1  - component instance name
+# %2  - "resource instance"/"service instance"
+    COMPONENT_INSTANCE_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' %2 was not found.",
+        messageId: "SVC4592"
+    }
+#---------SVC4593------------------------------
+# %1 - component instance name
+# %2 - "resource instance"/"service instance"
+# %3 - "resource/"service"/"product"
+# %4 - container name
+    COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER: {
+        code: 404,
+        message: "Error: Requested '%1' %2 was not found on the %3 '%4'.",
+        messageId: "SVC4593"
+    }
+#---------SVC4594------------------------------
+#%1 - requirement / capability
+#%2 - requirement name
+    IMPORT_DUPLICATE_REQ_CAP_NAME: {
+        code: 400,
+        message: "Error: Imported TOSCA template contains more than one %1 named '%2'.",
+        messageId: "SVC4594"
+    }
+#---------SVC4595------------------------------
+#%1 - requirement / capability
+#%2 - requirement name
+#%3 - parent containing the requirement
+    IMPORT_REQ_CAP_NAME_EXISTS_IN_DERIVED: {
+        code: 400,
+        message: "Error: Imported TOSCA template contains %1 '%2' that is already defined by derived template %3.",
+        messageId: "SVC4595"
+    }
+#---------SVC4596------------------------------
+# %1  - Data type name
+    DATA_TYPE_DERIVED_IS_MISSING: {
+        code: 400,
+        message: "Error: Invalid Content. The ancestor data type %1 cannot be found in the system.",
+        messageId: "SVC4596"
+    }
+#---------SVC4597------------------------------
+# %1  - Data type name
+# %2  - Property names
+    DATA_TYPE_PROPERTY_ALREADY_DEFINED_IN_ANCESTOR: {
+        code: 400,
+        message: "Error: Invalid Content. The data type %1 contains properties named %2 which are already defined in one of its ancestors.",
+        messageId: "SVC4597"
+    }
+#---------SVC4598------------------------------
+# %1  - Data type name
+    DATA_TYPE_DUPLICATE_PROPERTY: {
+        code: 400,
+        message: "Error: Invalid Content. The data type %1 contains duplicate property.",
+        messageId: "SVC4598"
+    }
+#---------SVC4599------------------------------
+# %1  - Data type name
+# %2  - Property names
+    DATA_TYPE_PROEPRTY_CANNOT_HAVE_SAME_TYPE_OF_DATA_TYPE: {
+        code: 400,
+        message: "Error: Invalid Content. The data type %1 contains properties %2 which their type is this data type.",
+        messageId: "SVC4599"
+    }
+#---------SVC4600------------------------------
+# %1  - Data type name
+    DATA_TYPE_CANNOT_HAVE_PROPERTIES: {
+        code: 400,
+        message: "Error: Invalid Content. The data type %1 cannot have properties since it is of type scalar",
+        messageId: "SVC4600"
+    }
+#---------SVC4601------------------------------
+    NOT_TOPOLOGY_TOSCA_TEMPLATE: {
+        code: 400,
+        message: "Error: TOSCA yaml file %1 cannot be modeled to VF as it does not contain 'topology_template.",
+        messageId: "SVC4601"
+    }
+#---------SVC4602--------------------------------
+# %1 - yaml file name
+# %2 - node_template label
+# %3 - node_template type
+    INVALID_NODE_TEMPLATE: {
+        code: 400,
+        message: "Error: TOSCA yaml file '%1' contains node_template '%2' of type '%3' that does not represent existing VFC/CP/VL",
+        messageId: "SVC4602"
+    }
+#---------SVC4603------------------------------
+# %1 - component type
+# %2 - component name
+# %3 - state
+    ILLEGAL_COMPONENT_STATE: {
+        code: 403,
+        message: "Error: Component instance of %1 can not be created because the component '%2' is in an illegal state %3.",
+        messageId: "SVC4603"
+    }
+#---------SVC4604------------------------------
+# %1 - csar file name
+    CSAR_INVALID: {
+        code: 400,
+        message: "Error: TOSCA CSAR '%1' is invalid. 'TOSCA-Metadata/Tosca.meta' file must be provided.",
+        messageId: "SVC4604"
+    }
+#---------SVC4605------------------------------
+# %1 - csar file name
+    CSAR_INVALID_FORMAT: {
+        code: 400,
+        message: "Error: TOSCA CSAR '%1' is invalid. Invalid 'TOSCA-Metadata/Tosca.meta' file format.",
+        messageId: "SVC4605"
+    }
+#---------SVC4606------------------------------
+# %1 - property name
+# %2 - property type
+# %3 - property innerType
+# %4 - default value is
+    INVALID_COMPLEX_DEFAULT_VALUE: {
+        code: 400,
+        message: "Error: Invalid default value of property %1. Data type is %2 with inner type %3 and default value found is %4.",
+        messageId: "SVC4606"
+    }
+#---------SVC4607------------------------------
+# %1 - csar file name
+    CSAR_NOT_FOUND: {
+        code: 400,
+        message: "Error: TOSCA CSAR '%1' is not found.",
+        messageId: "SVC4607"
+    }
+#---------SVC4608------------------------------
+# %1 - artifact name
+# %2 - component type
+# %3 - actual component type
+    MISMATCH_BETWEEN_ARTIFACT_TYPE_AND_COMPONENT_TYPE: {
+        code: 400,
+        message: "Error: Artifact %1 is only compatible with component of type %2, but component type is %3.",
+        messageId: "SVC4608"
+    }
+
+#---------SVC4609------------------------------
+# %1 -  "INVALID_JSON"
+    INVALID_JSON: {
+        code: 400,
+        message: "Error: Uploaded JSON file for %1 artifact is invalid.",
+        messageId: "SVC4609"
+    }
+#---------SVC4610------------------------------
+# %1 - csar file name
+# %2 - missing file name
+    YAML_NOT_FOUND_IN_CSAR: {
+        code: 400,
+        message: "Error - TOSCA CSAR %1 is invalid. TOSCA-Metadata/Tosca.meta refers to file %2 that is not provided.",
+        messageId: "SVC4610"
+    }
+#---------SVC4611------------------------------
+# %1 - group name
+    GROUP_MEMBER_EMPTY: {
+        code: 400,
+        message: "Error: Invalid Content. Group %1 member list was provided but does not have values",
+        messageId: "SVC4611"
+    }
+#---------SVC4612------------------------------
+# %1  - group name
+    GROUP_TYPE_ALREADY_EXIST: {
+        code: 409,
+        message: 'Error: Group type %1 already exists.',
+        messageId: "SVC4612"
+    }
+#---------SVC4613------------------------------
+# %1 - group name
+# %2 - VF name(component name)
+# %3 - actual component type [VF]
+    GROUP_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Group with name '%1' already exists in %2 %3.",
+        messageId: "SVC4613"
+    }
+#---------SVC4614------------------------------
+# %1 - group type
+    GROUP_TYPE_IS_INVALID: {
+        code: 400,
+        message: "Error: Invalid content. Group type %1 does not exist",
+        messageId: "SVC4614"
+    }
+#---------SVC4615------------------------------
+# %1 - group name
+    GROUP_MISSING_GROUP_TYPE: {
+        code: 400,
+        message: "Error: Invalid Content. Missing Group Type for group '%1'",
+        messageId: "SVC4615"
+    }
+#---------SVC4616------------------------------
+# %1 - member name
+# %2 - group name
+# %3 - VF name
+# %4 - component type [VF ]
+    GROUP_INVALID_COMPONENT_INSTANCE: {
+        code: 400,
+        message: "Error: Member '%1' listed in group '%2' is not part of '%3' %4.",
+        messageId: "SVC4616"
+    }
+#---------SVC4617------------------------------
+# %1 - member name
+# %2 - group name
+# %3 - group type
+    GROUP_INVALID_TOSCA_NAME_OF_COMPONENT_INSTANCE: {
+        code: 400,
+        message: "Error: member %1 listed in group %2 is not part of allowed members of group type %3.",
+        messageId: "SVC4617"
+    }
+#---------SVC4618------------------------------
+# %1 - missing file name
+# %2 - csar file name
+    ARTIFACT_NOT_FOUND_IN_CSAR: {
+        code: 400,
+        message: "Error: artifact %1 is defined in CSAR %2 manifest but is not provided",
+        messageId: "SVC4618"
+    }
+#---------SVC4619------------------------------
+# %1 - artifact name
+# %2 - artifact type
+# %3 - existing artifact type
+    ARTIFACT_ALRADY_EXIST_IN_DIFFERENT_TYPE_IN_CSAR: {
+        code: 400,
+        message: "Error: artifact %1 in type %2 already exists in type %3.",
+        messageId: "SVC4619"
+    }
+#---------SVC4620------------------------------
+    FAILED_RETRIVE_ARTIFACTS_TYPES: {
+        code: 400,
+        message: "Error: Failed to retrieve list of suported artifact types.",
+        messageId: "SVC4620"
+    }
+#---------SVC4621------------------------------
+# %1 - artifact name
+# %2 - master
+    ARTIFACT_ALRADY_EXIST_IN_MASTER_IN_CSAR: {
+        code: 400,
+        message: "Error: artifact %1 already exists in master %2 .",
+        messageId: "SVC4621"
+    }
+#---------SVC4622------------------------------
+# %1 - artifact name
+# %2 - artifact type
+# %3 - master name
+# %4 - master type
+    ARTIFACT_NOT_VALID_IN_MASTER: {
+        code: 400,
+        message: "Error: artifact %1 in type %2 can not be exists under master %3 in type %4.",
+        messageId: "SVC4622"
+    }
+#---------SVC4623------------------------------
+# %1 - artifact name
+# %2 - artifact type
+# %3 - env name
+# %4 - existing env
+    ARTIFACT_NOT_VALID_ENV: {
+        code: 400,
+        message: "Error: Artifact %1 in type %2 with env %3 already exists with another env %4",
+        messageId: "SVC4623"
+    }
+#---------SVC4624------------------------------
+# %1 - groups names
+# %2 - VF name
+# %3 - component type [VF ]
+    GROUP_IS_MISSING: {
+        code: 400,
+        message: "Error: Invalid Content. The groups '%1' cannot be found under %2 %3.",
+        messageId: "SVC4624"
+    }
+#---------SVC4625------------------------------
+# %1 - groups name
+    GROUP_ARTIFACT_ALREADY_ASSOCIATED: {
+        code: 400,
+        message: "Error: Invalid Content. Artifact already associated to group '%1'.",
+        messageId: "SVC4625"
+    }
+#---------SVC4626------------------------------
+# %1 - groups name
+    GROUP_ARTIFACT_ALREADY_DISSOCIATED: {
+        code: 400,
+        message: "Error: Invalid Content. Artifact already dissociated from group '%1'.",
+        messageId: "SVC4626"
+    }
+#---------SVC4627------------------------------
+# %1 - property name
+# %2 - group name
+# %3 - group type name
+    GROUP_PROPERTY_NOT_FOUND: {
+        code: 400,
+        message: "Error: property %1 listed in group %2 is not exist in group type %3.",
+        messageId: "SVC4627"
+    }
+#---------SVC4628------------------------------
+# %1 - csarUUID
+# %2 - VF name
+    VSP_ALREADY_EXISTS: {
+        code: 400,
+        message: "Error: The VSP with UUID %1 was already imported for VF %2. Please select another or update the existing VF.",
+        messageId: "SVC4628"
+    }
+#---------SVC4629------------------------------
+# %1 - VF name
+    MISSING_CSAR_UUID: {
+        code: 400,
+        message: "Error: The Csar UUID or payload name is missing for VF %1.",
+        messageId: "SVC4629"
+    }
+#---------SVC4630------------------------------
+# %1 - VF name
+# %2 - new csarUUID
+# %3 - old csarUUID
+    RESOURCE_LINKED_TO_DIFFERENT_VSP: {
+        code: 400,
+        message: "Error: Resource %1 cannot be updated using CsarUUID %2 since the resource is linked to a different VSP with csarUUID %3.",
+        messageId: "SVC4630"
+    }
+#---------SVC4631------------------------------
+# %1  - policy name
+    POLICY_TYPE_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Policy type %1 already exists.",
+        messageId: "SVC4631"
+    }
+#---------SVC4632------------------------------
+# %1 - target name
+# %2 - policy type name
+    TARGETS_NON_VALID: {
+        code: 400,
+        message: "Error: target %1 listed in policy type %2 is not a group or resource.",
+        messageId: "SVC4632"
+    }
+#---------SVC4633------------------------------
+# %1 - policy name
+    TARGETS_EMPTY: {
+        code: 400,
+        message: "Error: Invalid Content. Policy %1 target list was provided but does not have values",
+        messageId: "SVC4633"
+    }
+#---------SVC4634------------------------------
+    DATA_TYPE_CANNOT_BE_EMPTY: {
+        code: 500,
+        message: "Error: Data types are empty. Please import the data types.",
+        messageId: "SVC4634"
+    }
+#---------SVC4635------------------------------
+# %1 - csar uuid
+    RESOURCE_FROM_CSAR_NOT_FOUND: {
+        code: 400,
+        message: "Error: resource from csar uuid %1 not found",
+        messageId: "SVC4635"
+    }
+#---------SVC4636------------------------------
+# %1 - Data type name
+    DATA_TYPE_CANNOT_BE_UPDATED_BAD_REQUEST: {
+        code: 400,
+        message: 'Error: Data type %1 cannot be upgraded. The new data type does not contain old properties or the type of one of the properties has been changed.',
+        messageId: "SVC4636"
+    }
+#-----------SVC4637---------------------------
+#%1 - attribute name
+    ATTRIBUTE_NOT_FOUND: {
+        code: 404,
+        message: "Error: Requested '%1' attribute was not found.",
+        messageId: "SVC4637"
+    }
+#-----------SVC4638---------------------------
+#%1 - attribute name
+    ATTRIBUTE_ALREADY_EXIST: {
+        code: 409,
+        message: "Error: Attribute with '%1' name already exists.",
+        messageId: "SVC4638"
+    }
+#-----------SVC4639---------------------------
+#%1 - property name
+    PROPERTY_NAME_ALREADY_EXISTS: {
+        code: 409,
+        message: "Error: Property with '%1' name and different type already exists.",
+        messageId: "SVC4639"
+    }
+#-----------SVC4640---------------------------
+#%1 - property name
+    INVALID_PROPERTY: {
+        code: 409,
+        message: "Error: Invalid property received.",
+        messageId: "SVC4640"
+    }
+#---------SVC4641-----------------------------
+#%1 - invalid filter
+#%2 - valid filters
+    INVALID_FILTER_KEY: {
+        code: 400,
+        message: "Error: The filter %1 is not applicable. Please use one of the following filters: %2",
+        messageId: "SVC4641"
+    }
+#---------SVC4642-----------------------------
+#%1 - asset type
+#%2 - filter
+    NO_ASSETS_FOUND: {
+        code: 404,
+        message: "No %1 were found to match criteria %2",
+        messageId: "SVC4642"
+    }
+#---------SVC4643------------------------------
+# %1 - "Resource"/"Product"
+# %2 - "sub-category name"
+# %3 - "category name"
+    COMPONENT_SUB_CATEGORY_NOT_FOUND_FOR_CATEGORY: {
+        code: 404,
+        message: "Error: %1 sub-category '%2' not found under category '%3'.",
+        messageId: "SVC4643"
+    }
+#---------SVC4644------------------------------
+# %1 - Format
+    CORRUPTED_FORMAT: {
+        code: 400,
+        message: "Error: %1 format is corrupted.",
+        messageId: "SVC4644"
+    }
+#---------SVC4645------------------------------
+# %1 - "groupType"
+    INVALID_VF_MODULE_TYPE: {
+        code: 400,
+        message: "Error: Invalid group type '%1' (should be VfModule).",
+        messageId: "SVC4645"
+    }
+#---------SVC4646------------------------------
+# %1 - "groupName"
+    INVALID_VF_MODULE_NAME: {
+        code: 400,
+        message: "Error: Invalid Content. VF Module name '%1' contains invalid characters",
+        messageId: "SVC4646"
+    }
+
+#---------SVC4647------------------------------
+# %1 - "modifiedName"
+    INVALID_VF_MODULE_NAME_MODIFICATION: {
+        code: 400,
+        message: "Error: Invalid VF Module name modification, can not modify '%1'",
+        messageId: "SVC4647"
+    }
+#---------SVC4648------------------------------
+# %1 - "inputId"
+# %2 - "componentId"
+    INPUT_IS_NOT_CHILD_OF_COMPONENT: {
+        code: 400,
+        message: "Error: Input id: '%1' is not child of component id: '%2'",
+        messageId: "SVC4648"
+    }
+#---------SVC4649------------------------------
+# %1 - "groupName"
+    GROUP_HAS_CYCLIC_DEPENDENCY: {
+        code: 400,
+        message: "Error: The group '%1' has cyclic dependency",
+        messageId: "SVC4649"
+    }
+#---------SVC4650------------------------------
+# %1 - "Component Type"
+# %2 - <ServiceName>
+# %3 - error description
+    AAI_ARTIFACT_GENERATION_FAILED: {
+        code: 500,
+        message: "Error: %1 %2 automatic generation of artifacts failed. Description: %3",
+        messageId: "SVC4650"
+    }
+#---------SVC4651------------------------------
+    PARENT_RESOURCE_DOES_NOT_EXTEND: {
+        code: 400,
+        message: "Error: Once resource is certified, derived_from can be changed only to a sibling",
+        messageId: "SVC4651"
+    }
+#---------SVC4652------------------------------
+# %1 - resource/service
+    COMPONENT_INVALID_SUBCATEGORY: {
+        code: 400,
+        message: "Error: Invalid Content. Invalid %1 sub category.",
+        messageId: "SVC4652"
+    }
+#---------SVC4653------------------------------
+# %1 - group instance uniqueId
+# %2 - service uniqueId
+    GROUP_INSTANCE_NOT_FOUND_ON_COMPONENT_INSTANCE: {
+        code: 404,
+        message: "Error: Requested group instance %1 was not found on component %2.",
+        messageId: "SVC4653"
+    }
+#---------SVC4654------------------------------
+# %1 - group property name
+# %2 - valid min limit value
+# %3 - valid max limit value
+    INVALID_GROUP_MIN_MAX_INSTANCES_PROPERTY_VALUE: {
+        code: 400,
+        message: "Error: Value of %1 must be not higher than %2, and not lower than %3.",
+        messageId: "SVC4654"
+    }
+#---------SVC4655------------------------------
+# %1 - group property name
+# %2 - valid min limit value
+# %3 - valid max limit value
+    INVALID_GROUP_INITIAL_COUNT_PROPERTY_VALUE: {
+        code: 400,
+        message: "Error: Value of %1 must be between %2 and %3.",
+        messageId: "SVC4655"
+    }
+#---------SVC4656------------------------------
+# %1 - group property name
+# %2 - lower/higher
+# %3 - valid max/min value
+    INVALID_GROUP_PROPERTY_VALUE_LOWER_HIGHER: {
+        code: 400,
+        message: "Error: Value of %1 must be %2 or equals to %3.",
+        messageId: "SVC4656"
+    }
+#---------SVC4657------------------------------
+# %1 - certificationRequest / startTesting
+    RESOURCE_VFCMT_LIFECYCLE_STATE_NOT_VALID: {
+        code: 400,
+        message: "Error - Lifecycle state %1 is not valid for resource of type VFCMT",
+        messageId: "SVC4657"
+    }
+#---------SVC4658------------------------------
+# %1 – asset type [service / resource ]
+# %2 – main asset uuid
+# %3 – not found asset type [service / resource]
+# %4 – not found asset name
+    ASSET_NOT_FOUND_DURING_CSAR_CREATION: {
+        code: 400,
+        message: "Error: CSAR packaging failed for %1 %2. %3 %4 was not found",
+        messageId: "SVC4658"
+    }
+#---------SVC4659------------------------------
+# %1 – asset type [service / resource ]
+# %2 – main asset uuid
+# %3 – Artifact name
+# %4 – Artifact uuid
+    ARTIFACT_PAYLOAD_NOT_FOUND_DURING_CSAR_CREATION: {
+        code: 400,
+        message: "Error: CSAR packaging failed for %1 %2. Artifact %3 [%4] was not found",
+        messageId: "SVC4659"
+    }
+#---------SVC4660------------------------------
+# %1 - assetType
+# %2 - matching generic node type name
+    GENERIC_TYPE_NOT_FOUND: {
+        code: 404,
+        message: "Creation of %1 failed. Generic type %2 was not found",
+        messageId: "SVC4660"
+    }
+#---------SVC4661------------------------------
+# %1 - assetType
+# %2 - matching generic node type name
+    TOSCA_SCHEMA_FILES_NOT_FOUND: {
+        code: 400,
+        message: "Error: CSAR packaging failed. TOSCA schema files for SDC-Version: %1 and Conformance-Level %2 were not found",
+        messageId: "SVC4661"
+    }
+#---------SVC4662------------------------------
+# %1 - file name
+# %2 - parser error
+    TOSCA_PARSE_ERROR: {
+        code: 400,
+        message: "Error: Invalid TOSCA template in file %1. %2",
+        messageId: "SVC4662"
+    }
+#---------SVC4663------------------------------
+# %1 - max length
+    RESOURCE_VENDOR_MODEL_NUMBER_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Resource vendor model number exceeds limit of %1 characters.",
+        messageId: "SVC4663"
+    }
+#---------SVC4664------------------------------
+    INVALID_RESOURCE_VENDOR_MODEL_NUMBER: {
+        code: 400,
+        message: 'Error: Invalid Content. Resource vendor model number is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4664"
+    }
+#---------SVC4665------------------------------
+# %1 - max length
+    SERVICE_TYPE_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Service type exceeds limit of %1 characters.",
+        messageId: "SVC4665"
+    }
+#---------SVC4666------------------------------
+    INVALID_SERVICE_TYPE: {
+        code: 400,
+        message: 'Error: Invalid Content. Serivce type is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4666"
+    }
+#---------SVC4667------------------------------
+# %1 - max length
+    SERVICE_ROLE_EXCEEDS_LIMIT: {
+        code: 400,
+        message: "Error: Invalid Content. Service role exceeds limit of %1 characters.",
+        messageId: "SVC4667"
+    }
+#---------SVC4668------------------------------
+    INVALID_SERVICE_ROLE: {
+        code: 400,
+        message: 'Error: Invalid Content. Service role is not allowed to contain characters like <>:"\/|?* and space characters other than regular space.',
+        messageId: "SVC4668"
+    }
+
+#---------SVC4669-----------------------------
+    INVALID_RESOURCE_TYPE: {
+        code: 400,
+        message: "Error: Invalid resource type.",
+        messageId: "SVC4669"
+    }
+#---------SVC4670------------------------------
+    ARTIFACT_NAME_INVALID: {
+        code: 400,
+        message: "Error: Artifact name is invalid.",
+        messageId: "SVC4670"
+    }
+#---------SVC4671------------------------------
+# %1 - VSP name
+# %2 - VFC name
+    CFVC_LOOP_DETECTED: {
+        code: 400,
+        message: 'Error: VSP %1 cannot be imported. The VSP contains internal loop in VFC %2',
+        messageId: "SVC4671"
+    }
+#---------SVC4672------------------------------
+# %1 - capability uniqueId
+# %2 - instance uniqueId
+# %3 - container uniqueId
+    COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER: {
+        code: 404,
+        message: "Error: Requested capability %1 of instance %2 was not found on the container %3.",
+        messageId: "SVC4672"
+    }
+
+
+#---------SVC4673------------------------------
+    INVALID_SERVICE_STATE: {
+        code: 409,
+        message: "Error: Invalid service state. Expected state: %1, actual state: %2",
+        messageId: "SVC4673"
+    }
+
+#---------SVC4674------------------------------
+    INVALID_RESPONSE_FROM_PROXY: {
+        code: 502,
+        message: "Error: The server was acting as a gateway or proxy and received an invalid response from the upstream server",
+        messageId: "SVC4674"
+    }
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/neo4j-errors-configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/neo4j-errors-configuration.yaml
new file mode 100644
index 0000000..7a0d6db
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/neo4j-errors-configuration.yaml
@@ -0,0 +1,60 @@
+# Errors
+errors:
+    Neo_ClientError_General_ReadOnly: "This is a read only database, writing or modifying the database is not allowed."
+    Neo_ClientError_LegacyIndex_NoSuchIndex: "The request (directly or indirectly) referred to a index that does not exist."
+    Neo_ClientError_Request_Invalid: "The client provided an invalid Request."
+    Neo_ClientError_Request_InvalidFormat: "The client provided a request that was missing required fields, or had values that are not allowed."
+    Neo_ClientError_Schema_ConstraintAlreadyExists: "Unable to perform operation because it would clash with a pre-existing constraint."
+    Neo_ClientError_Schema_ConstraintVerificationFailure: "Unable to create constraint because data that exists in the database violates it."
+    Neo_ClientError_Schema_ConstraintViolation: "A constraint imposed by the database was violated."
+    Neo_ClientError_Schema_IllegalTokenName: "A token name, such as a label, relationship type or property key, used is not valid. Tokens cannot be empty strings and cannot be null."
+    Neo_ClientError_Schema_IndexAlreadyExists: "Unable to perform operation because it would clash with a pre-existing index."
+    Neo_ClientError_Schema_IndexBelongsToConstraint: "A requested operation can not be performed on the specified index because the index is part of a constraint. If you want to drop the index, for instance, you must drop the constraint."
+    Neo_ClientError_Schema_IndexLimitReached: "The maximum number of index entries supported has been reached, no more entities can be indexed."
+    Neo_ClientError_Schema_LabelLimitReached: "The maximum number of labels supported has been reached, no more labels can be created."
+    Neo_ClientError_Schema_NoSuchConstraint: "The request (directly or indirectly) referred to a constraint that does not exist."
+    Neo_ClientError_Schema_NoSuchIndex: "The request (directly or indirectly) referred to an index that does not exist."
+    Neo_ClientError_Security_AuthenticationFailed: "The client provided an incorrect username and/or password."
+    Neo_ClientError_Security_AuthenticationRateLimit: "The client has provided incorrect authentication details too many times in a row."
+    Neo_ClientError_Security_AuthorizationFailed: "The client does not have privileges to perform the operation requested."
+    Neo_ClientError_Statement_ArithmeticError: "Invalid use of arithmetic, such as dividing by zero."
+    Neo_ClientError_Statement_ConstraintViolation: "A constraint imposed by the statement is violated by the data in the database."
+    Neo_ClientError_Statement_EntityNotFound: "The statement is directly referring to an entity that does not exist."
+    Neo_ClientError_Statement_InvalidArguments: "The statement is attempting to perform operations using invalid arguments"
+    Neo_ClientError_Statement_InvalidSemantics: "The statement is syntactically valid, but expresses something that the database cannot do."
+    Neo_ClientError_Statement_InvalidSyntax: "The statement contains invalid or unsupported syntax."
+    Neo_ClientError_Statement_InvalidType: "The statement is attempting to perform operations on values with types that are not supported by the operation."
+    Neo_ClientError_Statement_NoSuchLabel: "The statement is referring to a label that does not exist."
+    Neo_ClientError_Statement_NoSuchProperty: "The statement is referring to a property that does not exist."
+    Neo_ClientError_Statement_ParameterMissing: "The statement is referring to a parameter that was not provided in the Request."
+    Neo_ClientError_Transaction_ConcurrentRequest: "There were concurrent requests accessing the same transaction, which is not allowed."
+    Neo_ClientError_Transaction_EventHandlerThrewException: "A transaction event handler threw an exception. The transaction will be rolled back."
+    Neo_ClientError_Transaction_HookFailed: "Transaction hook failure."
+    Neo_ClientError_Transaction_InvalidType: "The transaction is of the wrong type to service the Request_ For instance, a transaction that has had schema modifications performed in it cannot be used to subsequently perform data operations, and vice versa."
+    Neo_ClientError_Transaction_MarkedAsFailed: "Transaction was marked as both successful and failed. Failure takes precedence and so this transaction was rolled back although it may have looked like it was going to be committed"
+    Neo_ClientError_Transaction_UnknownId: "The request referred to a transaction that does not exist."
+    Neo_ClientError_Transaction_ValidationFailed: "Transaction changes did not pass validation checks"
+    Neo_DatabaseError_General_CorruptSchemaRule: "A malformed schema rule was encountered. Please contact your support representative."
+    Neo_DatabaseError_General_FailedIndex: "The request (directly or indirectly) referred to an index that is in a failed state. The index needs to be dropped and recreated manually."
+    Neo_DatabaseError_General_UnknownFailure: "An unknown failure occurred."
+    Neo_DatabaseError_Schema_ConstraintCreationFailure: "Creating a requested constraint failed."
+    Neo_DatabaseError_Schema_ConstraintDropFailure: "The database failed to drop a requested constraint."
+    Neo_DatabaseError_Schema_IndexCreationFailure: "Failed to create an index."
+    Neo_DatabaseError_Schema_IndexDropFailure: "The database failed to drop a requested index."
+    Neo_DatabaseError_Schema_NoSuchLabel: "The request accessed a label that did not exist."
+    Neo_DatabaseError_Schema_NoSuchPropertyKey: "The request accessed a property that does not exist."
+    Neo_DatabaseError_Schema_NoSuchRelationshipType: "The request accessed a relationship type that does not exist."
+    Neo_DatabaseError_Schema_NoSuchSchemaRule: "The request referred to a schema rule that does not exist."
+    Neo_DatabaseError_Statement_ExecutionFailure: "The database was unable to execute the Statement."
+    Neo_DatabaseError_Transaction_CouldNotBegin: "The database was unable to start the Transaction."
+    Neo_DatabaseError_Transaction_CouldNotCommit: "The database was unable to commit the Transaction."
+    Neo_DatabaseError_Transaction_CouldNotRollback: "The database was unable to roll back the Transaction."
+    Neo_DatabaseError_Transaction_CouldNotWriteToLog: "The database was unable to write transaction to log."
+    Neo_DatabaseError_Transaction_ReleaseLocksFailed: "The transaction was unable to release one or more of its locks."
+    Neo_TransientError_General_DatabaseUnavailable: "The database is not currently available to serve your request, refer to the database logs for more details. Retrying your request at a later time may succeed."
+    Neo_TransientError_Network_UnknownFailure: "An unknown network failure occurred, a retry may resolve the issue."
+    Neo_TransientError_Schema_ModifiedConcurrently: "The database schema was modified while this transaction was running, the transaction should be retried."
+    Neo_TransientError_Security_ModifiedConcurrently: "The user was modified concurrently to this Request."
+    Neo_TransientError_Statement_ExternalResourceFailure: "The external resource is not available"
+    Neo_TransientError_Transaction_AcquireLockTimeout: "The transaction was unable to acquire a lock, for instance due to a timeout or the transaction thread being interrupted."
+    Neo_TransientError_Transaction_DeadlockDetected: "This transaction, and at least one more transaction, has acquired locks in a way that it will wait indefinitely, and the database has aborted it. Retrying this transaction will most likely be successful."
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/config/test-apis-ci/users-configuration.yaml b/test-apis-ci/src/test/resources/config/test-apis-ci/users-configuration.yaml
new file mode 100644
index 0000000..a6c2365
--- /dev/null
+++ b/test-apis-ci/src/test/resources/config/test-apis-ci/users-configuration.yaml
@@ -0,0 +1,2 @@
+userCredentials:
+    ci: 2a1f887d607d4515d4066fe0f5452a50:0a0dc557c3bf594b1a48030e3e99227580168b21f44e285c69740b8d5b13e33b
\ No newline at end of file
diff --git a/test-apis-ci/src/test/resources/cucumber/tenantIsolation.feature b/test-apis-ci/src/test/resources/cucumber/tenantIsolation.feature
new file mode 100644
index 0000000..f1a0f6f
--- /dev/null
+++ b/test-apis-ci/src/test/resources/cucumber/tenantIsolation.feature
@@ -0,0 +1,38 @@
+Feature: Tenant Isolation Feature
+
+  #Get individual external AT&T Certificate API
+  Scenario Outline: Create operational Envrionment
+    Given AAI returns <retcode> and aai_body contains <tenant> and <workload>
+    When The Number Of Operational Envrinoments that created is <numberOfEnvs> and Records are added with data <recordData>
+    Then The Number Of Environment is <numberOfEnvs> with status <recordStatus>
+    #Verify Succesfull A&AI Call
+    And Operational Environment record contains tenant field <isTenantExist>
+    And Operational Environment record contains workload field <isWorkloadtExist>
+    #Verify Succesfull DME Call
+    And Operational Environment record contains UEB Address field <isUebAddressExist>
+
+    Examples: 
+      | retcode | tenant | workload        | recordData                                     | numberOfEnvs | recordStatus | isTenantExist | isWorkloadtExist | isUebAddressExist |
+      |     200 | Test   | VNF_Development | {"status": "failed", "last_modified_delta": 0} |            1 | completed    | true          | true             | true              |
+
+  Scenario Outline: Distribute To Operational Environment
+    Given ASDC Address is 127.0.0.1
+    And The number of complete environments is <numberOfEnvs>
+    #Start SImulator for each envrionment
+    And The number of artifacts each Simulator downloads from a service is <numberOfArtifactsDownloaded>
+    #5 (3 days) - run jar
+    And MSO-WD Simulators Started with topic name MSHITRIT-D2D
+    And ASDC Contains the following services <ListOfServicesUUID>
+    # (1.5 days)
+    And MSO Final Distribution Simulator is UP
+    #4 (Sends 75 request )(2 days)
+    When Distribution Requests are Sent By MSO
+    Then All MSO-WD Simulators Sent The Distribution Complete Notifications
+    And All Artifacts were downloaded by Simulators
+    #6
+    And MSO Final Distribution Recieved Correct Number Of Request
+
+    Examples: 
+      | numberOfEnvs | numberOfArtifactsDownloaded | ListOfServicesUUID                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
+      #|            5 |                           8 | 74e05aac-48d5-4642-8dc1-dc1ddeb5c0f5,fa86100a-409b-4310-835c-e401896181a5,8dbc41cc-2076-49c0-b95b-cb37b1539367,0c7eb2ac-06c0-41e1-b635-825037942e28,840123d1-b9d6-4036-8e94-471b268026bf,74331473-1eb0-4628-84b8-ab47948f7023, 3277af19-d152-4d94-a4d0-44ad6f226b52, e553c12b-b67b-4d66-a6a9-8676d5e0becf, f648052e-3207-4eb2-9336-29f2fe9df618, 535c6ad3-ad2b-429f-ab9b-b654cf647c86,611c764d-8862-4f09-a8e0-1622f8d97ce9, b5df0774-2445-4daf-b893-61c014652145, 01481626-b58a-49b5-ba1e-74eb8508ed15, 9e17345a-d11d-4219-b4e3-e86cfdb51d07, 5ff40fbc-f4e9-45f1-85de-0a04b8a5d60c |
+      |            2 |                           2 | 74e05aac-48d5-4642-8dc1-dc1ddeb5c0f5,fa86100a-409b-4310-835c-e401896181a5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
diff --git a/test-apis-ci/src/test/resources/preferredRouter.txt b/test-apis-ci/src/test/resources/preferredRouter.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test-apis-ci/src/test/resources/preferredRouter.txt
