diff --git a/onap-enabler-be/src/test/java/org/onap/aai/util/JettyObfuscationConversionCommandLineUtilTest.java b/onap-enabler-be/src/test/java/org/onap/aai/util/JettyObfuscationConversionCommandLineUtilTest.java
new file mode 100644
index 0000000..45a4bcd
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/aai/util/JettyObfuscationConversionCommandLineUtilTest.java
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.aai.util;
+
+import org.junit.Test;
+import org.onap.osam.aai.util.JettyObfuscationConversionCommandLineUtil;
+
+public class JettyObfuscationConversionCommandLineUtilTest {
+
+	private JettyObfuscationConversionCommandLineUtil createTestSubject() {
+		return new JettyObfuscationConversionCommandLineUtil();
+	}
+
+	
+	@Test
+	public void testMain() throws Exception {
+		String[] args = new String[] { "" };
+
+		// default test
+		JettyObfuscationConversionCommandLineUtil.main(args);
+	}
+
+	
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/ecomp/vid/selenium/FirstClass.java b/onap-enabler-be/src/test/java/org/onap/ecomp/vid/selenium/FirstClass.java
new file mode 100644
index 0000000..b1db197
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/ecomp/vid/selenium/FirstClass.java
@@ -0,0 +1,604 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.ecomp.vid.selenium;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterSuite;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.ie.InternetExplorerDriver;
+import org.openqa.selenium.support.ui.Select;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+import org.apache.log4j.Logger;
+import org.testng.Assert;
+import org.testng.asserts.*;
+
+public class FirstClass {
+	
+		WebElement loginButton;
+		
+		/** The eg. */
+		String eg;
+		
+		/** The login. */
+		WebElement login;
+		
+		/** The pwd. */
+		WebElement pwd;
+		
+		/** The log. */
+		Logger log;
+		
+		/** The errormessage. */
+		WebElement errormessage;
+		
+					
+		/** The driver. */
+		WebDriver driver=new FirefoxDriver();
+		
+		
+		
+		/** The config prop. */
+		private final Properties configProp = new Properties();
+		
+		
+		/**
+		 * Instantiates a new first class.
+		 */
+		private  FirstClass() {
+			// TODO Auto-generated constructor stub
+			//
+			try{
+			//	InputStream input =this.getClass().getClassLoader().getResourceAsStream("objectmap.properties");
+			//FileInputStream input1 = new FileInputStream("objectmap.properties");
+				
+			InputStream input =new FileInputStream("objectconfig.properties");
+			System.out.println("Read all properties from file");
+			configProp.load(input);
+			System.out.println("Read all properties from file completed");
+			}
+			catch(IOException e) {
+				
+				e.printStackTrace();
+			}
+		}
+		
+		
+		/*
+		
+		
+		@BeforeClass
+		public void setUp() {
+			System.out.println("*******************");
+			System.out.println("launching IE browser");
+			System.setProperty("webdriver.ie.driver", driverPath+"IEDriverServer.exe");
+			driver = new InternetExplorerDriver();
+			driver.findElement(By.className());
+			driver.manage().window().maximize();
+			
+
+			 login = driver.findElement(By.xpath("//input[@class='fn-ebz-text ng-pristine ng-valid']"));
+			 pwd = driver.findElement(By.xpath("//input[@class='span3 ng-pristine ng-valid']"));
+			 loginButton = driver.findElement(By.id("loginBtn"));
+		}
+		
+		
+	*/
+		/**
+		 * Sets the up.
+		 */
+		// TODO Auto-generated method stub
+		@BeforeClass
+		public void setUp()
+		{
+			
+						
+			//WebDriver driver=new FirefoxDriver();
+			
+			log = Logger.getLogger(FirstClass.class.getName());
+		
+		
+		
+		// Get url
+		driver.get(configProp.getProperty("baseURL"));
+		driver.manage().window().maximize();
+		
+		
+		 login = driver.findElement(By.xpath(configProp.getProperty("login")));
+		 
+		 pwd = driver.findElement(By.xpath(configProp.getProperty("pwd")));
+		 loginButton = driver.findElement(By.id(configProp.getProperty("loginButton")));
+		}
+		
+		
+		/**
+		 * Empty username password.
+		 */
+		@Test(priority=1)
+		public void emptyUsernamePassword()
+		{
+		
+			
+		//User Name and Password field is empty
+		log.info("-----VID-11 TC-8----Username and password empty");
+		loginButton.click();
+		errormessage=driver.findElement(By.xpath("//*[@id='errorInfo']/span"));
+		String errmsg= errormessage.getText();
+		//System.out.println("Error message is"+errmsg);
+		//String expected = "Invaild username or password, Please try again";
+		
+		//Assert.assertEquals(errmsg,expected);
+
+		Boolean str = driver.getPageSource().contains("Invalid username or password, Please try again");
+		System.out.println(driver.getPageSource().contains("Invalid username or password, Please try again"));
+		
+		if(str==true)
+		{
+			log.info("Error message validated");
+			log.info("VID-11 TC-8 PASSED");
+			
+		}else
+			log.error("Failed validation");
+		
+		}
+
+
+		
+		/**
+		 * Invalid user name.
+		 */
+		@Test(priority=2)
+		public void invalidUserName()
+		{
+		
+		log.info("-----VID-11 TC-6----Invalid Username and Valid Password");
+		
+		
+		login.sendKeys("xxx");
+		pwd.sendKeys("abc123");
+		loginButton.click();
+		try {
+			Thread.sleep(5000);
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		String errmsg= errormessage.getText();
+		String expected = "Invalid username or password, Please try again";
+		Assert.assertEquals(errmsg,expected);
+		//Boolean str1 = driver.getPageSource().contains("Invalid username or password, Please try again");
+		//System.out.print(str1);
+		
+		log.info("VID-11 TC-6 PASSED");
+				
+		}
+		
+		
+		/**
+		 * Invalid password.
+		 */
+		@Test(priority=3)
+		public void invalidPassword()
+		{
+		log.info("-----VID-11 TC-7----Valid Username and Invalid Password");
+		//  Valid user name and Invalid password.
+				login.clear();
+				pwd.clear();
+				login.sendKeys("testuser");
+				pwd.sendKeys("xxx");
+				loginButton.click();
+				driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+		
+				
+				String errmsg= errormessage.getText();
+				String expected = "Invalid username or password, Please try again";
+				Assert.assertEquals(errmsg,expected);
+				
+				//Boolean str2 = driver.getPageSource().contains("Invaild username or password, Please try again");
+				//System.out.print(str2);
+				
+				log.info("VID-11 TC-7 PASSED");
+		}
+		
+			
+		/**
+		 * Login successful.
+		 */
+		@Test(priority=4)
+		public void loginSuccessful()
+		{
+		log.info("-----VID-11 TC-1----Valid Username and Valid Password");
+		//Login with valid user name and password.
+		login.clear();
+		login.sendKeys("su");
+		pwd.clear();
+		pwd.sendKeys("fusion");
+		
+				
+		loginButton.click();
+		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+		
+		try {
+			Thread.sleep(6000);
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		Assert.assertTrue(driver.getPageSource().contains("Search Existing Service Instances"));
+		log.info("VID-11 TC-1 PASSED");
+		
+		}
+		
+		
+		/**
+		 * Verify home page elements left pane.
+		 */
+		@Test(priority=5)
+		public void verifyHomePageElementsLeftPane()
+		
+		{
+			
+			
+			log.info("VID-10 TC 1 ");
+			//VID Home
+			log.info("VID 11 TC-2");
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[1]/a/span")).isDisplayed();
+			//Create New Service Instance
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[2]/a/span")).isDisplayed();
+			
+			//Browse Service Type
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[3]/a/span")).isDisplayed();
+			//View Log		
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[4]/a/span")).isDisplayed();
+			
+			//Profile
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[5]/a/span")).isDisplayed();
+			//Admin
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[6]/a/span")).isDisplayed();
+			//Logout
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[7]/a/span")).isDisplayed();
+			
+			//Infrastructure Subscriber Name
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[1]/div/label")).isDisplayed();
+			//Infrastructure Subscriber Name Select Drop down
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select")).isDisplayed();
+			//Infrastructure Service Type
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[1]/div/label")).isDisplayed();
+			//Infrastructure Service Type Select Drop down
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select")).isDisplayed();
+			//Submit button 
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[3]/td/div/button")).isDisplayed();
+			
+			//Login Snippet Icon
+			driver.findElement(By.xpath(".//*[@class='icon-user-small login-snippet-icon']")).isDisplayed();
+			
+			
+			//String bodyText = driver.findElement(By.tagName("body")).getText();
+			//Assert.assertTrue("Text not found!", bodyText.contains("Search Existing Service Instances"));
+			//Assert.IsTrue(driver.getPageSource.Contains("Search Existing Service Instances"));
+			 
+			log.info("VID-12 TC-1");
+			Assert.assertTrue(driver.getPageSource().contains("Search Existing Service Instances"));
+			Assert.assertTrue(driver.getPageSource().contains("Please search by the Subscriber name or Service Type from below:"));
+			log.info("VID-12 TC-1 PASSED");
+			log.info("VID-10 TC 1 PASSED");
+			log.info("VID-11 TC-2 PASSED");
+		}
+		
+		
+		/**
+		 * Disabled submit button.
+		 */
+		@Test(priority=6)
+		public void disabledSubmitButton()
+		{
+			log.info("VID-12 TC-13");
+			//Assert submit button disabled.
+			Assert.assertFalse(driver.findElement(By.xpath(configProp.getProperty("submitButton"))).isEnabled());
+			log.info("VID-12 TC-13 PASSED");
+
+		} 
+		
+		/**
+		 * Default list box value.
+		 */
+		@Test(priority=7)
+		public void defaultListBoxValue()
+		{
+			log.info("VID-12 TC-2");
+			
+			
+			//WebElement subscribername =driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select"));
+			
+			Select oSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown"))));
+			Select iSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("serviceTypeDropDown"))));
+			
+			
+			WebElement ielement=iSelect.getFirstSelectedOption();
+			WebElement oelement=oSelect.getFirstSelectedOption();
+			String defaultsubscribername=oelement.getText();
+			String defaultservicetype=ielement.getText();
+			
+			Assert.assertEquals(defaultsubscribername,"Select Subscriber Name");
+			Assert.assertEquals(defaultservicetype,"Select Service Type");
+			
+		
+			
+			
+		//Verify Select Subscriber Name isDisplayed.
+		//driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select/option[1]")).isSelected();
+				
+		//Verify Select Service Type isDisplayed.	
+		//driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select/option[1]")).isSelected();
+			
+			
+			log.info("VID-12 TC-2 PASSED");
+
+		}
+
+
+		
+		/**
+		 * Select subscriber name drop down.
+		 *
+		 * @throws InterruptedException the interrupted exception
+		 */
+		@Test(priority=8)
+		public void selectSubscriberNameDropDown() throws InterruptedException
+		{
+			log.info("------------------VID-10 TC-2,VID-12 TC-11, VID-12 TC-9, VID 12 TC-10,VID-12 TC-6, VID 12 TC-5--------------------");
+			
+			
+			driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown")));
+			
+			driver.findElement(By.xpath(configProp.getProperty("serviceTypeDropDown")));
+			Thread.sleep(5000);
+			
+			//Infrastructure Subscriber Name
+			Select oSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown"))));
+			
+			List <WebElement> elementCount = oSelect.getOptions();
+			log.info("Select Element Count of Service Name");
+			System.out.println(elementCount.size());
+			
+			
+			//Verifying getInfrastructureSubscribersList
+			log.info("VID-29 TC-1");
+			Assert.assertTrue(elementCount.size()>0);
+			log.info("VID-29 TC-1 PASSED");
+			
+			oSelect.selectByIndex(2);
+			String selectedOption = new Select(driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown")))).getFirstSelectedOption().getText();
+
+			System.out.println("Service Name selected is " +selectedOption);
+			log.info("VID-10 TC-2 PASSED");
+					
+			//Submit button is clicked
+			driver.findElement(By.xpath(configProp.getProperty("submitButton"))).click();
+			
+			
+			//Verify whether the page header is displayed "Selected Subscriber's Service Instance Details:"
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/h1")).isDisplayed();
+			//Assert.assertTrue(driver.getPageSource().contains("Selected Subscriber's Service Instance Details:"))
+			
+			
+			//Verify whether the page header is displayed "Global Customer ID"
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/div/table/thead/tr/th[2]/div")).isDisplayed();
+			Assert.assertTrue(driver.getPageSource().contains("Global Customer ID"));
+			Assert.assertTrue(driver.getPageSource().contains("Subscriber Name"));
+			Assert.assertTrue(driver.getPageSource().contains("Service Type"));
+			Assert.assertTrue(driver.getPageSource().contains("Service Instance ID"));
+			
+			log.info("VID-12 TC-5 PASSED");
+			log.info("VID-12 TC-11 PASSED");
+			
+			WebElement serviceinstancetable =driver.findElement(By.xpath("//table[@class='tablesorter tablesorter-default ng-isolate-scope']"));
+			
+			List<WebElement> rows_table = serviceinstancetable.findElements(By.tagName("tr"));
+			  //To calculate no of rows In table.
+			  int rows_count = rows_table.size();
+			  
+			  //Loop will execute till the last row of table.
+			  for (int row=0; row<rows_count; row++){
+			   //To locate columns(cells) of that specific row.
+			   List<WebElement> Columns_row = rows_table.get(row).findElements(By.tagName("td"));
+			   //To calculate no of columns(cells) In that specific row.
+			   int columns_count = Columns_row.size();
+			   //System.out.println("Number of cells In Row "+row+" are "+columns_count);
+			   
+			   //Loop will execute till the last cell of that specific row.
+			   for (int column=0; column<columns_count; column++){
+			    //To retrieve text from that specific cell.
+			    String celtext = Columns_row.get(column).getText();
+			    //System.out.println("Cell Value Of row number "+row+" and column number "+column+" Is "+celtext);
+			   
+			    
+			    
+			    //log.info("Testing Get column and row value");
+			    List <WebElement> exx= rows_table.get(1).findElements(By.tagName("td"));
+			     eg=Columns_row.get(2).getText();
+			   // System.out.println("Cell value of row 1 and column 2 is" +eg);
+			   }
+			  }
+		
+			  
+			
+			
+			//Verify View/Edit isDisplayed and Click
+			
+			driver.findElement(By.xpath("//a[@alt='View/Edit']")).isDisplayed();
+			
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/div/table/tbody/tr[1]/td[1]/div/a")).click();
+			
+			log.info("User clicked View/Edit");
+			
+			//Verify the Subscriber Name displayed.	
+			String header= driver.findElement(By.xpath("//h1[@class='heading1 ng-binding']")).getText();
+			//System.out.println(header);
+			
+			
+			if(header.contains(eg))
+			{
+				System.out.println("Header contains the subscriber name");
+			}else
+				System.out.println("Header does not contain the subscriber name");
+			
+			
+			
+			Assert.assertTrue(driver.getPageSource().contains("PerfTest Subscriber00020021"));
+			log.info("VID-12 TC-6 PASSED");
+			
+			
+				
+			driver.navigate().back();
+			//Cancel button isDisplayed
+			driver.findElement(By.xpath("//button[@class='button button--small button--primary']")).isDisplayed();
+			log.info("VID-12 TC-9 PASSED");
+			
+			//Cancel button is clicked
+			driver.findElement(By.xpath("//button[@class='button button--small button--primary']")).click();
+			log.info("Cancel button is clicked");
+			
+			//Verifying VID Home page is displayed
+			Assert.assertTrue(driver.getPageSource().contains("Search Existing Service Instances"));
+			log.info("VID-12 TC-10 PASSED");
+			
+			   }
+		
+		
+		/**
+		 * Refresh subscriber name.
+		 */
+		@Test(priority=9)
+		public void refreshSubscriberName()
+		{
+			log.info("VID-10 TC-4");
+			
+			
+			driver.findElement(By.xpath(configProp.getProperty("refreshButtonSubscriberName"))).isDisplayed();
+			
+			log.info("VID-10 TC-4 PASSED");
+			
+			
+		}
+
+		
+		/**
+		 * Select subscriber type drop down.
+		 *
+		 * @throws InterruptedException the interrupted exception
+		 */
+		@Test(priority=9)
+		public void selectSubscriberTypeDropDown() throws InterruptedException
+		{
+			Thread.sleep(5000);
+			log.info("------------------VID-10 TC-3, VID-12 TC-12,--------------------");
+			//Infrastructure Subscriber Type
+			Select iSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("serviceTypeDropDown"))));
+			
+			List <WebElement> ielementCount = iSelect.getOptions();
+			log.info("Select Element Count of Service type");
+			System.out.println(ielementCount.size());
+			iSelect.selectByIndex(1);
+			
+			log.info("VID-10 TC-3 PASSED");
+			
+						
+			//Submit button is clicked
+			driver.findElement(By.xpath(configProp.getProperty("submitButton"))).click();
+			
+			//Verify whether the page header is displayed "Selected Subscriber's Service Instance Details:"
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/h1")).isDisplayed();
+			//Assert.assertTrue(driver.getPageSource().contains("Selected Subscriber's Service Instance Details:"))
+			log.info("Page Header: Selected Subscriber's Service Instance Details");
+			
+			
+			//Verify whether the page header is displayed "Global Customer ID"
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/div/table/thead/tr/th[2]/div")).isDisplayed();
+			
+			//Assert.assertTrue(driver.getPageSource().contains("Global Customer ID"));
+			log.info("Table is displayed");
+			
+			log.info("VID-12 TC-12 PASSED");
+			
+		}
+		
+		
+		
+		/**
+		 * Logout under profile.
+		 */
+		@Test(priority=10)
+		public void logoutUnderProfile()
+		{
+			
+			log.info("-----------VID-11 TC-5---------------------");
+			//driver.findElement(By.partialLinkText("Click here to login")).click();
+			//driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+			
+		
+			driver.findElement(By.xpath(".//*[@class='icon-user-small login-snippet-icon']")).click();			
+			driver.findElement(By.xpath(".//*[@id='reg-logout-div']/a")).click();
+			//Validate that the user has logged out of VID. Displays "Portal"
+			Assert.assertTrue(driver.getPageSource().contains("Portal"));
+			
+			log.info("VID-11 TC-5 PASSED");
+			
+		}
+
+		
+		
+		/**
+		 * Tear down.
+		 */
+		@AfterClass
+		public void tearDown()
+		{
+			driver.close();
+		
+		}
+		
+		
+		
+	}
+
+
+	
+
diff --git a/onap-enabler-be/src/test/java/org/onap/ecomp/vid/selenium/LogOutLeftPane.java b/onap-enabler-be/src/test/java/org/onap/ecomp/vid/selenium/LogOutLeftPane.java
new file mode 100644
index 0000000..1511c2d
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/ecomp/vid/selenium/LogOutLeftPane.java
@@ -0,0 +1,240 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.ecomp.vid.selenium;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.log4j.Logger;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.support.ui.Select;
+import org.testng.Assert;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+@Test(enabled=false)
+public class LogOutLeftPane {
+
+	WebElement loginButton;
+	
+	/** The login. */
+	WebElement login;
+	
+	/** The pwd. */
+	WebElement pwd;
+	
+	/** The log. */
+	Logger log;
+	
+	/** The errormessage. */
+	WebElement errormessage;
+	
+	/** The driver. */
+	WebDriver driver=new FirefoxDriver();
+	
+	
+	/** The config prop. */
+	private final Properties configProp = new Properties();
+	
+	
+	/**
+	 * Instantiates a new log out left pane.
+	 */
+	private  LogOutLeftPane() {
+		// TODO Auto-generated constructor stub
+		//
+		try{
+		//	InputStream input =this.getClass().getClassLoader().getResourceAsStream("objectmap.properties");
+		//FileInputStream input1 = new FileInputStream("objectmap.properties");
+			
+		InputStream input =new FileInputStream("objectconfig.properties");
+		System.out.println("Read all properties from file");
+		configProp.load(input);
+		System.out.println("Read all properties from file completed");
+		}
+		catch(IOException e) {
+			
+			e.printStackTrace();
+		}
+	}
+	
+	
+	   
+	   
+	/**
+	 * Do before test.
+	 */
+	// TODO Auto-generated method stub
+	@BeforeTest
+	public void doBeforeTest()
+	{
+		//WebDriver driver=new FirefoxDriver();
+		
+		log = Logger.getLogger(LogOutLeftPane.class.getName());
+	
+	
+	
+	// Get url
+	driver.get("http://vid.onap.org:9080/vid/login_external.htm");
+	driver.manage().window().maximize();
+	
+	
+	 login = driver.findElement(By.xpath("//input[@class='fn-ebz-text ng-pristine ng-valid']"));
+	 pwd = driver.findElement(By.xpath("//input[@class='span3 ng-pristine ng-valid']"));
+	 loginButton = driver.findElement(By.id("loginBtn"));
+	}
+	
+	
+	/**
+	 * Expand collapse panel.
+	 *
+	 * @throws InterruptedException the interrupted exception
+	 */
+	@Test(priority=1)
+	public void expandCollapsePanel() throws InterruptedException
+	{
+
+		
+		
+		login.clear();
+		login.sendKeys("su");
+		pwd.clear();
+		pwd.sendKeys("fusion");
+		//driver.findElement(By.partialLinkText("Click here to login")).click();
+		//driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+		
+		loginButton.click();
+		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+		
+		
+		log.info("Clicking Profile link from left pane");
+		Thread.sleep(3000);
+		System.out.println("properties file details --->"+configProp.getProperty("profilelink"));
+		driver.findElement(By.xpath(configProp.getProperty("profilelink"))).click();
+		Thread.sleep(3000);
+		
+		//Verify whether the sub panel is displayed
+		//To verify the following :Search import from webphone and Self 
+		driver.findElement(By.xpath(".//*[@id='panel4']")).isDisplayed();
+		log.info("Expand and collapse passed for Profile link");
+		
+		//For Admin
+		//Verify expand and collapse working for ADMIN
+		log.info("Clicking Admin link from left pane");
+		driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[6]/a/span")).click();
+		//To verify the following: Roles, Roles Functions, Usages
+		driver.findElement(By.xpath(".//*[@id='panel5']")).isDisplayed();
+		
+	
+		log.info("Expand and collapse passed for ADMIN link");
+
+		log.info("VID-11 TC-3 PASSED");
+		
+	}
+	
+	
+	/**
+	 * Drop down list.
+	 *
+	 * @throws InterruptedException the interrupted exception
+	 */
+	@Test(priority=2)
+	public void dropDownList() throws InterruptedException
+	{
+		//VID-12 TC-3
+		log.info("VID-12 TC-3");
+		//driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select"));
+		
+		//driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select"));
+		Thread.sleep(5000);
+		
+		//Infrastructure Subscriber Name
+		Select oSelect = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select")));
+		Select iSelect = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select")));
+		
+		List <WebElement> elementCount = oSelect.getOptions();
+		log.info("Subscriber Name Drop Down");
+		System.out.println(elementCount.size());
+		oSelect.selectByIndex(1);
+		log.info("Subscriber name selected");
+		//String selectedOption = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select"))).getFirstSelectedOption().getText();
+		
+		
+		List <WebElement> count = iSelect.getOptions();
+		log.info("Subscriber type drop down");
+		System.out.println(count.size());
+		oSelect.selectByIndex(1);
+		log.info("Subscriber type selected");
+		
+
+				
+		//Submit button is clicked
+		driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[3]/td/div/button")).click();
+		
+		
+		//Verify whether the page header is displayed "Selected Subscriber's Service Instance Details:"
+		driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/h1")).isDisplayed();
+		log.info("VID-12 TC-3 PASSED");
+	}
+	
+	
+	
+	
+	/**
+	 * Logout left pane.
+	 */
+	@Test(priority=3)
+	public void logoutLeftPane()
+	{
+		//To Verify if the logout link redirects to Login page when clicked.
+		
+		
+		/*log.info("----------------VID-11 TC-4----------------");
+		login.clear();
+		login.sendKeys("testuser");
+		pwd.clear();
+		pwd.sendKeys("abc123");
+		//driver.findElement(By.partialLinkText("Click here to login")).click();
+		//driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+		
+		loginButton.click();
+		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);*/
+		log.info("----------------VID-11 TC-4----------------");
+		driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[7]/a")).click();
+		//Validate that the user has logged out of VID. Displays "Portal"
+		Assert.assertTrue(driver.getPageSource().contains("Portal"));
+		
+		log.info("VID 11 TC-4 PASSED");
+		
+		driver.close();
+		
+	}
+	
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/fusion/core/MockApplicationContextTestSuite.java b/onap-enabler-be/src/test/java/org/onap/fusion/core/MockApplicationContextTestSuite.java
new file mode 100644
index 0000000..09a0b43
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/fusion/core/MockApplicationContextTestSuite.java
@@ -0,0 +1,166 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.fusion.core;
+
+import java.io.IOException;
+
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.AnnotationConfigWebContextLoader;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.testng.annotations.Test;
+import org.onap.portalsdk.core.conf.AppConfig;
+import org.onap.portalsdk.core.objectcache.AbstractCacheManager;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.portalsdk.core.util.CacheManager;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class, classes = {MockAppConfig.class})
+@ActiveProfiles(value="test")
+@Test(enabled=false)
+public class MockApplicationContextTestSuite {
+		
+    	@Autowired
+	    public WebApplicationContext wac;
+
+	    /** The mock mvc. */
+    	private MockMvc mockMvc;
+
+	    /**
+    	 * Setup.
+    	 */
+    	@Before
+	    public void setup() {
+	    	if(mockMvc == null) {
+	    		this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
+	    		
+	    	}
+	    }
+	    
+	    /**
+    	 * Gets the bean.
+    	 *
+    	 * @param name the name
+    	 * @return the bean
+    	 */
+    	public Object getBean(String name) {
+			return this.wac.getBean(name);
+		}
+
+
+		/**
+		 * Gets the mock mvc.
+		 *
+		 * @return the mock mvc
+		 */
+		public MockMvc getMockMvc() {
+			return mockMvc;
+		}
+
+		/**
+		 * Sets the mock mvc.
+		 *
+		 * @param mockMvc the new mock mvc
+		 */
+		public void setMockMvc(MockMvc mockMvc) {
+			this.mockMvc = mockMvc;
+		}
+		
+		/**
+		 * Gets the web application context.
+		 *
+		 * @return the web application context
+		 */
+		public WebApplicationContext getWebApplicationContext() {
+			return wac;
+		}
+		
+		
+		
+		
+}
+		
+
+		@Configuration
+		@ComponentScan(basePackages = "org.onap", 
+				 excludeFilters = {
+								 	// the following source configurations should not be scanned; instead of using Exclusion filter, we can use the @Profile annotation to exclude them
+									// see AppConfig class
+									//@ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.onap.portalsdk.core.*AppConfig*")//,
+								 	//@ComponentScan.Filter(type = FilterType.REGEX, pattern = org.onap.*.*AppConfig*")
+								  }
+		    	)
+		@Profile("test")
+		class MockAppConfig extends AppConfig {
+			
+			@Bean 
+		    public SystemProperties systemProperties(){
+		    	return new MockSystemProperties();
+		    }
+			
+			@Bean
+		    public AbstractCacheManager cacheManager() {
+		        return new CacheManager() {
+		        	
+		        	public void configure() throws IOException {
+		        		 
+		        	}
+		        };
+		    }
+			
+			protected String[] tileDefinitions() {
+				return new String[] {"classpath:/WEB-INF/fusion/defs/definitions.xml", "classpath:/WEB-INF/defs/definitions.xml"};
+			}
+			
+			 @Override
+			public void addInterceptors(InterceptorRegistry registry) {
+			    //registry.addInterceptor(new SessionTimeoutInterceptor()).excludePathPatterns(getExcludeUrlPathsForSessionTimeout());
+			    //registry.addInterceptor(resourceInterceptor());
+			}
+			 
+			 public static class MockSystemProperties extends SystemProperties {
+					
+					public MockSystemProperties() {
+					}
+					
+				}
+					
+		}
+		
+		
+
+
diff --git a/onap-enabler-be/src/test/java/org/onap/fusionapp/controller/NetMapTest.java b/onap-enabler-be/src/test/java/org/onap/fusionapp/controller/NetMapTest.java
new file mode 100644
index 0000000..98a715f
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/fusionapp/controller/NetMapTest.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.fusionapp.controller;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.test.web.servlet.ResultActions;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+import org.onap.fusion.core.MockApplicationContextTestSuite;
+
+
+public class NetMapTest extends MockApplicationContextTestSuite {
+	
+//	@Test
+	public void testGetNetMap() throws Exception {
+		ResultActions ra =getMockMvc().perform(MockMvcRequestBuilders.get("/net_map"));
+		//Assert.assertEquals(UrlAccessRestrictedException.class,ra.andReturn().getResolvedException().getClass());
+		Assert.assertEquals("net_map_int",ra.andReturn().getModelAndView().getModel().get("frame_int"));
+	}
+	
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/fusionapp/service/ProfileServiceTest.java b/onap-enabler-be/src/test/java/org/onap/fusionapp/service/ProfileServiceTest.java
new file mode 100644
index 0000000..c88348f
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/fusionapp/service/ProfileServiceTest.java
@@ -0,0 +1,73 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.fusionapp.service;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.onap.fusion.core.MockApplicationContextTestSuite;
+import org.onap.portalsdk.core.domain.Profile;
+import org.onap.portalsdk.core.domain.User;
+import org.onap.portalsdk.core.service.ProfileService;
+import org.onap.portalsdk.core.service.UserProfileService;
+
+
+
+public class ProfileServiceTest extends MockApplicationContextTestSuite {
+	
+	@Autowired
+	ProfileService service;
+	
+	/** The user profile service. */
+	@Autowired
+	UserProfileService userProfileService;
+	
+	/**
+	 * Test find all.
+	 */
+	//@Test
+	public void testFindAll() {
+		try {
+		List<Profile> profiles = service.findAll();
+		Assert.assertTrue(profiles.size() > 0);
+
+		}
+		catch (Exception e) {
+			// TODO: handle exception
+		}
+	}
+
+	/**
+	 * Test find all active.
+	 */
+//	@Test
+	public void testFindAllActive() {
+				
+		List<User> users = userProfileService.findAllActive();
+		List<User> activeUsers = userProfileService.findAllActive();
+		Assert.assertTrue(users.size() - activeUsers.size() >= 0);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/RelatedToTest.java b/onap-enabler-be/src/test/java/org/onap/osam/RelatedToTest.java
new file mode 100644
index 0000000..d205abb
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/RelatedToTest.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam;
+
+import java.util.Map;
+
+import org.junit.Test;
+
+
+public class RelatedToTest {
+
+	private RelatedTo createTestSubject() {
+		return new RelatedTo();
+	}
+
+
+	@Test
+	public void testGetAdditionalProperties() throws Exception {
+		RelatedTo testSubject;
+		Map<String, Object> result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getAdditionalProperties();
+	}
+
+
+	@Test
+	public void testSetAdditionalProperty() throws Exception {
+		RelatedTo testSubject;
+		String name = "";
+		Object value = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setAdditionalProperty(name, value);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/AaiClientTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/AaiClientTest.java
new file mode 100644
index 0000000..0a3536a
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/AaiClientTest.java
@@ -0,0 +1,469 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableList;
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.mockito.Mockito;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.osam.aai.model.AaiGetTenatns.GetTenantsResponse;
+import org.onap.osam.aai.model.AaiNodeQueryResponse;
+import org.onap.osam.aai.model.ResourceType;
+import org.onap.osam.aai.util.AAIRestInterface;
+import org.onap.osam.aai.util.HttpsAuthClient;
+import org.onap.osam.aai.util.ServletRequestHelper;
+import org.onap.osam.aai.util.SystemPropertyHelper;
+import org.onap.osam.controllers.LocalWebConfig;
+import org.onap.osam.exceptions.GenericUncheckedException;
+import org.onap.osam.model.Subscriber;
+import org.onap.osam.model.SubscriberList;
+import org.onap.osam.model.probes.ExternalComponentStatus;
+import org.onap.osam.model.probes.HttpRequestMetadata;
+import org.onap.osam.model.probes.StatusMetadata;
+import org.onap.osam.testUtils.TestUtils;
+import org.springframework.http.HttpMethod;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import sun.security.provider.certpath.SunCertPathBuilderException;
+import sun.security.validator.ValidatorException;
+
+import javax.crypto.BadPaddingException;
+import javax.net.ssl.SSLHandshakeException;
+import javax.servlet.ServletContext;
+import javax.ws.rs.ProcessingException;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.core.Response;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.security.cert.CertificateException;
+import java.util.ArrayList;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalToIgnoringCase;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.*;
+
+@ContextConfiguration(classes = {LocalWebConfig.class, SystemProperties.class})
+@WebAppConfiguration
+public class AaiClientTest {
+
+    private AaiClient aaiClientMock;
+    private ServletContext servletContext;
+
+    @BeforeMethod
+    public void initMocks(){
+        aaiClientMock = mock(AaiClient.class);
+        aaiClientMock.logger = mock(EELFLoggerDelegate.class);
+        servletContext = mock(ServletContext.class);
+
+        when(servletContext.getRealPath(any(String.class))).thenReturn("");
+
+        when(aaiClientMock.doAaiGet(any(String.class),any(Boolean.class))).thenReturn(null);
+    }
+
+    @DataProvider
+    public static Object[][] logicalLinkData() {
+        return new Object[][] {
+                {"", "network/logical-links/logical-link/"},
+                {"link", "network/logical-links/logical-link/link"}
+        };
+    }
+
+    @Test(dataProvider = "logicalLinkData")
+    public void getLogicalLink_Link_Is_Empty(String link, String expectedUrl) {
+
+        when(aaiClientMock.getLogicalLink(any(String.class))).thenCallRealMethod();
+        aaiClientMock.getLogicalLink(link);
+        Mockito.verify(aaiClientMock).doAaiGet(argThat(equalToIgnoringCase(expectedUrl)),any(Boolean.class));
+    }
+
+    @DataProvider
+    public static Object[][] subscribersResults() {
+        return new Object[][] {
+                {new SubscriberList(new ArrayList<Subscriber>() {{ add(new Subscriber());  add(new Subscriber()); }}), true},
+                {new SubscriberList(new ArrayList<Subscriber>() {{ add(new Subscriber()); }}), true},
+                {new SubscriberList(new ArrayList<Subscriber>()), false}
+        };
+    }
+
+    @Test(dataProvider = "subscribersResults")
+    public void testProbeAaiGetAllSubscribers_returnsTwoToZeroSubscribers_ResultsAsExpected(SubscriberList subscribers, boolean isAvailable){
+        ExternalComponentStatus expectedStatus = new ExternalComponentStatus(ExternalComponentStatus.Component.AAI,isAvailable, new HttpRequestMetadata(
+                HttpMethod.GET,
+                200,
+                "url",
+                "rawData",
+                isAvailable ? "OK" : "No subscriber received",
+                0
+        ));
+        Mockito.when(aaiClientMock.getAllSubscribers(true)).thenReturn(
+                new AaiResponseWithRequestInfo<>(
+                        HttpMethod.GET, "url", new AaiResponse<>(subscribers, null, 200),
+                        "rawData"));
+        Mockito.when(aaiClientMock.probeAaiGetAllSubscribers()).thenCallRealMethod();
+        ExternalComponentStatus result  = aaiClientMock.probeAaiGetAllSubscribers();
+        assertThat(statusDataReflected(result),is(statusDataReflected(expectedStatus)));
+        assertThat(requestMetadataReflected(result.getMetadata()),is(requestMetadataReflected(expectedStatus.getMetadata())));
+    }
+
+    //serialize fields except of fields we cannot know ahead of time
+    private static String requestMetadataReflected(StatusMetadata metadata) {
+        return new ReflectionToStringBuilder(metadata, ToStringStyle.SHORT_PREFIX_STYLE)
+                .setExcludeFieldNames("duration")
+                .toString();
+    }
+
+    private static String statusDataReflected(ExternalComponentStatus status) {
+        return new ReflectionToStringBuilder(status, ToStringStyle.SHORT_PREFIX_STYLE)
+                .setExcludeFieldNames("metadata")
+                .toString();
+    }
+
+    @DataProvider
+    public static Object[][] rawData() {
+        return new Object[][]{
+                {"errorMessage", }, {""}, {null}
+        };
+    }
+
+    @Test(dataProvider = "rawData")
+    public void testProbeAaiGetFullSubscribersWithNullResponse_returnsNotAvailableWithErrorRawData(String rawData){
+        Mockito.when(aaiClientMock.getAllSubscribers(true)).thenReturn(
+                new AaiResponseWithRequestInfo<>(HttpMethod.GET, "url", null,
+                        rawData));
+        ExternalComponentStatus result = callProbeAaiGetAllSubscribersAndAssertNotAvailable();
+        assertThat(result.getMetadata(), instanceOf(HttpRequestMetadata.class));
+        assertEquals(((HttpRequestMetadata) result.getMetadata()).getRawData(), rawData);
+    }
+
+    @DataProvider
+    public static Object[][] exceptions() {
+        return new Object[][] {
+                {"NullPointerException", "errorMessage",
+                        new ExceptionWithRequestInfo(HttpMethod.GET, "url",
+                                "errorMessage", null, new NullPointerException())},
+                {"RuntimeException", null,
+                        new ExceptionWithRequestInfo(HttpMethod.GET, "url",
+                                null, null, new RuntimeException())},
+                {"RuntimeException", null,
+                        new RuntimeException()},
+        };
+    }
+
+    @Test(dataProvider = "exceptions")
+    public void testProbeAaiGetFullSubscribersWithNullResponse_returnsNotAvailableWithErrorRawData(String description, String expectedRawData, Exception exception){
+        Mockito.when(aaiClientMock.getAllSubscribers(true)).thenThrow(exception);
+        ExternalComponentStatus result = callProbeAaiGetAllSubscribersAndAssertNotAvailable();
+        if (exception instanceof ExceptionWithRequestInfo) {
+            assertThat(result.getMetadata(), instanceOf(HttpRequestMetadata.class));
+            assertEquals(((HttpRequestMetadata) result.getMetadata()).getRawData(), expectedRawData);
+        }
+        assertThat(result.getMetadata().getDescription(), containsString(description));
+    }
+
+    private ExternalComponentStatus callProbeAaiGetAllSubscribersAndAssertNotAvailable() {
+        Mockito.when(aaiClientMock.probeAaiGetAllSubscribers()).thenCallRealMethod();
+        ExternalComponentStatus result  = aaiClientMock.probeAaiGetAllSubscribers();
+        assertFalse(result.isAvailable());
+        return result;
+    }
+
+
+    @Test
+    public void getTenants_Arguments_Are_Null_Or_Empty() {
+
+        when(aaiClientMock.getTenants(any(String.class), any(String.class))).thenCallRealMethod();
+
+        AaiResponse response = aaiClientMock.getTenants("", "");
+
+        assertEquals(response.getErrorMessage(), "{\"statusText\":\" Failed to retrieve LCP Region & Tenants from A&AI, Subscriber ID or Service Type is missing.\"}");
+
+
+        response = aaiClientMock.getTenants(null, null);
+
+        assertEquals(response.getErrorMessage(), "{\"statusText\":\" Failed to retrieve LCP Region & Tenants from A&AI, Subscriber ID or Service Type is missing.\"}");
+    }
+
+    @Test
+    public void getTenants_Arguments_Are_Valid_But_Tenants_Not_Exist() {
+
+        when(aaiClientMock.getTenants(any(String.class), any(String.class))).thenCallRealMethod();
+
+        Response generalEmptyResponse = mock(Response.class);
+        when(aaiClientMock.doAaiGet(any(String.class),any(Boolean.class))).thenReturn(generalEmptyResponse);
+
+        AaiResponse response = aaiClientMock.getTenants("subscriberId", "serviceType");
+
+        assertEquals(response.getErrorMessage(), "{\"statusText\":\" A&AI has no LCP Region & Tenants associated to subscriber 'subscriberId' and service type 'serviceType'\"}");
+
+    }
+
+    @Test
+    public void getTenants_Arguments_Are_Valid_Get_The_Tenanats() {
+
+        when(aaiClientMock.getTenants(any(String.class), any(String.class))).thenCallRealMethod();
+
+
+        Response generalEmptyResponse = mock(Response.class);
+
+        when(generalEmptyResponse.readEntity(String.class)).thenReturn(tenantResponseRaw);
+        when(generalEmptyResponse.getStatus()).thenReturn(200);
+        when(generalEmptyResponse.getStatusInfo()).thenReturn(new Response.StatusType() {
+            @Override
+            public int getStatusCode() {
+                return 200;
+            }
+
+            @Override
+            public Response.Status.Family getFamily() {
+                return Response.Status.Family.SUCCESSFUL;
+            }
+
+            @Override
+            public String getReasonPhrase() {
+                return null;
+            }
+        });
+
+
+        when(aaiClientMock.doAaiGet(any(String.class),any(Boolean.class))).thenReturn(generalEmptyResponse);
+
+        AaiResponse<GetTenantsResponse[]> response = aaiClientMock.getTenants("subscriberId", "serviceType");
+
+        Assert.assertTrue(response.t.length> 0);
+    }
+
+    final String tenantResponseRaw ="" +
+            "{" +
+            "\"service-type\": \"VIRTUAL USP\"," +
+            "\"resource-version\": \"1494001841964\"," +
+            "\"relationship-list\": {" +
+            "\"relationship\": [{" +
+            "\"related-to\": \"tenant\"," +
+            "\"related-link\": \"/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/att-aic/AAIAIC25/tenants/tenant/092eb9e8e4b7412e8787dd091bc58e86\"," +
+            "\"relationship-data\": [{" +
+            "\"relationship-key\": \"cloud-region.cloud-owner\"," +
+            "\"relationship-value\": \"att-aic\"" +
+            "}," +
+            "{" +
+            "\"relationship-key\": \"cloud-region.cloud-region-id\"," +
+            "\"relationship-value\": \"AAIAIC25\"" +
+            "}," +
+            "{" +
+            "\"relationship-key\": \"tenant.tenant-id\"," +
+            "\"relationship-value\": \"092eb9e8e4b7412e8787dd091bc58e86\"" +
+            "}" +
+            "]," +
+            "\"related-to-property\": [{" +
+            "\"property-key\": \"tenant.tenant-name\"," +
+            "\"property-value\": \"USP-SIP-IC-24335-T-01\"" +
+            "}]" +
+            "}]" +
+            "}" +
+            "}";
+
+    @DataProvider
+    public static Object[][] resourceTypesProvider() {
+        return new Object[][] {
+                {"service-instance", ResourceType.SERVICE_INSTANCE},
+                {"generic-vnf", ResourceType.GENERIC_VNF},
+                {"vf-module", ResourceType.VF_MODULE}
+        };
+    }
+
+    @Test(dataProvider = "resourceTypesProvider")
+    public void aaiNodeQueryResponseDeserializationTest(String resourceType, ResourceType expectedResourceType) throws IOException {
+        String link = "/aai/v12/business/customers/customer/a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb/service-subscriptions/service-subscription/Nimbus/service-instances/service-instance/7131d483-b450-406f-8e30-0c650645fc67";
+        String json =
+                "{\"result-data\": [{" +
+                    "\"resource-type\": \""+resourceType+"\"," +
+                    "\"resource-link\": \""+ link+ "\"" +
+                "}]}";
+
+        AaiNodeQueryResponse nodeQueryResponse = new ObjectMapper().readValue(json, AaiNodeQueryResponse.class);
+        assertThat(nodeQueryResponse.resultData.get(0).resourceLink, equalTo(link));
+        assertThat(nodeQueryResponse.resultData.get(0).resourceType, is(expectedResourceType));
+    }
+
+    @Test
+    public void aaiNodeQueryEmptyResponseDeserializationTest() throws IOException{
+        String json = "{}";
+        AaiNodeQueryResponse nodeQueryResponse = new ObjectMapper().readValue(json, AaiNodeQueryResponse.class);
+        assertNull(nodeQueryResponse.resultData);
+    }
+
+    @DataProvider
+    public static Object[][] nameAndResourceTypeProvider() {
+        return new Object[][] {
+                {"SRIOV_SVC", ResourceType.SERVICE_INSTANCE, "search/nodes-query?search-node-type=service-instance&filter=service-instance-name:EQUALS:SRIOV_SVC"},
+                {"b1707vidnf", ResourceType.GENERIC_VNF, "search/nodes-query?search-node-type=generic-vnf&filter=vnf-name:EQUALS:b1707vidnf"},
+                {"connectivity_test", ResourceType.VF_MODULE, "search/nodes-query?search-node-type=vf-module&filter=vf-module-name:EQUALS:connectivity_test"},
+                {"MjVg1234", ResourceType.VOLUME_GROUP, "search/nodes-query?search-node-type=volume-group&filter=volume-group-name:EQUALS:MjVg1234"}
+        };
+    }
+
+    @Test(dataProvider = "nameAndResourceTypeProvider")
+    public void whenSearchNodeTypeByName_callRightAaiPath(String name, ResourceType type, String expectedUrl) {
+        when(aaiClientMock.searchNodeTypeByName(any(String.class), any(ResourceType.class))).thenCallRealMethod();
+        aaiClientMock.searchNodeTypeByName(name, type);
+        Mockito.verify(aaiClientMock).doAaiGet(eq(expectedUrl), eq(false));
+    }
+
+    @DataProvider
+    public static Object[][] aaiClientInternalExceptions() {
+        return Stream.<Pair<Class<? extends Throwable>, UncheckedBiConsumer<HttpsAuthClient, Client>>>of(
+
+                // Exception out of httpsAuthClientMock
+                Pair.of(CertificateException.class, (httpsAuthClientMock, javaxClientMock) -> {
+                    final CertificateException e0 = new CertificateException("No X509TrustManager implementation available");
+                    SSLHandshakeException e = new SSLHandshakeException(e0.toString());
+                    e.initCause(e0);
+
+                    when(httpsAuthClientMock.getClient(any())).thenThrow(e);
+                }),
+
+                Pair.of(StringIndexOutOfBoundsException.class, mockExceptionOnClientProvider(new StringIndexOutOfBoundsException(4))),
+
+                Pair.of(NullPointerException.class, mockExceptionOnClientProvider(new NullPointerException("null"))),
+
+                Pair.of(FileNotFoundException.class, mockExceptionOnClientProvider(new FileNotFoundException("vid/WEB-INF/cert/aai-client-cert.p12"))),
+
+                Pair.of(BadPaddingException.class, mockExceptionOnClientProvider(
+                        new IOException("keystore password was incorrect", new BadPaddingException("Given final block not properly padded")))
+                ),
+                Pair.of(GenericUncheckedException.class, mockExceptionOnClientProvider(new GenericUncheckedException("basa"))),
+
+                Pair.of(NullPointerException.class, (httpsAuthClientMock, javaxClientMock) ->
+                        when(httpsAuthClientMock.getClient(any())).thenReturn(null)),
+
+
+                // Exception out of javax's Client
+                Pair.of(SSLHandshakeException.class, (httpsAuthClientMock, javaxClientMock) -> {
+                    when(javaxClientMock.target(anyString())).thenThrow(
+                            new ProcessingException(new SSLHandshakeException("Received fatal alert: certificate_expired"))
+                    );
+                }),
+
+                Pair.of(SunCertPathBuilderException.class, (httpsAuthClientMock, javaxClientMock) -> {
+                    SunCertPathBuilderException e0 = new SunCertPathBuilderException("unable to find valid certification path to requested target");
+                    when(javaxClientMock.target(anyString())).thenThrow(
+                            new ProcessingException(new ValidatorException("PKIX path building failed: " + e0.toString(), e0))
+                    );
+                }),
+
+                Pair.of(GenericUncheckedException.class, (httpsAuthClientMock, javaxClientMock) ->
+                        when(javaxClientMock.target(anyString())).thenThrow(new GenericUncheckedException("basa")))
+
+        ).flatMap(l -> Stream.of(
+                // double each case to propagateExceptions = true/false, to verify that "don't propagate" really still work
+                ImmutableList.of(l.getLeft(), l.getRight(), true).toArray(),
+                ImmutableList.of(l.getLeft(), l.getRight(), false).toArray()
+        )).collect(Collectors.toList()).toArray(new Object[][]{});
+    }
+
+    private static UncheckedBiConsumer<HttpsAuthClient, Client> mockExceptionOnClientProvider(Exception e) {
+        return (httpsAuthClientMock, javaxClientMock) ->
+                when(httpsAuthClientMock.getClient(any())).thenThrow(e);
+    }
+
+    @Test(dataProvider = "aaiClientInternalExceptions")
+    public void propagateExceptions_internalsThrowException_ExceptionRethrown(Class<? extends Throwable> expectedType, BiConsumer<HttpsAuthClient, Client> setupMocks, boolean propagateExceptions) throws Exception {
+
+        // prepare mocks
+        HttpsAuthClient httpsAuthClientMock = mock(HttpsAuthClient.class);
+        TestUtils.JavaxRsClientMocks mocks = new TestUtils.JavaxRsClientMocks();
+        Client javaxClientMock = mocks.getFakeClient();
+        Response responseMock = mocks.getFakeResponse();
+
+        // prepare real AAIRestInterface and AaiClient, and wire mocks
+        AAIRestInterface aaiRestInterface = new AAIRestInterface(httpsAuthClientMock, new ServletRequestHelper(), new SystemPropertyHelper());
+        final AaiClient aaiClient = new AaiClient(aaiRestInterface, null);
+        when(httpsAuthClientMock.getClient(any())).thenReturn(javaxClientMock);
+
+        // define atomic method under test, including reset of "aaiRestInterface.client"
+        final Function<Boolean, Response> doAaiGet = (propagateExceptions1) -> {
+            try {
+                FieldUtils.writeField(aaiRestInterface, "client", null, true);
+                return aaiClient.doAaiGet("uri", false, propagateExceptions1).getResponse();
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            }
+        };
+
+        // verify setup again
+        assertThat("mocks setup should make doAaiGet return our responseMock", doAaiGet.apply(true), is(sameInstance(responseMock)));
+
+
+        /// TEST:
+        setupMocks.accept(httpsAuthClientMock, javaxClientMock);
+
+        try {
+            final Response response = doAaiGet.apply(propagateExceptions);
+        } catch (Exception e) {
+            if (propagateExceptions) {
+                assertThat("root cause incorrect for " + ExceptionUtils.getStackTrace(e), ExceptionUtils.getRootCause(e), instanceOf(expectedType));
+                return; // ok, done
+            } else {
+                // Verify that "don't propagate" really still work
+                Assert.fail("calling doAaiGet when propagateExceptions is false must result with no exception", e);
+            }
+        }
+
+        // If no exception caught
+        // We're asserting that the legacy behaviour is still in place. Hopefully
+        // one day we will remove the non-propagateExceptions case
+        assertFalse(propagateExceptions, "calling doAaiGet when propagateExceptions is 'true' must result with an exception (in this test)");
+    }
+
+    @FunctionalInterface
+    public interface UncheckedBiConsumer<T, U> extends BiConsumer<T, U> {
+        @Override
+        default void accept(T t, U u) {
+            try {
+                acceptThrows(t, u);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        void acceptThrows(T t, U u) throws Exception;
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/AaiGetVnfResponseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/AaiGetVnfResponseTest.java
new file mode 100644
index 0000000..78509b5
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/AaiGetVnfResponseTest.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai;
+
+import java.util.Map;
+
+import org.junit.Test;
+
+public class AaiGetVnfResponseTest {
+
+	private AaiGetVnfResponse createTestSubject() {
+		return new AaiGetVnfResponse();
+	}
+
+	@Test
+	public void testGetAdditionalProperties() throws Exception {
+		AaiGetVnfResponse testSubject;
+		Map<String, Object> result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getAdditionalProperties();
+	}
+
+	@Test
+	public void testSetAdditionalProperty() throws Exception {
+		AaiGetVnfResponse testSubject;
+		String name = "";
+		Object value = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setAdditionalProperty(name, value);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/OperationalEnvironmentTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/OperationalEnvironmentTest.java
new file mode 100644
index 0000000..b358eb8
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/OperationalEnvironmentTest.java
@@ -0,0 +1,211 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai;
+
+import org.junit.Test;
+import org.onap.osam.aai.model.RelationshipList;
+
+public class OperationalEnvironmentTest {
+
+    private OperationalEnvironment createTestSubject() {
+        return new OperationalEnvironment();
+    }
+
+    @Test
+    public void testGetOperationalEnvironmentId() throws Exception {
+        OperationalEnvironment testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getOperationalEnvironmentId();
+    }
+
+    @Test
+    public void testSetOperationalEnvironmentId() throws Exception {
+        OperationalEnvironment testSubject;
+        String operationalEnvironmentId = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setOperationalEnvironmentId(operationalEnvironmentId);
+    }
+
+    @Test
+    public void testGetOperationalEnvironmentName() throws Exception {
+        OperationalEnvironment testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getOperationalEnvironmentName();
+    }
+
+    @Test
+    public void testSetOperationalEnvironmentName() throws Exception {
+        OperationalEnvironment testSubject;
+        String operationalEnvironmentName = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setOperationalEnvironmentName(operationalEnvironmentName);
+    }
+
+    @Test
+    public void testGetOperationalEnvironmentType() throws Exception {
+        OperationalEnvironment testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getOperationalEnvironmentType();
+    }
+
+    @Test
+    public void testSetOperationalEnvironmentType() throws Exception {
+        OperationalEnvironment testSubject;
+        String operationalEnvironmentType = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setOperationalEnvironmentType(operationalEnvironmentType);
+    }
+
+    @Test
+    public void testGetOperationalEnvironmentStatus() throws Exception {
+        OperationalEnvironment testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getOperationalEnvironmentStatus();
+    }
+
+    @Test
+    public void testSetOperationalEnvironmentStatus() throws Exception {
+        OperationalEnvironment testSubject;
+        String operationalEnvironmentStatus = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setOperationalEnvironmentStatus(operationalEnvironmentStatus);
+    }
+
+    @Test
+    public void testGetTenantContext() throws Exception {
+        OperationalEnvironment testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getTenantContext();
+    }
+
+    @Test
+    public void testSetTenantContext() throws Exception {
+        OperationalEnvironment testSubject;
+        String tenantContext = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setTenantContext(tenantContext);
+    }
+
+    @Test
+    public void testGetWorkloadContext() throws Exception {
+        OperationalEnvironment testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getWorkloadContext();
+    }
+
+    @Test
+    public void testSetWorkloadContext() throws Exception {
+        OperationalEnvironment testSubject;
+        String workloadContext = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setWorkloadContext(workloadContext);
+    }
+
+    @Test
+    public void testGetResourceVersion() throws Exception {
+        OperationalEnvironment testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getResourceVersion();
+    }
+
+    @Test
+    public void testSetResourceVersion() throws Exception {
+        OperationalEnvironment testSubject;
+        String resourceVersion = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setResourceVersion(resourceVersion);
+    }
+
+    @Test
+    public void testGetRelationshipList() throws Exception {
+        OperationalEnvironment testSubject;
+        RelationshipList result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRelationshipList();
+    }
+
+    @Test
+    public void testSetRelationshipList() throws Exception {
+        OperationalEnvironment testSubject;
+        RelationshipList relationshipList = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setRelationshipList(relationshipList);
+    }
+
+    @Test
+    public void testOperationalEnvironment() throws Exception {
+        OperationalEnvironment testSubject;
+        String operationalEnvironmentId = "";
+        String operationalEnvironmentName = "";
+        String operationalEnvironmentType = "";
+        String operationalEnvironmentStatus = "";
+        String tenantContext = "";
+        String workloadContext = "";
+        String resourceVersion = "";
+        RelationshipList relationshipList = null;
+
+        // default test
+        testSubject = new OperationalEnvironment(operationalEnvironmentId, operationalEnvironmentName,
+                operationalEnvironmentType, operationalEnvironmentStatus, tenantContext, workloadContext,
+                resourceVersion, relationshipList);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/ServicePropertiesTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/ServicePropertiesTest.java
new file mode 100644
index 0000000..b651049
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/ServicePropertiesTest.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai;
+
+import java.util.Map;
+
+import org.junit.Test;
+import org.onap.osam.aai.model.ServiceProperties;
+
+public class ServicePropertiesTest {
+
+	private ServiceProperties createTestSubject() {
+		return new ServiceProperties();
+	}
+
+	@Test
+	public void testGetAdditionalProperties() throws Exception {
+		ServiceProperties testSubject;
+		Map<String, Object> result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getAdditionalProperties();
+	}
+
+	@Test
+	public void testSetAdditionalProperty() throws Exception {
+		ServiceProperties testSubject;
+		String name = "";
+		Object value = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setAdditionalProperty(name, value);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/SubscriberAaiResponseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/SubscriberAaiResponseTest.java
new file mode 100644
index 0000000..8adf9c2
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/SubscriberAaiResponseTest.java
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai;
+
+import org.junit.Test;
+import org.onap.osam.model.SubscriberList;
+
+public class SubscriberAaiResponseTest {
+
+	private SubscriberAaiResponse createTestSubject() {
+		return new SubscriberAaiResponse(new SubscriberList(), "", 0);
+	}
+
+	
+	@Test
+	public void testGetSubscriberList() throws Exception {
+		SubscriberAaiResponse testSubject;
+		SubscriberList result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getSubscriberList();
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/SubscriberFilteredResultsTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/SubscriberFilteredResultsTest.java
new file mode 100644
index 0000000..e7cf380
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/SubscriberFilteredResultsTest.java
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai;
+
+import java.util.ArrayList;
+
+import org.junit.Test;
+import org.onap.osam.model.SubscriberList;
+import org.onap.osam.roles.EcompRole;
+import org.onap.osam.roles.Role;
+import org.onap.osam.roles.RoleValidator;
+
+public class SubscriberFilteredResultsTest {
+
+    private SubscriberFilteredResults createTestSubject() {
+        ArrayList<Role> list = new ArrayList<Role>();
+        list.add(new Role(EcompRole.READ, "a", "a", "a"));
+        RoleValidator rl=new RoleValidator(list);
+        SubscriberList sl = new SubscriberList();
+        sl.customer = new ArrayList<org.onap.osam.model.Subscriber>();
+        sl.customer.add(new org.onap.osam.model.Subscriber());
+        return new SubscriberFilteredResults(rl, sl, "OK", 200);
+    }
+
+    @Test
+    public void testGetSubscriberList() throws Exception {
+        SubscriberFilteredResults testSubject;
+        SubscriberListWithFilterData result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getSubscriberList();
+    }
+
+    @Test
+    public void testSetSubscriberList() throws Exception {
+        SubscriberFilteredResults testSubject;
+        SubscriberListWithFilterData subscriberList = null;
+
+        // default test
+        testSubject = createTestSubject();
+        //testSubject.setSubscriberList(subscriberList);
+        testSubject.getSubscriberList();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/SubscriberWithFilterTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/SubscriberWithFilterTest.java
new file mode 100644
index 0000000..5b6ddcc
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/SubscriberWithFilterTest.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai;
+
+import org.junit.Test;
+
+public class SubscriberWithFilterTest {
+
+	private SubscriberWithFilter createTestSubject() {
+		return new SubscriberWithFilter();
+	}
+
+	@Test
+	public void testGetIsPermitted() throws Exception {
+		SubscriberWithFilter testSubject;
+		boolean result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getIsPermitted();
+	}
+
+	@Test
+	public void testSetIsPermitted() throws Exception {
+		SubscriberWithFilter testSubject;
+		boolean isPermitted = false;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setIsPermitted(isPermitted);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/VnfResultTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/VnfResultTest.java
new file mode 100644
index 0000000..3f06e6c
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/VnfResultTest.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai;
+
+import java.util.Map;
+
+import org.junit.Test;
+import org.onap.osam.aai.model.VnfResult;
+
+public class VnfResultTest {
+
+	private VnfResult createTestSubject() {
+		return new VnfResult();
+	}
+
+	@Test
+	public void testGetAdditionalProperties() throws Exception {
+		VnfResult testSubject;
+		Map<String, Object> result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getAdditionalProperties();
+	}
+
+	@Test
+	public void testSetAdditionalProperty() throws Exception {
+		VnfResult testSubject;
+		String name = "";
+		Object value = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setAdditionalProperty(name, value);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiGetOperationalEnvironments/OperationalEnvironmentListTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiGetOperationalEnvironments/OperationalEnvironmentListTest.java
new file mode 100644
index 0000000..4bc64ab
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiGetOperationalEnvironments/OperationalEnvironmentListTest.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model.AaiGetOperationalEnvironments;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+import org.junit.Test;
+
+public class OperationalEnvironmentListTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(OperationalEnvironmentList.class, hasValidGettersAndSetters());
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiGetPnfResponseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiGetPnfResponseTest.java
new file mode 100644
index 0000000..c74fe37
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiGetPnfResponseTest.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.StringContains.containsString;
+import static org.hamcrest.core.IsEqual.equalTo;
+
+public class AaiGetPnfResponseTest {
+
+    private AaiGetPnfResponse aaiGetPnfResponse;
+
+    @Before
+    public void setUp(){
+        aaiGetPnfResponse = new AaiGetPnfResponse();
+        aaiGetPnfResponse.results = new ArrayList<>();
+        aaiGetPnfResponse.setAdditionalProperty("key1", "value1");
+        aaiGetPnfResponse.setAdditionalProperty("key2", "value2");
+    }
+
+    @Test
+    public void shouldHaveValidGettersAndSetters() throws IOException {
+        String result = new ObjectMapper().writeValueAsString(aaiGetPnfResponse);
+        assertThat(result, containsString("key1"));
+        assertThat(result, containsString("value2"));
+        assertThat(result, containsString("key2"));
+        assertThat(result, containsString("value2"));
+    }
+
+    @Test
+    public void shouldHaveValidToString(){
+        assertThat(aaiGetPnfResponse.toString(),
+                equalTo("AaiGetPnfResponse{results=[], additionalProperties={key1=value1, key2=value2}}"));
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiGetPnfs/PnfTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiGetPnfs/PnfTest.java
new file mode 100644
index 0000000..ec25225
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiGetPnfs/PnfTest.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model.AaiGetPnfs;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class PnfTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(Pnf.class, hasValidGettersAndSetters());
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiRelationResponseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiRelationResponseTest.java
new file mode 100644
index 0000000..d139936
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/AaiRelationResponseTest.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class AaiRelationResponseTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(AaiRelationResponse.class, hasValidGettersAndSetters());
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/GetServiceModelsByDistributionStatusResponseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/GetServiceModelsByDistributionStatusResponseTest.java
new file mode 100644
index 0000000..a0b4ac2
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/GetServiceModelsByDistributionStatusResponseTest.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class GetServiceModelsByDistributionStatusResponseTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(GetServiceModelsByDistributionStatusResponse.class, hasValidGettersAndSetters());
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/LogicalLinkResponseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/LogicalLinkResponseTest.java
new file mode 100644
index 0000000..607ea78
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/LogicalLinkResponseTest.java
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class LogicalLinkResponseTest {
+
+    private LogicalLinkResponse createTestSubject() {
+        return new LogicalLinkResponse();
+    }
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(LogicalLinkResponse.class, hasValidGettersAndSetters());
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ModelTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ModelTest.java
new file mode 100644
index 0000000..13d6ea2
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ModelTest.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class ModelTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(Model.class, hasValidGettersAndSetters());
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ModelVerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ModelVerTest.java
new file mode 100644
index 0000000..d0944c1
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ModelVerTest.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class ModelVerTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(ModelVer.class, hasValidGettersAndSetters());
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ModelVersTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ModelVersTest.java
new file mode 100644
index 0000000..3d32f87
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ModelVersTest.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class ModelVersTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(ModelVers.class, hasValidGettersAndSetters());
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/OwningEntityTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/OwningEntityTest.java
new file mode 100644
index 0000000..a38bdc6
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/OwningEntityTest.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class OwningEntityTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(OwningEntity.class, hasValidGettersAndSetters());
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/PnfPropertiesTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/PnfPropertiesTest.java
new file mode 100644
index 0000000..80989ef
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/PnfPropertiesTest.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.StringContains.containsString;
+
+public class PnfPropertiesTest {
+
+    private PnfProperties pnfProperties;
+
+    @Before
+    public void setUp(){
+        pnfProperties = new PnfProperties();
+        pnfProperties.setAdditionalProperty("key1", "value1");
+        pnfProperties.setAdditionalProperty("key2", "value2");
+    }
+
+    @Test
+    public void shouldHaveValidGettersAndSetters() throws IOException {
+        String result = new ObjectMapper().writeValueAsString(pnfProperties);
+        assertThat(result, containsString("key1"));
+        assertThat(result, containsString("value2"));
+        assertThat(result, containsString("key2"));
+        assertThat(result, containsString("value2"));
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/PnfResultTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/PnfResultTest.java
new file mode 100644
index 0000000..027c47e
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/PnfResultTest.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import java.io.IOException;
+
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.StringContains.containsString;
+
+public class PnfResultTest {
+
+    private PnfResult pnfResult;
+
+    @Before
+    public void setUp(){
+        pnfResult = new PnfResult();
+        pnfResult.setAdditionalProperty("key1", "value1");
+        pnfResult.setAdditionalProperty("key2", "value2");
+    }
+
+    @Test
+    public void shouldHaveValidGettersAndSetters() throws IOException {
+        String result = new ObjectMapper().writeValueAsString(pnfResult);
+        assertThat(result, containsString("key1"));
+        assertThat(result, containsString("value2"));
+        assertThat(result, containsString("key2"));
+        assertThat(result, containsString("value2"));
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ProjectResponseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ProjectResponseTest.java
new file mode 100644
index 0000000..85719b7
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ProjectResponseTest.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class ProjectResponseTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(ProjectResponse.class, hasValidGettersAndSetters());
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ProjectTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ProjectTest.java
new file mode 100644
index 0000000..15d5ad4
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ProjectTest.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class ProjectTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters(){
+        assertThat(Project.class, hasValidGettersAndSetters());
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/RelatedToPropertyTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/RelatedToPropertyTest.java
new file mode 100644
index 0000000..9f7358c
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/RelatedToPropertyTest.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class RelatedToPropertyTest {
+
+	@Test
+	public void shouldHaveValidGettersAndSetters(){
+		assertThat(RelatedToProperty.class, hasValidGettersAndSetters());
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/RelationshipDataTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/RelationshipDataTest.java
new file mode 100644
index 0000000..401e2f5
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/RelationshipDataTest.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+
+public class RelationshipDataTest {
+
+	@Test
+	public void shouldHaveValidGettersAndSetters(){
+		assertThat(RelationshipData.class, hasValidGettersAndSetters());
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/RelationshipTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/RelationshipTest.java
new file mode 100644
index 0000000..6ec55e5
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/RelationshipTest.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+
+public class RelationshipTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters() {
+        assertThat(Relationship.class, hasValidGettersAndSetters());
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ResultTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ResultTest.java
new file mode 100644
index 0000000..f5e8a24
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ResultTest.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class ResultTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters() {
+        assertThat(Result.class, hasValidGettersAndSetters());
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ServiceRelationshipsTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ServiceRelationshipsTest.java
new file mode 100644
index 0000000..3b3f616
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/model/ServiceRelationshipsTest.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.model;
+
+import org.junit.Test;
+
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+
+public class ServiceRelationshipsTest {
+
+    @Test
+    public void shouldHaveValidGettersAndSetters() {
+        assertThat(ServiceRelationships.class, hasValidGettersAndSetters());
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/util/AAIRestInterfaceTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/util/AAIRestInterfaceTest.java
new file mode 100644
index 0000000..ce038c3
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/util/AAIRestInterfaceTest.java
@@ -0,0 +1,99 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.util;
+
+public class AAIRestInterfaceTest {
+
+    /*
+    TO BE IMPLEMENTED
+    
+    private AAIRestInterface createTestSubject() {
+        return new AAIRestInterface("");
+    }
+
+    @Test
+    public void testEncodeURL() throws Exception {
+        AAIRestInterface testSubject;
+        String nodeKey = "";
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.encodeURL(nodeKey);
+    }
+
+    @Test
+    public void testSetRestSrvrBaseURL() throws Exception {
+        AAIRestInterface testSubject;
+        String baseURL = "";
+
+        // test 1
+        testSubject = createTestSubject();
+        baseURL = null;
+        testSubject.SetRestSrvrBaseURL(baseURL);
+
+        // test 2
+        testSubject = createTestSubject();
+        baseURL = "";
+        testSubject.SetRestSrvrBaseURL(baseURL);
+    }
+
+    @Test
+    public void testGetRestSrvrBaseURL() throws Exception {
+        AAIRestInterface testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRestSrvrBaseURL();
+    }
+
+
+    @Test
+    public void testRestPut() throws Exception {
+        AAIRestInterface testSubject;
+        String fromAppId = "";
+        String transId = "";
+        String path = "";
+        String payload = "";
+        boolean xml = false;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.RestPut(fromAppId, transId, path, payload, xml);
+    }
+
+    @Test
+    public void testRestPost() throws Exception {
+        AAIRestInterface testSubject;
+        String fromAppId = "";
+        String transId = "";
+        String path = "";
+        String payload = "";
+        boolean xml = false;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.RestPost(fromAppId, transId, path, payload, xml);
+    }*/
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/util/CustomJacksonJaxBJsonProviderTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/util/CustomJacksonJaxBJsonProviderTest.java
new file mode 100644
index 0000000..6b1029e
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/util/CustomJacksonJaxBJsonProviderTest.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.util;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationConfig;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.SerializationConfig;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CustomJacksonJaxBJsonProviderTest {
+
+    private CustomJacksonJaxBJsonProvider createTestSubject() {
+        return new CustomJacksonJaxBJsonProvider();
+    }
+
+    @Test
+    public void testMapperHasCorrectConfig() throws Exception {
+        CustomJacksonJaxBJsonProvider testSubject = createTestSubject();
+        DeserializationConfig deserializationConfig = testSubject.getMapper().getDeserializationConfig();
+        SerializationConfig serializationConfig = testSubject.getMapper().getSerializationConfig();
+
+        Assert.assertFalse(serializationConfig.hasSerializationFeatures(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS.getMask()));
+        Assert.assertFalse(serializationConfig.hasSerializationFeatures(SerializationFeature.INDENT_OUTPUT.getMask()));
+        Assert.assertFalse(serializationConfig.hasSerializationFeatures(SerializationFeature.WRAP_ROOT_VALUE.getMask()));
+        Assert.assertFalse(serializationConfig.hasSerializationFeatures(SerializationFeature.CLOSE_CLOSEABLE.getMask()));
+
+        Assert.assertFalse(deserializationConfig.hasDeserializationFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES.getMask()));
+        Assert.assertFalse(deserializationConfig.hasDeserializationFeatures(DeserializationFeature.UNWRAP_ROOT_VALUE.getMask()));
+
+        Assert.assertEquals(serializationConfig.getSerializationInclusion(), JsonInclude.Include.NON_NULL);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/util/HttpsAuthClientTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/util/HttpsAuthClientTest.java
new file mode 100644
index 0000000..9883e11
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/util/HttpsAuthClientTest.java
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.util;
+
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import javax.net.ssl.SSLContext;
+
+import static org.mockito.Mockito.verify;
+
+@RunWith(MockitoJUnitRunner.class)
+public class HttpsAuthClientTest {
+    @Mock
+    private SystemPropertyHelper systemPropertyHelper;
+    @Mock
+    private SSLContextProvider sslContextProvider;
+    @Mock
+    private SSLContext sslContext;
+
+    public static final String CERT_FILE_PATH = "any_path";
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/util/ParametrizedAAIRestInterfaceTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/util/ParametrizedAAIRestInterfaceTest.java
new file mode 100644
index 0000000..b33aacf
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/util/ParametrizedAAIRestInterfaceTest.java
@@ -0,0 +1,125 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.util;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.onap.osam.aai.exceptions.InvalidPropertyException;
+import org.testng.Assert;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Response;
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Optional;
+import java.util.UUID;
+
+import static javax.ws.rs.core.Response.Status.NO_CONTENT;
+import static javax.ws.rs.core.Response.Status.OK;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(Parameterized.class)
+public class ParametrizedAAIRestInterfaceTest {
+
+    private static final String PATH = "path";
+    private static final String HTTP_LOCALHOST = "http://localhost/";
+    @Mock
+    private Client client;
+    @Mock
+    private WebTarget webTarget;
+    @Mock
+    private Invocation.Builder builder;
+    @Mock
+    private ServletRequestHelper servletRequestHelper;
+    @Mock
+    private HttpsAuthClient httpsAuthClient;
+    @Mock
+    private HttpServletRequest httpServletRequest;
+    @Mock
+    private Response response;
+    @Mock
+    private SystemPropertyHelper systemPropertyHelper;
+
+    private AAIRestInterface testSubject;
+    private Response.Status status;
+
+    @Parameterized.Parameters
+    public static Collection<Object> data() {
+        return Arrays.asList(OK, NO_CONTENT);
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mockSystemProperties();
+        testSubject = createTestSubject();
+        when(client.target(HTTP_LOCALHOST+PATH)).thenReturn(webTarget);
+        when(webTarget.request()).thenReturn(builder);
+        when(builder.accept(Mockito.anyString())).thenReturn(builder);
+        when(builder.header(Mockito.anyString(), Mockito.anyString())).thenReturn(builder);
+        when(servletRequestHelper.extractOrGenerateRequestId()).thenReturn(UUID.randomUUID().toString());
+    }
+
+    public ParametrizedAAIRestInterfaceTest(Response.Status status) {
+        this.status = status;
+    }
+
+    private AAIRestInterface createTestSubject() {
+        return new AAIRestInterface(Optional.of(client), httpsAuthClient, servletRequestHelper, systemPropertyHelper);
+    }
+
+    @Test
+    public void testRestDeleteWithValidResponse() throws Exception {
+        // given
+        String methodName = "Delete";
+
+        // when
+        when(builder.delete()).thenReturn(response);
+        when(response.getStatusInfo()).thenReturn(status);
+        boolean finalResponse = testSubject.Delete("", "", PATH);
+
+        // then
+        verify(builder).delete();
+        Assert.assertTrue(finalResponse);
+    }
+
+    private void mockSystemProperties() throws UnsupportedEncodingException, InvalidPropertyException {
+        when(systemPropertyHelper.getAAIServerUrl()).thenReturn(Optional.of(HTTP_LOCALHOST));
+        when(systemPropertyHelper.getAAIUseClientCert()).thenReturn(Optional.of("cert"));
+        when(systemPropertyHelper.getAAIVIDPasswd()).thenReturn(Optional.of("passwd"));
+        when(systemPropertyHelper.getAAIVIDUsername()).thenReturn(Optional.of("user"));
+        when(systemPropertyHelper.getEncodedCredentials()).thenReturn("someCredentials");
+        when(systemPropertyHelper.getFullServicePath(Mockito.anyString())).thenReturn("http://localhost/path");
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/aai/util/SingleAAIRestInterfaceTest.java b/onap-enabler-be/src/test/java/org/onap/osam/aai/util/SingleAAIRestInterfaceTest.java
new file mode 100644
index 0000000..5ec9b9e
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/aai/util/SingleAAIRestInterfaceTest.java
@@ -0,0 +1,310 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.aai.util;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.osam.aai.exceptions.InvalidPropertyException;
+import org.testng.Assert;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.UnsupportedEncodingException;
+import java.util.Optional;
+import java.util.UUID;
+
+import static javax.ws.rs.core.Response.Status.*;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class SingleAAIRestInterfaceTest {
+
+    private static final String PATH = "path";
+    private static final String HTTP_LOCALHOST = "http://localhost/";
+    @Mock
+    private Client client;
+    @Mock
+    private WebTarget webTarget;
+    @Mock
+    private Invocation.Builder builder;
+    @Mock
+    private ServletRequestHelper servletRequestHelper;
+    @Mock
+    private HttpsAuthClient httpsAuthClient;
+    @Mock
+    private HttpServletRequest httpServletRequest;
+    @Mock
+    private Response response;
+    @Mock
+    private SystemPropertyHelper systemPropertyHelper;
+
+    private AAIRestInterface testSubject;
+
+    @Before
+    public void setUp() throws Exception {
+        mockSystemProperties();
+        testSubject = createTestSubject();
+        when(client.target(HTTP_LOCALHOST+PATH)).thenReturn(webTarget);
+        when(webTarget.request()).thenReturn(builder);
+        when(builder.accept(Mockito.anyString())).thenReturn(builder);
+        when(builder.header(Mockito.anyString(), Mockito.anyString())).thenReturn(builder);
+        when(servletRequestHelper.extractOrGenerateRequestId()).thenReturn(UUID.randomUUID().toString());
+    }
+
+    private AAIRestInterface createTestSubject() {
+        return new AAIRestInterface(Optional.of(client), httpsAuthClient, servletRequestHelper, systemPropertyHelper);
+    }
+
+    @Test
+    public void testEncodeURL() throws Exception {
+        String nodeKey = "some unusual uri";
+        Assert.assertEquals(testSubject.encodeURL(nodeKey), "some%20unusual%20uri");
+    }
+
+    @Test
+    public void testSetRestSrvrBaseURLWithNullValue() throws Exception {
+        testSubject.SetRestSrvrBaseURL(null);
+    }
+
+    @Test
+    public void testSetRestSrvrBaseURL() throws Exception {
+        String baseUrl = "anything";
+        testSubject.SetRestSrvrBaseURL(baseUrl);
+        Assert.assertEquals(testSubject.getRestSrvrBaseURL(), baseUrl);
+    }
+
+    @Test
+    public void testRestJsonPutWithResponse200() throws Exception {
+        // given
+        String methodName = "RestPut";
+        String payload = "{\"id\": 1}";
+        Entity<String> entity = Entity.entity(payload, MediaType.APPLICATION_JSON);
+
+        // when
+        when(builder.put(Mockito.any(Entity.class))).thenReturn(response);
+        when(response.getStatusInfo()).thenReturn(OK);
+        Response finalResponse = testSubject.RestPut("", PATH, payload, false);
+
+        // then
+        verify(builder).put(entity);
+        Assert.assertEquals(response, finalResponse);
+    }
+
+    @Test
+    public void testFailedRestJsonPut() throws Exception {
+        // given
+        String methodName = "RestPut";
+        String payload = "{\"id\": 1}";
+        Entity<String> entity = Entity.entity(payload, MediaType.APPLICATION_JSON);
+
+        // when
+        when(builder.put(Mockito.any(Entity.class))).thenThrow(new RuntimeException());
+        Response finalResponse = testSubject.RestPut("", PATH, payload, false);
+
+        // then
+        verify(builder).put(entity);
+        Assert.assertEquals(finalResponse, null);
+    }
+
+    @Test
+    public void testRestJsonPutWithResponse400() throws Exception {
+        // given
+        String methodName = "RestPut";
+        String payload = "{\"id\": 1}";
+        Entity<String> entity = Entity.entity(payload, MediaType.APPLICATION_JSON);
+
+        // when
+        when(builder.put(Mockito.any(Entity.class))).thenReturn(response);
+        when(response.getStatusInfo()).thenReturn(BAD_REQUEST);
+        when(response.getStatus()).thenReturn(BAD_REQUEST.getStatusCode());
+        Response finalResponse = testSubject.RestPut("", PATH, payload, false);
+
+        // then
+        verify(builder).put(entity);
+        Assert.assertEquals(response, finalResponse);
+    }
+
+    @Test
+    public void testRestPostWithResponse200() throws Exception {
+        // given
+        String methodName = "RestPost";
+        String payload = "{\"id\": 1}";
+        Entity<String> entity = Entity.entity(payload, MediaType.APPLICATION_JSON);
+
+        // when
+        when(builder.post(Mockito.any(Entity.class))).thenReturn(response);
+        when(response.getStatusInfo()).thenReturn(OK);
+        Response finalResponse = testSubject.RestPost("", PATH, payload, false);
+
+        // then
+        verify(builder).post(entity);
+        Assert.assertEquals(response, finalResponse);
+    }
+
+    @Test
+    public void testRestPostWithResponse400() throws Exception {
+        // given
+        String methodName = "RestPost";
+        String payload = "{\"id\": 1}";
+        Entity<String> entity = Entity.entity(payload, MediaType.APPLICATION_JSON);
+
+        // when
+        when(builder.post(Mockito.any(Entity.class))).thenReturn(response);
+        when(response.getStatusInfo()).thenReturn(BAD_REQUEST);
+        when(response.getStatus()).thenReturn(BAD_REQUEST.getStatusCode());
+        Response finalResponse = testSubject.RestPost("", PATH, payload, false);
+
+        // then
+        verify(builder).post(entity);
+        Assert.assertEquals(response, finalResponse);
+    }
+
+    @Test
+    public void testFailedRestPost() throws Exception {
+        // given
+        String methodName = "RestPost";
+        String payload = "{\"id\": 1}";
+        Entity<String> entity = Entity.entity(payload, MediaType.APPLICATION_JSON);
+
+        // when
+        when(builder.post(Mockito.any(Entity.class))).thenThrow(new RuntimeException());
+        Response finalResponse = testSubject.RestPost("", PATH, payload, false);
+
+        // then
+        verify(builder).post(entity);
+        Assert.assertEquals(finalResponse, null);
+    }
+
+    @Test
+    public void testRestDeleteWithResponse400() throws Exception {
+        // given
+        String methodName = "Delete";
+
+        // when
+        when(builder.delete()).thenReturn(response);
+        when(response.getStatusInfo()).thenReturn(BAD_REQUEST);
+        String reason = "Any reason";
+        when(response.readEntity(String.class)).thenReturn(reason);
+        when(response.getStatus()).thenReturn(BAD_REQUEST.getStatusCode());
+        boolean finalResponse = testSubject.Delete("", "", PATH);
+
+        // then
+        verify(builder).delete();
+        Assert.assertFalse(finalResponse);
+    }
+
+    @Test
+    public void testRestDeleteWithResponse404() throws Exception {
+        // given
+        String methodName = "Delete";
+
+        // when
+        when(builder.delete()).thenReturn(response);
+        when(response.getStatusInfo()).thenReturn(NOT_FOUND);
+        String reason = "Any reason";
+        when(response.readEntity(String.class)).thenReturn(reason);
+        when(response.getStatus()).thenReturn(NOT_FOUND.getStatusCode());
+        boolean finalResponse = testSubject.Delete("", "", PATH);
+
+        // then
+        verify(builder).delete();
+        Assert.assertFalse(finalResponse);
+    }
+
+    @Test
+    public void testFailedRestDelete() throws Exception {
+        // given
+        String methodName = "Delete";
+
+        // when
+        when(builder.delete()).thenThrow(new RuntimeException());
+        boolean finalResponse = testSubject.Delete("", "", PATH);
+
+        // then
+        verify(builder).delete();
+        Assert.assertFalse(finalResponse);
+    }
+
+    @Test
+    public void testRestJsonGetWithResponse200() throws Exception {
+        // given
+        String methodName = "RestGet";
+
+        // when
+        when(builder.get()).thenReturn(response);
+        when(response.getStatusInfo()).thenReturn(OK);
+        Response finalResponse = testSubject.RestGet("", "", PATH, false).getResponse();
+
+        // then
+        Assert.assertEquals(response, finalResponse);
+    }
+
+    @Test
+    public void testRestJsonGetWithResponse400() throws Exception {
+        // given
+        String methodName = "RestGet";
+
+        // when
+        when(builder.get()).thenReturn(response);
+        when(response.getStatusInfo()).thenReturn(BAD_REQUEST);
+        when(response.getStatus()).thenReturn(BAD_REQUEST.getStatusCode());
+        Response finalResponse = testSubject.RestGet("", "", PATH, false).getResponse();
+
+        // then
+        Assert.assertEquals(response, finalResponse);
+    }
+
+    @Test
+    public void testFailedRestGet() throws Exception {
+        // given
+        String methodName = "RestGet";
+
+        // when
+        when(builder.get()).thenThrow(new RuntimeException());
+        Response finalResponse = testSubject.RestGet("", "", PATH, false).getResponse();
+
+        // then
+        Assert.assertEquals(finalResponse, null);
+    }
+
+    private void mockSystemProperties() throws UnsupportedEncodingException, InvalidPropertyException {
+        when(systemPropertyHelper.getAAIServerUrl()).thenReturn(Optional.of(HTTP_LOCALHOST));
+        when(systemPropertyHelper.getAAIUseClientCert()).thenReturn(Optional.of("cert"));
+        when(systemPropertyHelper.getAAIVIDPasswd()).thenReturn(Optional.of("passwd"));
+        when(systemPropertyHelper.getAAIVIDUsername()).thenReturn(Optional.of("user"));
+        when(systemPropertyHelper.getEncodedCredentials()).thenReturn("someCredentials");
+        when(systemPropertyHelper.getFullServicePath(Mockito.anyString())).thenReturn("http://localhost/path");
+        when(systemPropertyHelper.getServiceBasePath(Mockito.anyString())).thenReturn("http://localhost/path");
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/bl/AaiServiceTest.java b/onap-enabler-be/src/test/java/org/onap/osam/bl/AaiServiceTest.java
new file mode 100644
index 0000000..ce5d632
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/bl/AaiServiceTest.java
@@ -0,0 +1,176 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.bl;
+
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.onap.osam.aai.AaiClientInterface;
+import org.onap.osam.aai.AaiResponse;
+import org.onap.osam.aai.model.*;
+import org.onap.osam.aai.model.AaiGetPnfs.Pnf;
+import org.onap.osam.aai.model.AaiGetTenatns.GetTenantsResponse;
+import org.onap.osam.roles.Role;
+import org.onap.osam.roles.RoleValidator;
+import org.onap.osam.services.AaiServiceImpl;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.hamcrest.Matchers.arrayWithSize;
+import static org.hamcrest.Matchers.equalTo;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class AaiServiceTest {
+
+    @InjectMocks
+    private AaiServiceImpl aaiService;
+
+    @Mock
+    private AaiClientInterface aaiClientInterface;
+
+
+
+    @BeforeMethod
+    public void initMocks(){
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void testGetSpecificPnf(){
+        Pnf pnf = new Pnf();
+        pnf.setPnfId("11111");
+        AaiResponse<Pnf> aaiResponse = new AaiResponse<>(pnf, "aaaa", 200);
+        Mockito.doReturn(aaiResponse).when(aaiClientInterface).getSpecificPnf(Mockito.anyString());
+        AaiResponse<Pnf> specificPnf = aaiService.getSpecificPnf("1345667");
+        assertNotNull(specificPnf);
+        pnf = specificPnf.getT();
+        assertNotNull(pnf);
+        assertEquals("11111",pnf.getPnfId());
+        assertEquals("aaaa",specificPnf.getErrorMessage());
+        assertEquals(200,specificPnf.getHttpCode());
+    }
+
+    @Test
+    public void testPnfByRegion(){
+        AaiGetPnfResponse aaiGetPnfResponse = new AaiGetPnfResponse();
+        AaiResponse<AaiGetPnfResponse> aaiResponse = new AaiResponse<>(aaiGetPnfResponse, "", 200);
+        Mockito.doReturn(aaiResponse).when(aaiClientInterface).getPNFData(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString());
+        AaiResponse<AaiGetPnfResponse> aaiGetPnfResponseWrapper = aaiService.getPNFData("1345667", "1345667", "1345667", "1345667", "1345667", "1345667", "1345667");
+        assertNotNull(aaiGetPnfResponseWrapper);
+        aaiGetPnfResponse = aaiGetPnfResponseWrapper.getT();
+        assertNotNull(aaiGetPnfResponse);
+    }
+
+    @Test
+    public void testGetAssociatedPnfs(){
+        ServiceRelationships serviceRelationships = createServiceRelationships();
+        AaiResponse<ServiceRelationships> aaiResponse = new AaiResponse<>(serviceRelationships, null, 200);
+        Mockito.doReturn(aaiResponse).when(aaiClientInterface).getServiceInstance(Mockito.anyString(), Mockito.anyString(), Mockito.anyString());
+
+        LogicalLinkResponse logicalLinkResponse = createLogicalLinkResponse();
+        AaiResponse<LogicalLinkResponse> aaiResponse1 = new AaiResponse<>(logicalLinkResponse, null, 200);
+        Mockito.doReturn(aaiResponse1).when(aaiClientInterface).getLogicalLink("SANITY6758cce9%3ALAG1992%7CSANITY6785cce9%3ALAG1961");
+
+        List<String> pnfList = aaiService.getServiceInstanceAssociatedPnfs("123", "456", "789");
+        assertNotNull(pnfList);
+        assertEquals(1, pnfList.size());
+        assertEquals("SANITY6785cce9", pnfList.get(0));
+    }
+
+    private ServiceRelationships createServiceRelationships() {
+        ServiceRelationships serviceRelationships = new ServiceRelationships();
+        serviceRelationships.setServiceInstanceName("test service");
+
+        RelationshipData logicalLinksRelationshipData = new RelationshipData();
+        logicalLinksRelationshipData.setRelationshipKey("logical-link.link-name");
+        logicalLinksRelationshipData.setRelationshipValue("SANITY6758cce9:LAG1992|SANITY6785cce9:LAG1961");
+
+        Relationship logicalLinksRelationship = new Relationship();
+        logicalLinksRelationship.setRelatedTo("logical-link");
+        logicalLinksRelationship.setRelationDataList(Arrays.asList(logicalLinksRelationshipData));
+
+        RelationshipList logicalLinksRelationshipsList = new RelationshipList();
+        logicalLinksRelationshipsList.setRelationship(Arrays.asList(logicalLinksRelationship));
+
+        serviceRelationships.setRelationshipList(logicalLinksRelationshipsList);
+        return serviceRelationships;
+    }
+
+    private LogicalLinkResponse createLogicalLinkResponse() {
+        LogicalLinkResponse logicalLinkResponse = new LogicalLinkResponse();
+        logicalLinkResponse.setLinkName("SANITY6758cce9:LAG1992|SANITY6785cce9:LAG1961");
+
+        RelationshipData lagInterfaceRelationshipData = new RelationshipData();
+        lagInterfaceRelationshipData.setRelationshipKey("pnf.pnf-name");
+        lagInterfaceRelationshipData.setRelationshipValue("SANITY6785cce9");
+
+        Relationship lagInterfaceRelationship = new Relationship();
+        lagInterfaceRelationship.setRelatedTo("lag-interface");
+        lagInterfaceRelationship.setRelationDataList(Arrays.asList(lagInterfaceRelationshipData));
+
+        RelationshipList lagInterfaceRelationshipsList = new RelationshipList();
+        lagInterfaceRelationshipsList.setRelationship(Arrays.asList(lagInterfaceRelationship));
+
+        logicalLinkResponse.setRelationshipList(lagInterfaceRelationshipsList);
+
+        return logicalLinkResponse;
+    }
+
+    @DataProvider
+    public static Object[][] getTenantsData() {
+        return new Object[][] {
+                {"customer1", "serviceType1", "tenant1", "customer1", "serviceType1", "tenant1", "id-1", true},
+                {"customer1", "serviceType1", "TeNant1", "customer1", "serviceType1", "tenant1", "id-1", true},
+                {"customer1", "serviceType1", "TENANT1", "customer1", "serviceType1", "tenant1", "id-1", true},
+                {"customer1", "serviceType1", "tenant2", "customer1", "serviceType1", "tenant1", "tenant2", false},
+                {"customer1", "serviceType1", null, "customer1", "serviceType1", "tenant1", "tenant2", true},
+                {"customer2", "serviceType1", "tenant1", "customer1", "serviceType1", "tenant1", "id-1", false},
+                {"customer1", "serviceType2", "tenant1", "customer1", "serviceType1", "tenant1", "id-1", false},
+                {"customer2", "serviceType1", null, "customer1", "serviceType1", "tenant1", "id-1", false},
+                {"customer1", "serviceType2", null, "customer1", "serviceType1", "tenant1", "id-1", false},
+        };
+    }
+
+    @Test(dataProvider = "getTenantsData")
+    public void testGetTenants(String userGlobalCustomerId, String userServiceType, String userTenantName, String serviceGlobalCustomerId,
+                               String serviceServiceType, String serviceTenantName, String serviceTenantId, boolean expectedIsPermitted) {
+        GetTenantsResponse[] getTenantsResponses = new GetTenantsResponse[] {new GetTenantsResponse(null, null, serviceTenantName, serviceTenantId, expectedIsPermitted)};
+        AaiResponse<GetTenantsResponse[]> aaiResponse = new AaiResponse<>(getTenantsResponses, null, 200);
+        Mockito.doReturn(aaiResponse).when(aaiClientInterface).getTenants(serviceGlobalCustomerId, serviceServiceType);
+        Role role = new Role(null, userGlobalCustomerId, userServiceType, userTenantName);
+        RoleValidator roleValidator = new RoleValidator(Collections.singletonList(role));
+        AaiResponse<GetTenantsResponse[]> actualTenants = aaiService.getTenants(serviceGlobalCustomerId, serviceServiceType, roleValidator);
+
+        assertThat(actualTenants.getT(), arrayWithSize(1));
+        assertThat(actualTenants.getT()[0].tenantName, equalTo(serviceTenantName));
+        //assertThat(actualTenants.getT()[0].isPermitted, equalTo(expectedIsPermitted));
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/client/HttpBasicClientTest.java b/onap-enabler-be/src/test/java/org/onap/osam/client/HttpBasicClientTest.java
new file mode 100644
index 0000000..3b29cf3
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/client/HttpBasicClientTest.java
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.client;
+
+import org.junit.Test;
+
+public class HttpBasicClientTest {
+
+    private HttpBasicClient createTestSubject() {
+        return new HttpBasicClient();
+    }
+
+    @Test
+    public void testGetClient() throws Exception {
+        // default test
+        HttpBasicClient.getClient();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/client/HttpsBasicClientTest.java b/onap-enabler-be/src/test/java/org/onap/osam/client/HttpsBasicClientTest.java
new file mode 100644
index 0000000..048dd8b
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/client/HttpsBasicClientTest.java
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.client;
+
+import org.junit.Test;
+
+public class HttpsBasicClientTest {
+
+    private HttpsBasicClient createTestSubject() {
+        return new HttpsBasicClient();
+    }
+
+    @Test
+    public void testGetClient() throws Exception {
+
+        // default test
+        HttpsBasicClient.getClient();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/client/SyncRestClientForHttpServerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/client/SyncRestClientForHttpServerTest.java
new file mode 100644
index 0000000..28e899e
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/client/SyncRestClientForHttpServerTest.java
@@ -0,0 +1,270 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.client;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableMap;
+import com.xebialabs.restito.semantics.Condition;
+import com.xebialabs.restito.server.StubServer;
+import io.joshworks.restclient.http.HttpResponse;
+import io.joshworks.restclient.http.JsonNode;
+import org.glassfish.grizzly.http.util.HttpStatus;
+import com.xebialabs.restito.semantics.Action;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.AfterMethod;
+import org.glassfish.grizzly.http.Method;
+import org.testng.annotations.Test;
+
+import java.util.Collections;
+import java.util.Map;
+
+import static com.xebialabs.restito.builder.verify.VerifyHttp.verifyHttp;
+import static com.xebialabs.restito.builder.stub.StubHttp.whenHttp;
+import static com.xebialabs.restito.semantics.Action.stringContent;
+import static com.xebialabs.restito.semantics.Action.contentType;
+import static com.xebialabs.restito.semantics.Action.status;
+import static com.xebialabs.restito.semantics.Action.ok;
+import static org.testng.Assert.assertEquals;
+
+public class SyncRestClientForHttpServerTest {
+
+    private static final SyncRestClientModel.TestModel testObject = new SyncRestClientModel.TestModel(1, "test");
+    private static final String NOT_EXISTING_OBJECT = "NOT EXISTING OBJECT";
+
+    private StubServer stubServer;
+    private ObjectMapper objectMapper = new ObjectMapper();
+    private SyncRestClient syncRestClient;
+
+    @BeforeMethod
+    public void setUp() {
+        stubServer = new StubServer();
+        stubServer.run();
+        syncRestClient = new SyncRestClient();
+    }
+
+    @AfterMethod
+    public void tearDown() {
+        stubServer.stop();
+        syncRestClient.destroy();
+    }
+
+    @Test
+    public void testJsonResponseFromGet() throws JsonProcessingException {
+        // given
+        stubGetCall();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient
+            .get(url, Collections.emptyMap(), Collections.emptyMap());
+        // then
+        verifyHttp(stubServer).once(Condition.method(Method.GET), Condition.url(url));
+        assertEquals(jsonNodeHttpResponse.getStatus(), 200);
+        assertEquals(jsonNodeHttpResponse.getBody().getObject().get("key"), 1);
+        assertEquals(jsonNodeHttpResponse.getBody().getObject().get("value"), "test");
+    }
+
+    @Test
+    public void testObjectResponseFromGet() throws JsonProcessingException {
+        // given
+        stubGetCall();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<SyncRestClientModel.TestModel> testModelHttpResponse = syncRestClient
+            .get(url, Collections.emptyMap(), Collections.emptyMap(), SyncRestClientModel.TestModel.class);
+        // then
+        verifyHttp(stubServer).once(Condition.method(Method.GET), Condition.url(url));
+        assertEquals(testModelHttpResponse.getStatus(), 200);
+        assertEquals(testModelHttpResponse.getBody().getKey(), 1);
+        assertEquals(testModelHttpResponse.getBody().getValue(), "test");
+    }
+
+    @Test
+    public void testJsonResponseFromPost() throws JsonProcessingException {
+        // given
+        stubPostCall();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient.post(url, Collections.emptyMap(), testObject);
+        // then
+        verifyHttp(stubServer).once(Condition.method(Method.POST), Condition.url(url));
+        assertEquals(jsonNodeHttpResponse.getStatus(), 200);
+        assertEquals(jsonNodeHttpResponse.getBody().getObject().get("key"), 1);
+        assertEquals(jsonNodeHttpResponse.getBody().getObject().get("value"), "test");
+    }
+
+    @Test
+    public void test404JsonResponseFromPost() throws JsonProcessingException {
+        // given
+        stubPostCall();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient
+            .post(url, Collections.emptyMap(), NOT_EXISTING_OBJECT);
+        // then
+        assertEquals(jsonNodeHttpResponse.getStatus(), 404);
+        assertEquals(jsonNodeHttpResponse.getStatusText(), "Not Found");
+    }
+
+    @Test
+    public void testHeadersWerePassedToPost() throws JsonProcessingException {
+        // given
+        stubPostCall();
+        Map headers = ImmutableMap.<String, String>builder().put("Authorization", "Basic anyHash").build();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient.post(url, headers, testObject);
+        // then
+        verifyHttp(stubServer).once(Condition.withHeader("Authorization"));
+        assertEquals(jsonNodeHttpResponse.getStatus(), 200);
+    }
+
+    @Test(expectedExceptions = {Exception.class})
+    public void testFailedJsonResponseFromPost() throws JsonProcessingException {
+        // given
+        stubPostCall();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        stubServer.stop();
+        syncRestClient.post(url, Collections.emptyMap(), testObject);
+    }
+
+    @Test
+    public void testObjectResponseFromPost() throws JsonProcessingException {
+        // given
+        stubPostCall();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<SyncRestClientModel.TestModel> objectHttpResponse = syncRestClient
+            .post(url, Collections.emptyMap(), testObject, SyncRestClientModel.TestModel.class);
+        // then
+        verifyHttp(stubServer).once(Condition.method(Method.POST), Condition.url(url));
+        assertEquals(objectHttpResponse.getStatus(), 200);
+        assertEquals(objectHttpResponse.getBody().getKey(), 1);
+        assertEquals(objectHttpResponse.getBody().getValue(), "test");
+    }
+
+    @Test
+    public void testJsonResponseFromPut() throws JsonProcessingException {
+        // given
+        stubPutCall();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient.put(url, Collections.emptyMap(), testObject);
+        // then
+        verifyHttp(stubServer).once(Condition.method(Method.PUT), Condition.url(url));
+        assertEquals(jsonNodeHttpResponse.getStatus(), 201);
+        assertEquals(jsonNodeHttpResponse.getBody().getObject().get("key"), 1);
+        assertEquals(jsonNodeHttpResponse.getBody().getObject().get("value"), "test");
+    }
+
+    @Test
+    public void testObjectResponseFromPut() throws JsonProcessingException {
+        // given
+        stubPutCall();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<SyncRestClientModel.TestModel> modelHttpResponse = syncRestClient
+            .put(url, Collections.emptyMap(), testObject, SyncRestClientModel.TestModel.class);
+        // then
+        verifyHttp(stubServer).once(Condition.method(Method.PUT), Condition.url(url));
+        assertEquals(modelHttpResponse.getStatus(), 201);
+        assertEquals(modelHttpResponse.getBody().getKey(), 1);
+        assertEquals(modelHttpResponse.getBody().getValue(), "test");
+    }
+
+    @Test
+    public void testJsonResponseFromDelete() throws JsonProcessingException {
+        // given
+        stubDeleteCall();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient.delete(url, Collections.emptyMap());
+        // then
+        verifyHttp(stubServer).once(Condition.method(Method.DELETE), Condition.url(url));
+        assertEquals(jsonNodeHttpResponse.getStatus(), 200);
+        assertEquals(jsonNodeHttpResponse.getBody().getObject().get("key"), 1);
+        assertEquals(jsonNodeHttpResponse.getBody().getObject().get("value"), "test");
+    }
+
+    @Test
+    public void testObjectResponseFromDelete() throws JsonProcessingException {
+        // given
+        stubDeleteCall();
+        String url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<SyncRestClientModel.TestModel> modelHttpResponse = syncRestClient
+            .delete(url, Collections.emptyMap(),  SyncRestClientModel.TestModel.class);
+        // then
+        verifyHttp(stubServer).once(Condition.method(Method.DELETE), Condition.url(url));
+        assertEquals(modelHttpResponse.getStatus(), 200);
+        assertEquals(modelHttpResponse.getBody().getKey(), 1);
+        assertEquals(modelHttpResponse.getBody().getValue(), "test");
+    }
+
+    @Test
+    public void testRedirectToHttp() throws JsonProcessingException {
+        // given
+        stubGetCall();
+        String secured_url = "https://0.0.0.0:" + stubServer.getPort() + "/test";
+        String available_url = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient
+            .get(secured_url, Collections.emptyMap(), Collections.emptyMap());
+        // then
+        verifyHttp(stubServer).once(Condition.method(Method.GET), Condition.url(available_url),
+            Condition.not(Condition.url(secured_url)));
+        assertEquals(jsonNodeHttpResponse.getStatus(), 200);
+    }
+
+    private void stubGetCall() throws JsonProcessingException {
+        whenHttp(stubServer)
+            .match(Condition.get("/test"))
+            .then(ok(), jsonContent(), contentType("application/json"));
+    }
+
+    private void stubDeleteCall() throws JsonProcessingException {
+        whenHttp(stubServer)
+            .match(Condition.delete("/test"))
+            .then(ok(), jsonContent(), contentType("application/json"));
+    }
+
+    private void stubPostCall() throws JsonProcessingException {
+        whenHttp(stubServer)
+            .match(Condition.post("/test"),
+                Condition.withPostBodyContaining(objectMapper.writeValueAsString(testObject)))
+            .then(ok(), jsonContent(), contentType("application/json"));
+    }
+
+    private void stubPutCall() throws JsonProcessingException {
+        whenHttp(stubServer)
+            .match(Condition.put("/test"),
+                Condition.withPostBodyContaining(objectMapper.writeValueAsString(testObject)))
+            .then(status(HttpStatus.CREATED_201), jsonContent(), contentType("application/json"));
+    }
+
+    private Action jsonContent() throws JsonProcessingException {
+        return stringContent(objectMapper.writeValueAsString(testObject));
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/client/SyncRestClientForHttpsServerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/client/SyncRestClientForHttpsServerTest.java
new file mode 100644
index 0000000..9450f27
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/client/SyncRestClientForHttpsServerTest.java
@@ -0,0 +1,140 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.client;
+
+import io.joshworks.restclient.http.HttpResponse;
+import io.joshworks.restclient.http.JsonNode;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.conn.ssl.SSLContextBuilder;
+import com.xebialabs.restito.semantics.Condition;
+import com.xebialabs.restito.server.StubServer;
+import com.xebialabs.restito.semantics.Action;
+import org.apache.http.config.RegistryBuilder;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.AfterMethod;
+import org.glassfish.grizzly.http.Method;
+import org.apache.http.config.Registry;
+import org.testng.annotations.Test;
+
+import java.security.GeneralSecurityException;
+import javax.net.ssl.SSLContext;
+import java.util.Collections;
+
+import static com.xebialabs.restito.builder.verify.VerifyHttp.verifyHttp;
+import static com.xebialabs.restito.builder.stub.StubHttp.whenHttp;
+import static com.xebialabs.restito.semantics.Action.stringContent;
+import static com.xebialabs.restito.semantics.Action.contentType;
+import static org.apache.http.client.config.RequestConfig.custom;
+import static com.xebialabs.restito.semantics.Action.ok;
+import static org.testng.Assert.assertEquals;
+
+public class SyncRestClientForHttpsServerTest {
+
+    private static final SyncRestClientModel.TestModel testObject = new SyncRestClientModel.TestModel(1, "test");
+    private static final String[] SUPPORTED_PROTOCOLS = {"TLSv1", "TLSv1.2"};
+    private StubServer stubServer;
+    private ObjectMapper objectMapper = new ObjectMapper();
+
+    private SyncRestClient syncRestClient;
+
+    @BeforeMethod
+    public void setUp() throws GeneralSecurityException {
+        stubServer = new StubServer();
+        stubServer.secured().run();
+        syncRestClient = new SyncRestClient(createNaiveHttpClient());
+    }
+
+    @AfterMethod
+    public void tearDown() {
+        stubServer.stop();
+    }
+
+    @Test
+    public void testJsonResponseFromGet() throws JsonProcessingException {
+        // given
+        stubGetCall();
+        String securedUrl = "https://0.0.0.0:" + stubServer.getPort() + "/test";
+        String notSecuredUrl = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<JsonNode> jsonNodeHttpResponse = syncRestClient
+            .get(securedUrl, Collections.emptyMap(), Collections.emptyMap());
+        // then
+        verifyHttp(stubServer)
+            .once(Condition.method(Method.GET), Condition.url(securedUrl), Condition.not(Condition.url(notSecuredUrl)));
+        assertEquals(jsonNodeHttpResponse.getStatus(), 200);
+        assertEquals(jsonNodeHttpResponse.getBody().getObject().get("key"), 1);
+        assertEquals(jsonNodeHttpResponse.getBody().getObject().get("value"), "test");
+    }
+
+    @Test
+    public void testObjectResponseFromGet() throws JsonProcessingException {
+        // given
+        stubServer.run();
+        stubGetCall();
+        String securedUrl = "https://0.0.0.0:" + stubServer.getPort() + "/test";
+        String notSecuredUrl = "http://0.0.0.0:" + stubServer.getPort() + "/test";
+        // when
+        HttpResponse<SyncRestClientModel.TestModel> testModelHttpResponse = syncRestClient
+            .get(securedUrl, Collections.emptyMap(), Collections.emptyMap(), SyncRestClientModel.TestModel.class);
+        // then
+        verifyHttp(stubServer)
+            .once(Condition.method(Method.GET), Condition.url(securedUrl), Condition.not(Condition.url(notSecuredUrl)));
+        assertEquals(testModelHttpResponse.getStatus(), 200);
+        assertEquals(testModelHttpResponse.getBody().getKey(), 1);
+        assertEquals(testModelHttpResponse.getBody().getValue(), "test");
+    }
+
+    private Action jsonContent() throws JsonProcessingException {
+        return stringContent(objectMapper.writeValueAsString(testObject));
+    }
+
+    private void stubGetCall() throws JsonProcessingException {
+        whenHttp(stubServer)
+            .match(Condition.get("/test"))
+            .then(ok(), jsonContent(), contentType("application/json"));
+    }
+
+    private CloseableHttpClient createNaiveHttpClient() throws GeneralSecurityException {
+        final SSLContext context = new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy())
+            .build();
+
+        final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(context, SUPPORTED_PROTOCOLS,
+            null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
+            .register("https", socketFactory)
+            .build();
+
+        return HttpClientBuilder.create()
+            .setDefaultRequestConfig(custom().setConnectionRequestTimeout(10000).build())
+            .setConnectionManager(new PoolingHttpClientConnectionManager(registry))
+            .setSSLSocketFactory(socketFactory).build();
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/client/SyncRestClientModel.java b/onap-enabler-be/src/test/java/org/onap/osam/client/SyncRestClientModel.java
new file mode 100644
index 0000000..94f5ac2
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/client/SyncRestClientModel.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.client;
+
+class SyncRestClientModel {
+
+    static class TestModel{
+
+        public TestModel() {
+            // needed by the object mappers
+        }
+
+        public TestModel(long key, String value) {
+            this.key = key;
+            this.value = value;
+        }
+
+        private long key;
+        private String value;
+
+        public void setKey(long key) {
+            this.key = key;
+        }
+
+        public void setValue(String value) {
+            this.value = value;
+        }
+
+        public long getKey() {
+            return key;
+        }
+
+        public String getValue() {
+            return value;
+        }
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/config/DataSourceConfig.java b/onap-enabler-be/src/test/java/org/onap/osam/config/DataSourceConfig.java
new file mode 100644
index 0000000..46f2b0e
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/config/DataSourceConfig.java
@@ -0,0 +1,103 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.config;
+
+
+import org.hibernate.SessionFactory;
+import org.onap.portalsdk.core.service.DataAccessService;
+import org.onap.portalsdk.core.service.DataAccessServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.orm.hibernate4.HibernateTransactionManager;
+import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+@Configuration
+@EnableTransactionManagement
+public class DataSourceConfig {
+
+    @Bean
+    @Autowired
+    public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
+        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
+        sessionFactory.setDataSource(dataSource);
+        //I used this class org.openecomp.portalsdk.core.conf.HibernateConfiguration to learn how to config the session factory
+        // and use the following url for actual h2 properties
+        //https://github.com/levi-putna/Hibernate-H2-Example/blob/master/hibernate-h2-example/src/hibernate.cfg.xml
+        Properties properties = getH2Properties();
+
+        properties.put("hibernate.default_schema", "PUBLIC");
+        properties.put("connection.pool_size", 10);
+        properties.put("cache.provider_class", "org.hibernate.cache.internal.NoCacheProvider");
+        properties.put("hibernate.show_sql", false);
+        properties.put("hbm2ddl.auto", "create");
+        properties.put("hibernate.hbm2ddl.auto", "create");
+
+        sessionFactory.setHibernateProperties(properties);
+        sessionFactory.setPackagesToScan("org.onap");
+        return sessionFactory;
+    }
+
+    @Bean
+    public DataSource getDataSource() {
+        DriverManagerDataSource dataSource = new DriverManagerDataSource();
+        dataSource.setDriverClassName("org.h2.Driver");
+        dataSource.setUrl("jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1");
+        dataSource.setUsername("sa");
+        dataSource.setPassword("");
+        return dataSource;
+    }
+
+    public Properties getH2Properties() {
+        Properties properties = new Properties();
+        properties.put("dialect", "org.hibernate.dialect.H2Dialect");
+        return properties;
+    }
+
+    public Properties getSqliteProperties() {
+        Properties properties = new Properties();
+        properties.put("connection.driver_class", "org.sqlite.JDBC");
+        properties.put("connection.url", "jdbc:sqlite:memory:myDb");
+        properties.put("connection.username", "sa");
+        properties.put("connection.password", "sa");
+        properties.put("dialect", "com.enigmabridge.hibernate.dialect.SQLiteDialect");
+        return properties;
+    }
+
+    @Bean
+    public DataAccessService dataAccessService() {
+        return new DataAccessServiceImpl();
+    }
+
+    @Bean
+    @Autowired
+    public PlatformTransactionManager transactionManager(SessionFactory sessionFactory) {
+        return new HibernateTransactionManager(sessionFactory);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/config/JobAdapterConfig.java b/onap-enabler-be/src/test/java/org/onap/osam/config/JobAdapterConfig.java
new file mode 100644
index 0000000..754b114
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/config/JobAdapterConfig.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.config;
+
+
+import org.hibernate.SessionFactory;
+import org.onap.osam.job.JobAdapter;
+import org.onap.osam.job.JobsBrokerService;
+import org.onap.osam.job.impl.JobAdapterImpl;
+import org.onap.osam.job.impl.JobsBrokerServiceInDatabaseImpl;
+import org.onap.osam.properties.VidProperties;
+import org.onap.portalsdk.core.service.DataAccessService;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@Configuration
+@EnableTransactionManagement
+public class JobAdapterConfig {
+
+    @Bean
+    public JobAdapter jobAdapter() {
+        return new JobAdapterImpl();
+    }
+
+    @Bean
+    public JobsBrokerService jobsBrokerService(DataAccessService dataAccessService, SessionFactory sessionFactory) {
+        int maxOpenedInstantiationRequestsToMso = Integer.parseInt(SystemProperties.getProperty(VidProperties.MSO_MAX_OPENED_INSTANTIATION_REQUESTS));
+        int pollingIntervalSeconds = Integer.parseInt(SystemProperties.getProperty(VidProperties.MSO_ASYNC_POLLING_INTERVAL_SECONDS));
+
+        return new JobsBrokerServiceInDatabaseImpl(dataAccessService, sessionFactory, maxOpenedInstantiationRequestsToMso, pollingIntervalSeconds);
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/config/JobCommandsConfigWithMockedMso.java b/onap-enabler-be/src/test/java/org/onap/osam/config/JobCommandsConfigWithMockedMso.java
new file mode 100644
index 0000000..8f88b1e
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/config/JobCommandsConfigWithMockedMso.java
@@ -0,0 +1,113 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.config;
+
+import org.hibernate.SessionFactory;
+import org.mockito.Mockito;
+import org.onap.osam.services.IAsyncInstantiationBusinessLogic;
+import org.onap.portalsdk.core.service.DataAccessService;
+import org.onap.osam.aai.AaiClientInterface;
+import org.onap.osam.aai.util.HttpsAuthClient;
+import org.onap.osam.aai.util.SSLContextProvider;
+import org.onap.osam.aai.util.SystemPropertyHelper;
+import org.onap.osam.job.JobAdapter;
+import org.onap.osam.job.JobsBrokerService;
+import org.onap.osam.job.command.InProgressStatusCommand;
+import org.onap.osam.job.command.JobCommandFactory;
+import org.onap.osam.job.command.ServiceInstantiationCommand;
+import org.onap.osam.job.impl.JobAdapterImpl;
+import org.onap.osam.job.impl.JobWorker;
+import org.onap.osam.job.impl.JobsBrokerServiceInDatabaseImpl;
+import org.onap.osam.mso.RestMsoImplementation;
+import org.onap.osam.services.AsyncInstantiationBusinessLogicImpl;
+import org.onap.osam.services.IAuditService;
+import org.onap.osam.services.AuditServiceImpl;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Scope;
+
+@Configuration
+public class JobCommandsConfigWithMockedMso {
+
+    @Bean
+    public RestMsoImplementation restMso() {
+        return Mockito.mock(RestMsoImplementation.class);
+    }
+
+    @Bean
+    public JobsBrokerService jobsBrokerService(DataAccessService dataAccessService, SessionFactory sessionFactory) {
+        return new JobsBrokerServiceInDatabaseImpl(dataAccessService, sessionFactory, 200, 0);
+    }
+
+    @Bean
+    public HttpsAuthClient httpsAuthClientFactory(){
+        return new HttpsAuthClient("some random path", new SystemPropertyHelper(), new SSLContextProvider());
+    }
+
+    @Bean
+    public JobAdapter jobAdapter() {
+        return new JobAdapterImpl();
+    }
+
+    @Bean
+    public JobCommandFactory jobCommandFactory(ApplicationContext applicationContext) {
+        return new JobCommandFactory(applicationContext);
+    }
+
+    @Bean
+    public JobWorker jobWorker(JobsBrokerService jobsBrokerService, JobCommandFactory jobCommandFactory) {
+        JobWorker jobWorker = new JobWorker();
+        jobWorker.setJobsBrokerService(jobsBrokerService);
+        jobWorker.setJobCommandFactory(jobCommandFactory);
+        return jobWorker;
+    }
+
+    @Bean
+    public IAsyncInstantiationBusinessLogic asyncInstantiationBusinessLogic(DataAccessService dataAccessService,
+                                                                            JobAdapter jobAdapter,
+                                                                            JobsBrokerService jobsBrokerService,
+                                                                            SessionFactory sessionFactory,
+                                                                            AaiClientInterface aaiClient) {
+        return new AsyncInstantiationBusinessLogicImpl(dataAccessService, jobAdapter, jobsBrokerService, sessionFactory, aaiClient);
+    }
+
+    @Bean
+    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+    public ServiceInstantiationCommand serviceInstantiationCommand() {
+        return new ServiceInstantiationCommand();
+    }
+
+    @Bean
+    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+    public InProgressStatusCommand inProgressStatusCommand() {
+        return new InProgressStatusCommand();
+    }
+
+    @Bean
+    public IAuditService auditService() {
+        return new AuditServiceImpl();
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/config/MockedAaiClientAndFeatureManagerConfig.java b/onap-enabler-be/src/test/java/org/onap/osam/config/MockedAaiClientAndFeatureManagerConfig.java
new file mode 100644
index 0000000..c1a0f68
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/config/MockedAaiClientAndFeatureManagerConfig.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.config;
+
+import org.mockito.Mockito;
+import org.onap.osam.aai.AaiClientInterface;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.togglz.core.manager.FeatureManager;
+
+@Configuration
+public class MockedAaiClientAndFeatureManagerConfig {
+
+    @Bean
+    public FeatureManager featureManager() {
+        return Mockito.mock(FeatureManager.class);
+    }
+
+    @Bean
+    public AaiClientInterface aaiClient() {
+        return Mockito.mock(AaiClientInterface.class);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controller/ClientCredentialsFilterTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controller/ClientCredentialsFilterTest.java
new file mode 100644
index 0000000..6ef2fcc
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controller/ClientCredentialsFilterTest.java
@@ -0,0 +1,111 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controller;
+
+
+import org.junit.Assert;
+import org.mockito.Mockito;
+import org.onap.osam.filters.ClientCredentialsFilter;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+import static org.mockito.Matchers.any;
+
+
+@Test
+public class ClientCredentialsFilterTest {
+
+    @DataProvider
+    public static Object[][] authorizedData() {
+        return new Object[][] {
+                {"Basic 123==", null},
+                {null, null},
+                {null, ""},
+                {"Basic 123==", ""},
+                {"Basic 123==", "Basic 123=="}
+        };
+    }
+
+    @DataProvider
+    public static Object[][] notAuthorizedData() {
+        return new Object[][] {
+                {null, "Basic 123=="},
+                {"", "Basic 123=="},
+                {"not null but not as expected", "Basic 123=="},
+                {"basic 123==", "Basic 123=="}
+        };
+    }
+
+    @DataProvider
+    public static Object[][] clientVerified() {
+        return new Object[][] {
+                {true},
+                {false}
+        };
+    }
+
+    @Test(dataProvider = "authorizedData")
+    public void givenAuthorizationHeader_Authorized(String actualAuth, String expectedAuth){
+        ClientCredentialsFilter filter = new ClientCredentialsFilter();
+        Assert.assertTrue(filter.verifyClientCredentials(actualAuth, expectedAuth));
+    }
+
+    @Test(dataProvider = "notAuthorizedData")
+    public void givenAuthorizationHeader_NotAuthorized(String actualAuth, String expectedAuth){
+        ClientCredentialsFilter filter = new ClientCredentialsFilter();
+        Assert.assertFalse(filter.verifyClientCredentials(actualAuth, expectedAuth));
+    }
+
+    //@Test(dataProvider = "clientVerified")
+    public void notAuthorized_return401(Boolean clientVerified) throws IOException, ServletException {
+        ClientCredentialsFilter filter = Mockito.mock(ClientCredentialsFilter.class);
+        HttpServletResponse response = Mockito.mock(HttpServletResponse.class);
+        HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+        FilterChain chain = Mockito.mock(FilterChain.class);
+
+
+        Mockito.when(filter.verifyClientCredentials(any(String.class),any(String.class))).thenReturn(clientVerified);
+        Mockito.doNothing().when(response).sendError(401);
+
+        Mockito.doCallRealMethod().when(filter).doFilter(request,response,chain);
+        filter.doFilter(request,response,chain);
+
+        if (clientVerified)
+        {
+            Mockito.verify(chain).doFilter(request,response);
+
+        }
+        else {
+            Mockito.verify(response).sendError(401);
+        }
+
+    }
+
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controller/LocalWebConfig.java b/onap-enabler-be/src/test/java/org/onap/osam/controller/LocalWebConfig.java
new file mode 100644
index 0000000..97fe380
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controller/LocalWebConfig.java
@@ -0,0 +1,93 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.onap.osam.aai.AaiClient;
+import org.onap.osam.aai.AaiClientInterface;
+import org.onap.osam.aai.model.PortDetailsTranslator;
+import org.onap.osam.aai.util.AAIRestInterface;
+import org.onap.osam.aai.util.HttpsAuthClient;
+import org.onap.osam.aai.util.SSLContextProvider;
+import org.onap.osam.aai.util.ServletRequestHelper;
+import org.onap.osam.aai.util.SystemPropertyHelper;
+import org.onap.osam.services.AaiServiceImpl;
+import org.onap.osam.services.IAaiService;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.ServletContext;
+import java.io.File;
+
+@Configuration
+public class LocalWebConfig {
+
+    @Bean
+    public ObjectMapper getObjectMapper() {
+        return new ObjectMapper();
+    }
+
+
+    @Bean
+    public IAaiService getAaiService() {
+        return new AaiServiceImpl();
+    }
+
+    @Bean
+    public SSLContextProvider sslContextProvider() {
+        return new SSLContextProvider();
+    }
+
+    @Bean
+    public SystemPropertyHelper systemPropertyHelper() {
+        return new SystemPropertyHelper();
+    }
+
+    @Bean
+    public ServletRequestHelper servletRequestHelper() {
+        return new ServletRequestHelper();
+    }
+
+    @Bean
+    public HttpsAuthClient httpsAuthClientFactory(ServletContext servletContext, SystemPropertyHelper systemPropertyHelper, SSLContextProvider sslContextProvider) {
+        final String certFilePath = new File(servletContext.getRealPath("/WEB-INF/cert/")).getAbsolutePath();
+        return new HttpsAuthClient(certFilePath, systemPropertyHelper, sslContextProvider);
+    }
+
+    @Bean(name = "aaiRestInterface")
+    public AAIRestInterface aaiRestInterface(HttpsAuthClient httpsAuthClientFactory, ServletRequestHelper servletRequestHelper, SystemPropertyHelper systemPropertyHelper) {
+        return new AAIRestInterface(httpsAuthClientFactory, servletRequestHelper, systemPropertyHelper);
+    }
+
+    @Bean
+    public AaiClientInterface getAaiClientInterface(@Qualifier("aaiRestInterface")AAIRestInterface aaiRestInterface, PortDetailsTranslator portDetailsTranslator) {
+        return new AaiClient(aaiRestInterface, portDetailsTranslator);
+    }
+
+    @Bean
+    public PortDetailsTranslator portDetailsTranslator(){
+        return new PortDetailsTranslator();
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controller/MsoControllerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controller/MsoControllerTest.java
new file mode 100644
index 0000000..141a78b
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controller/MsoControllerTest.java
@@ -0,0 +1,130 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controller;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.osam.controllers.MsoConfig;
+import org.onap.osam.controllers.MsoController;
+import org.onap.osam.domain.mso.RequestInfo;
+import org.onap.osam.factories.MsoRequestFactory;
+import org.onap.osam.mso.rest.Request;
+import org.onap.osam.mso.rest.RequestDetails;
+import org.onap.osam.mso.rest.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.List;
+
+
+@WebAppConfiguration
+@ContextConfiguration(classes = {SystemProperties.class, MsoConfig.class})
+public class MsoControllerTest extends AbstractTestNGSpringContextTests {
+
+    @Autowired
+    MsoRequestFactory msoRequestFactory;
+
+    @Test(enabled = false)
+    public void testInstanceCreationNew() throws Exception {
+
+        RequestDetails requestDetails = msoRequestFactory.createMsoRequest("msoRequest.json");
+        MsoController msoController = new MsoController(null);
+        //TODO: make ths test to really test something
+        //ResponseEntity<String> responseEntityNew = msoController.createSvcInstanceNew(null, requestDetails);
+        ResponseEntity<String> responseEntity = msoController.createSvcInstance(null, requestDetails);
+        //Assert.assertEquals(responseEntityNew, responseEntity);
+
+    }
+
+    @Test(enabled = false)
+    public void testInstanceCreationLocalWithRest() throws Exception {
+
+        RequestDetails requestDetails = msoRequestFactory.createMsoRequest("msoRequest.json");
+        MsoController msoController = new MsoController(null);
+        ResponseEntity<String> responseEntityNew = msoController.createSvcInstance(null, requestDetails);
+        //TODO: make ths test to really test something
+//        ResponseEntity<String> responseEntityRest = msoController.createSvcInstanceNewRest(null, requestDetails);
+//
+//        Assert.assertEquals(responseEntityNew.getBody(), responseEntityRest.getBody());
+
+    }
+
+    @Test(enabled = false)
+    public void testInstanceCreation() throws Exception {
+
+        RequestDetails requestDetails = msoRequestFactory.createMsoRequest("msoRequest.json");
+        MsoController msoController = new MsoController(null);
+        ResponseEntity<String> responseEntity = msoController.createSvcInstance(null, requestDetails);
+
+
+        Assert.assertEquals(responseEntity.getBody(), "{ \"status\": 200, \"entity\": {\n" +
+                "  \"requestReferences\": {\n" +
+                "    \"instanceId\": \"ba00de9b-3c3e-4b0a-a1ad-0c5489e711fb\",\n" +
+                "    \"requestId\": \"311cc766-b673-4a50-b9c5-471f68914586\"\n" +
+                "  }\n" +
+                "}}");
+
+    }
+
+    @Test(enabled = false)
+    public void testGetOrchestrationRequestsForDashboard() throws Exception {
+        MsoController msoController = new MsoController(null);
+        List<Request> orchestrationRequestsForDashboard = msoController.getOrchestrationRequestsForDashboard();
+
+        Assert.assertEquals(orchestrationRequestsForDashboard.size(), 2);
+    }
+
+    @Test(enabled = false)
+    public void testGetManualTasksByRequestId() throws Exception {
+        MsoController msoController = new MsoController(null);
+        List<Task> orchestrationRequestsForDashboard = msoController.getManualTasksByRequestId("za1234d1-5a33-55df-13ab-12abad84e335");
+
+        Assert. assertEquals(orchestrationRequestsForDashboard.get(0).getTaskId(), "daf4dd84-b77a-42da-a051-3239b7a9392c");
+    }
+
+
+    public void testCompleteManualTask() throws Exception { // TODO not done yet
+        RequestInfo requestInfo = new RequestInfo();
+        requestInfo.setResponseValue("rollback");
+        requestInfo.setRequestorId("abc");
+        requestInfo.setSource("VID");
+        RequestDetails requestDetails = new RequestDetails();
+        requestDetails.setRequestInfo(requestInfo);
+        MsoController msoController = new MsoController(null);
+        ResponseEntity<String> responseEntity = msoController.manualTaskComplete("daf4dd84-b77a-42da-a051-3239b7a9392c", requestDetails);
+        String assertString = "{ \\\"status\\\": 200, \\\"entity\\\": {\\n\" +\n" +
+                "                \"  \\\"taskRequestReference\\\": {\\n\" +\n" +
+                "                \"     \\\"taskId\\\": \\\"daf4dd84-b77a-42da-a051-3239b7a9392c\\\"\\n\" +\n" +
+                "                \"      }\\n\" +\n" +
+                "                \"}\\n\" +\n" +
+                "                \"}";
+        Assert.assertEquals(responseEntity.getBody(), StringEscapeUtils.unescapeJava(assertString));
+    }
+
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controller/PromiseEcompRequestIdFilterTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controller/PromiseEcompRequestIdFilterTest.java
new file mode 100644
index 0000000..2c43cf4
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controller/PromiseEcompRequestIdFilterTest.java
@@ -0,0 +1,184 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controller;
+
+import com.google.common.collect.ImmutableMap;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+import org.mockito.stubbing.Answer;
+import org.onap.portalsdk.core.web.support.UserUtils;
+import org.onap.osam.filters.PromiseEcompRequestIdFilter;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.testng.annotations.Test;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+import java.util.function.Function;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.argThat;
+import static org.onap.portalsdk.core.util.SystemProperties.ECOMP_REQUEST_ID;
+
+@Test
+public class PromiseEcompRequestIdFilterTest {
+
+    private final String anotherHeader = "ANDREI_RUBLEV";
+    private final String anotherValue = "foo value";
+    private final String mixedCaseHeader = "x-ecomp-REQUESTID";
+
+    @Test
+    public void givenRequestIdHeader_headerValueNotChanged() throws IOException, ServletException {
+
+        final String someTxId = "863850e2-8545-4efd-94b8-afba5f52b3d5";
+
+        final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
+                anotherHeader, anotherValue,
+                ECOMP_REQUEST_ID, someTxId
+        );
+
+        buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, specificTxId(someTxId));
+    }
+
+    @Test
+    public void givenMixedCaseRequestIdHeader_headerValueNotChanged() throws IOException, ServletException {
+
+        final String someTxId = "729bbd8d-b0c2-4809-a794-dcccd9cda2c0";
+
+        final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
+                mixedCaseHeader, someTxId,
+                anotherHeader, anotherValue
+        );
+
+        buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, specificTxId(someTxId));
+    }
+
+    @Test
+    public void givenNoRequestIdHeader_headerValueWasGenerated() throws IOException, ServletException {
+
+        final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
+                anotherHeader, anotherValue
+        );
+
+        buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, UserUtils::getRequestId);
+    }
+
+    
+    private void buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(
+            ImmutableMap<String, String> originalRequestHeaders,
+            Function<HttpServletRequest, String> txIdExtractor
+    ) throws IOException, ServletException {
+        HttpServletRequest servletRequest = createMockedHttpServletRequest(originalRequestHeaders);
+        HttpServletResponse servletResponse = createMockedHttpServletResponse();
+
+        final FilterChain capturingFilterChain = Mockito.mock(FilterChain.class);
+
+        //////////////////
+        //
+        // doFilter() is the function under test
+        //
+        new PromiseEcompRequestIdFilter().doFilter(servletRequest, servletResponse, capturingFilterChain);
+        //
+        //////////////////
+
+        final ServletRequest capturedServletRequest = extractCapturedServletRequest(capturingFilterChain);
+        final ServletResponse capturedServletResponse = extractCapturedServletResponse(capturingFilterChain);
+        final String expectedTxId = txIdExtractor.apply((HttpServletRequest) capturedServletRequest);
+
+        assertRequestObjectHeaders(capturedServletRequest, expectedTxId);
+        assertResponseObjectHeaders(capturedServletResponse, expectedTxId);
+    }
+
+
+    private void assertRequestObjectHeaders(ServletRequest request, String expectedTxId) {
+        final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+
+        assertThat(Collections.list(httpServletRequest.getHeaderNames()),
+                containsInAnyOrder(equalToIgnoringCase(ECOMP_REQUEST_ID), equalToIgnoringCase(anotherHeader)));
+
+        assertThat(httpServletRequest.getHeader(anotherHeader), is(anotherValue));
+
+        assertThat(httpServletRequest.getHeader(ECOMP_REQUEST_ID), is(expectedTxId));
+        assertThat(httpServletRequest.getHeader(mixedCaseHeader), is(expectedTxId));
+
+        assertThat(UserUtils.getRequestId(httpServletRequest), is(expectedTxId));
+        assertThat(UserUtils.getRequestId(httpServletRequest), is(not(emptyOrNullString())));
+    }
+
+    private void assertResponseObjectHeaders(ServletResponse response, String txId) {
+        final String REQUEST_ID_HEADER_NAME_IN_RESPONSE = mixedCaseHeader + "-echo";
+        final HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+
+        assertThat("header " + REQUEST_ID_HEADER_NAME_IN_RESPONSE.toLowerCase() + " in response must be provided",
+                httpServletResponse.getHeader(REQUEST_ID_HEADER_NAME_IN_RESPONSE), is(txId));
+    }
+
+
+
+    private HttpServletRequest createMockedHttpServletRequest(Map<String, String> requestHeaders) {
+        HttpServletRequest servletRequest = Mockito.mock(HttpServletRequest.class);
+        requestHeaders.forEach((k, v) -> {
+            Mockito.when(servletRequest.getHeader(argThat(equalToIgnoringCase(k)))).thenReturn(v);
+            Mockito.when(servletRequest.getHeaders(argThat(equalToIgnoringCase(k)))).then(returnEnumerationAnswer(v));
+        });
+        Mockito.when(servletRequest.getHeaderNames()).then(returnEnumerationAnswer(requestHeaders.keySet()));
+        return servletRequest;
+    }
+
+    private HttpServletResponse createMockedHttpServletResponse() {
+        return new MockHttpServletResponse();
+    }
+
+    private static Answer<Enumeration<String>> returnEnumerationAnswer(String ... items) {
+        return returnEnumerationAnswer(Arrays.asList(items));
+    }
+
+    private static Answer<Enumeration<String>> returnEnumerationAnswer(Collection<String> items) {
+        return invocation -> Collections.enumeration(items);
+    }
+
+    private Function<HttpServletRequest, String> specificTxId(String someTxId) {
+        return r -> someTxId;
+    }
+
+    private ServletRequest extractCapturedServletRequest(FilterChain capturingFilterChain) throws IOException, ServletException {
+        ArgumentCaptor<ServletRequest> captor = ArgumentCaptor.forClass(ServletRequest.class);
+        Mockito.verify(capturingFilterChain).doFilter(captor.capture(), any());
+        return captor.getValue();
+    }
+
+    private ServletResponse extractCapturedServletResponse(FilterChain capturingFilterChain) throws IOException, ServletException {
+        ArgumentCaptor<ServletResponse> captor = ArgumentCaptor.forClass(ServletResponse.class);
+        Mockito.verify(capturingFilterChain).doFilter(any(), captor.capture());
+        return captor.getValue();
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controllers/AaiControllerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controllers/AaiControllerTest.java
new file mode 100644
index 0000000..442a5e4
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controllers/AaiControllerTest.java
@@ -0,0 +1,459 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controllers;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.Test;
+import org.onap.osam.aai.AaiResponse;
+import org.onap.osam.aai.model.AaiGetOperationalEnvironments.OperationalEnvironmentList;
+import org.onap.osam.model.VersionByInvariantIdsRequest;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.servlet.ModelAndView;
+import java.util.*;
+
+public class AaiControllerTest {
+
+    private AaiController createTestSubject() {
+        return new AaiController();
+    }
+
+    @Test
+    public void testWelcome() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        ModelAndView result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.welcome(request);
+    }
+
+    @Test
+    public void testGetTargetProvStatus() throws Exception {
+        AaiController testSubject;
+        ResponseEntity<String> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getTargetProvStatus();
+    }
+
+    @Test
+    public void testViewEditGetTenantsFromServiceType() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        String globalCustomerId = "";
+        String serviceType = "";
+        ResponseEntity<String> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.viewEditGetTenantsFromServiceType(request, globalCustomerId, serviceType);
+    }
+
+    
+    
+    
+    
+    /*@Test
+    public void testGetAicZones() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getAicZones(request);
+        } catch (Exception e) {
+        }
+    }*/
+
+    @Test
+    public void testGetAicZoneForPnf() throws Exception {
+        AaiController testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        String serviceId = "";
+        HttpServletRequest request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getAicZoneForPnf(globalCustomerId, serviceType, serviceId, request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetUserID() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getUserID(request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDoGetServices() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.doGetServices(request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetVersionByInvariantId() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        VersionByInvariantIdsRequest versions = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getVersionByInvariantId(request, versions);
+        } catch (Exception e) {
+        }
+    }
+
+    // @Test
+    // public void testAaiResponseToResponseEntity() throws Exception {
+    // AaiController testSubject;AaiResponse aaiResponseData = null;
+    // ResponseEntity<String> result;
+    //
+    // // default test
+    // }
+
+    @Test
+    public void testDoGetServiceInstance() throws Exception {
+        AaiController testSubject;
+        String serviceInstanceId = "";
+        String serviceInstanceType = "";
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.doGetServiceInstance(serviceInstanceId, serviceInstanceType);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDoGetServices_1() throws Exception {
+        AaiController testSubject;
+        String globalCustomerId = "";
+        String serviceSubscriptionId = "";
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.doGetServices(globalCustomerId, serviceSubscriptionId);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDoGetSubscriberList() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        String fullSet = "";
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.doGetSubscriberList(request, fullSet);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetOperationalEnvironments() throws Exception {
+        AaiController testSubject;
+        String operationalEnvironmentType = "";
+        String operationalEnvironmentStatus = "";
+        AaiResponse<OperationalEnvironmentList> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getOperationalEnvironments(operationalEnvironmentType, operationalEnvironmentStatus);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetFullSubscriberList() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getFullSubscriberList(request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetVnfDataByGlobalIdAndServiceType() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        String globalCustomerId = "";
+        String serviceType = "";
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getVnfDataByGlobalIdAndServiceType(request, globalCustomerId, serviceType);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDoRefreshSubscriberList() throws Exception {
+        AaiController testSubject;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.doRefreshSubscriberList();
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDoRefreshFullSubscriberList() throws Exception {
+        AaiController testSubject;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.doRefreshFullSubscriberList();
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetSubscriberDetails() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        String subscriberId = "";
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.GetSubscriberDetails(request, subscriberId);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testSearchServiceInstances() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        String subscriberId = "";
+        String instanceIdentifier = "";
+        List<String> projects = null;
+        List<String> owningEntities = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.SearchServiceInstances(request, subscriberId, instanceIdentifier, projects,
+                    owningEntities);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testViewEditGetComponentList() throws Exception {
+        AaiController testSubject;
+        String namedQueryId = "";
+        String globalCustomerId = "";
+        String serviceType = "";
+        String serviceInstance = "";
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.viewEditGetComponentList(namedQueryId, globalCustomerId, serviceType, serviceInstance);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetVnfData() throws Exception {
+        AaiController testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        String serviceInstanceId = "";
+        AaiResponse<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getVnfData(globalCustomerId, serviceType, serviceInstanceId);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testViewEditGetComponentList_1() throws Exception {
+        AaiController testSubject;
+        String namedQueryId = "";
+        String globalCustomerId = "";
+        String serviceType = "";
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.viewEditGetComponentList(namedQueryId, globalCustomerId, serviceType);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetNodeTemplateInstances() throws Exception {
+        AaiController testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        String modelVersionId = "";
+        String modelInvariantId = "";
+        String cloudRegion = "";
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getNodeTemplateInstances(globalCustomerId, serviceType, modelVersionId,
+                    modelInvariantId, cloudRegion);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetByUri() throws Exception {
+        AaiController testSubject;
+        HttpServletRequest request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getByUri(request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetSpecificConfiguration() throws Exception {
+        AaiController testSubject;
+        String configurationId = "";
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getSpecificConfiguration(configurationId);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetServiceInstanceAssociatedPnfs() throws Exception {
+        AaiController testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        String serviceInstanceId = "";
+        List<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getServiceInstanceAssociatedPnfs(globalCustomerId, serviceType, serviceInstanceId);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetSpecificPnf() throws Exception {
+        AaiController testSubject;
+        String pnfId = "";
+        ResponseEntity result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getSpecificPnf(pnfId);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetPnfInstances() throws Exception {
+        AaiController testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        String modelVersionId = "";
+        String modelInvariantId = "";
+        String cloudRegion = "";
+        String equipVendor = "";
+        String equipModel = "";
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getPnfInstances(globalCustomerId, serviceType, modelVersionId, modelInvariantId,
+                    cloudRegion, equipVendor, equipModel);
+        } catch (Exception e) {
+        }
+
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controllers/HealthCheckControllerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controllers/HealthCheckControllerTest.java
new file mode 100644
index 0000000..45edaa5
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controllers/HealthCheckControllerTest.java
@@ -0,0 +1,79 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controllers;
+
+import org.apache.log4j.BasicConfigurator;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.osam.controllers.PodDemoController.HealthStatus;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+
+public class HealthCheckControllerTest {
+
+	private PodDemoController testSubject;
+	private MockMvc mockMvc;
+
+	@Before
+	public void setUp() {
+		testSubject = new PodDemoController();
+		BasicConfigurator.configure();
+		mockMvc = MockMvcBuilders.standaloneSetup(testSubject).build();
+	}
+
+	@Test
+	public void testGetProfileCount() throws Exception {
+		String driver = "";
+		String URL = "";
+		String username = "";
+		String password = "";
+		int result;
+
+		// default test
+		result = testSubject.getProfileCount(driver, URL, username, password);
+	}
+
+	@Test
+	public void testGethealthCheckStatusforIDNS() throws Exception {
+		HealthStatus result;
+
+		// default test
+		result = testSubject.gethealthCheckStatusforIDNS();
+	}
+
+	@Test
+	public void testCommitInfoEndpoint() throws Exception {
+		mockMvc.perform(get("/commitInfo")
+				.accept(MediaType.APPLICATION_JSON))
+				.andExpect(status().isOk())
+				.andExpect(jsonPath("$.commitId").value("123987"))
+				.andExpect(jsonPath("$.commitMessageShort").value("Test short commit message"))
+				.andExpect(jsonPath("$.commitTime").value("1999-09-12T13:48:55+0200"));
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controllers/LocalWebConfig.java b/onap-enabler-be/src/test/java/org/onap/osam/controllers/LocalWebConfig.java
new file mode 100644
index 0000000..538846b
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controllers/LocalWebConfig.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controllers;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.onap.osam.aai.AaiClient;
+import org.onap.osam.aai.AaiClientInterface;
+import org.onap.osam.services.IAaiService;
+import org.onap.osam.services.AaiServiceImpl;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class LocalWebConfig {
+
+    @Bean
+    public ObjectMapper getObjectMapper() {
+        return new ObjectMapper();
+    }
+
+
+    @Bean
+    public IAaiService getAaiService() {
+        return new AaiServiceImpl();
+    }
+
+    @Bean
+    public AaiClientInterface getAaiClientInterface() {
+        return new AaiClient(null,null);
+    }
+
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controllers/LoggerControllerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controllers/LoggerControllerTest.java
new file mode 100644
index 0000000..ab6fb4a
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controllers/LoggerControllerTest.java
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controllers;
+
+import javax.ws.rs.NotAuthorizedException;
+
+import org.junit.Test;
+
+
+public class LoggerControllerTest {
+
+    private LoggerController createTestSubject() {
+        return new LoggerController();
+    }
+
+    /*@Test
+    public void testGetLog() throws Exception {
+        LoggerController testSubject;
+        String loggerName = "";
+        HttpServletRequest request = null;
+        Integer limit = 0;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getLog(loggerName, request, limit);
+    }*/
+
+   
+    @Test
+    public void testNotAuthorizedHandler() throws Exception {
+        LoggerController testSubject;
+        NotAuthorizedException e = null;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.notAuthorizedHandler(e);
+    }
+
+    /*@Test
+    public void testIoExceptionHandler() throws Exception {
+        LoggerController testSubject;
+        Exception e = null;
+        ExceptionResponse result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.ioExceptionHandler(e);
+    }*/
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controllers/MsoControllerNewTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controllers/MsoControllerNewTest.java
new file mode 100644
index 0000000..87a0fc5
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controllers/MsoControllerNewTest.java
@@ -0,0 +1,411 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controllers;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.Test;
+import org.onap.osam.mso.MsoBusinessLogicImpl;
+import org.onap.osam.mso.rest.RequestDetails;
+import org.onap.osam.mso.rest.RequestDetailsWrapper;
+import org.springframework.http.ResponseEntity;
+
+public class MsoControllerNewTest {
+
+    private MsoController createTestSubject() {
+        try {
+            return new MsoController(new MsoBusinessLogicImpl(null,null));
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    @Test
+    public void testCreateSvcInstance() throws Exception {
+        MsoController testSubject;
+        HttpServletRequest request = null;
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.createSvcInstance(request, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testCreateVnf() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        HttpServletRequest request = null;
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.createVnf(serviceInstanceId, request, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testCreateNwInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        HttpServletRequest request = null;
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.createNwInstance(serviceInstanceId, request, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testCreateVolumeGroupInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String vnfInstanceId = "";
+        HttpServletRequest request = null;
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.createVolumeGroupInstance(serviceInstanceId, vnfInstanceId, request, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testCreateVfModuleInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String vnfInstanceId = "";
+        HttpServletRequest request = null;
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.createVfModuleInstance(serviceInstanceId, vnfInstanceId, request, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testCreateConfigurationInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        HttpServletRequest request = null;
+        RequestDetailsWrapper mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.createConfigurationInstance(serviceInstanceId, request, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDeleteSvcInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        HttpServletRequest request = null;
+        RequestDetails mso_request = null;
+        String result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.deleteSvcInstance(serviceInstanceId, request, mso_request, "");
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDeleteVnf() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String vnfInstanceId = "";
+        HttpServletRequest request = null;
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.deleteVnf(serviceInstanceId, vnfInstanceId, request, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDeleteConfiguration() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String configurationId = "";
+        RequestDetailsWrapper mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.deleteConfiguration(serviceInstanceId, configurationId, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testActivateConfiguration() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String configurationId = "";
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.activateConfiguration(serviceInstanceId, configurationId, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDeactivateConfiguration() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String configurationId = "";
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.deactivateConfiguration(serviceInstanceId, configurationId, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDisablePortOnConfiguration() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String configurationId = "";
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.disablePortOnConfiguration(serviceInstanceId, configurationId, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testEnablePortOnConfiguration() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String configurationId = "";
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.enablePortOnConfiguration(serviceInstanceId, configurationId, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDeleteVfModule() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String vnfInstanceId = "";
+        String vfModuleId = "";
+        HttpServletRequest request = null;
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.deleteVfModule(serviceInstanceId, vnfInstanceId, vfModuleId, request, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDeleteVolumeGroupInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String vnfInstanceId = "";
+        String volumeGroupId = "";
+        HttpServletRequest request = null;
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.deleteVolumeGroupInstance(serviceInstanceId, vnfInstanceId, volumeGroupId, request,
+                    mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDeleteNwInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        String networkInstanceId = "";
+        HttpServletRequest request = null;
+        RequestDetails mso_request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.deleteNwInstance(serviceInstanceId, networkInstanceId, request, mso_request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetOrchestrationRequest() throws Exception {
+        MsoController testSubject;
+        String requestId = "";
+        HttpServletRequest request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getOrchestrationRequest(requestId, request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetOrchestrationRequests() throws Exception {
+        MsoController testSubject;
+        String filterString = "";
+        HttpServletRequest request = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getOrchestrationRequests(filterString, request);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testActivateServiceInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        RequestDetails requestDetails = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.activateServiceInstance(serviceInstanceId, requestDetails);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDeactivateServiceInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        RequestDetails requestDetails = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.deactivateServiceInstance(serviceInstanceId, requestDetails);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testManualTaskComplete() throws Exception {
+        MsoController testSubject;
+        String taskId = "";
+        RequestDetails requestDetails = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.manualTaskComplete(taskId, requestDetails);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testRemoveRelationshipFromServiceInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        RequestDetails requestDetails = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.removeRelationshipFromServiceInstance(serviceInstanceId, requestDetails);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testAddRelationshipToServiceInstance() throws Exception {
+        MsoController testSubject;
+        String serviceInstanceId = "";
+        RequestDetails requestDetails = null;
+        ResponseEntity<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.addRelationshipToServiceInstance(serviceInstanceId, requestDetails);
+        } catch (Exception e) {
+        }
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controllers/MsoControllerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controllers/MsoControllerTest.java
new file mode 100644
index 0000000..b25e095
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controllers/MsoControllerTest.java
@@ -0,0 +1,128 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controllers;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.osam.domain.mso.RequestInfo;
+import org.onap.osam.factories.MsoRequestFactory;
+import org.onap.osam.mso.rest.Request;
+import org.onap.osam.mso.rest.RequestDetails;
+import org.onap.osam.mso.rest.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.List;
+
+
+@WebAppConfiguration
+@ContextConfiguration(classes = {SystemProperties.class, MsoConfig.class})
+public class MsoControllerTest extends AbstractTestNGSpringContextTests {
+
+    @Autowired
+    MsoRequestFactory msoRequestFactory;
+
+    @Test(enabled = false)
+    public void testInstanceCreationNew() throws Exception {
+
+        RequestDetails requestDetails = msoRequestFactory.createMsoRequest("msoRequest.json");
+        MsoController msoController = new MsoController(null);
+        //TODO: make ths test to really test something
+        //ResponseEntity<String> responseEntityNew = msoController.createSvcInstanceNew(null, requestDetails);
+        ResponseEntity<String> responseEntity = msoController.createSvcInstance(null, requestDetails);
+        //Assert.assertEquals(responseEntityNew, responseEntity);
+
+    }
+
+    @Test(enabled = false)
+    public void testInstanceCreationLocalWithRest() throws Exception {
+
+        RequestDetails requestDetails = msoRequestFactory.createMsoRequest("msoRequest.json");
+        MsoController msoController = new MsoController(null);
+        ResponseEntity<String> responseEntityNew = msoController.createSvcInstance(null, requestDetails);
+        //TODO: make ths test to really test something
+//        ResponseEntity<String> responseEntityRest = msoController.createSvcInstanceNewRest(null, requestDetails);
+//
+//        Assert.assertEquals(responseEntityNew.getBody(), responseEntityRest.getBody());
+
+    }
+
+    @Test(enabled = false)
+    public void testInstanceCreation() throws Exception {
+
+        RequestDetails requestDetails = msoRequestFactory.createMsoRequest("msoRequest.json");
+        MsoController msoController = new MsoController(null);
+        ResponseEntity<String> responseEntity = msoController.createSvcInstance(null, requestDetails);
+
+
+        Assert.assertEquals(responseEntity.getBody(), "{ \"status\": 200, \"entity\": {\n" +
+                "  \"requestReferences\": {\n" +
+                "    \"instanceId\": \"ba00de9b-3c3e-4b0a-a1ad-0c5489e711fb\",\n" +
+                "    \"requestId\": \"311cc766-b673-4a50-b9c5-471f68914586\"\n" +
+                "  }\n" +
+                "}}");
+
+    }
+
+    @Test(enabled = false)
+    public void testGetOrchestrationRequestsForDashboard() throws Exception {
+        MsoController msoController = new MsoController(null);
+        List<Request> orchestrationRequestsForDashboard = msoController.getOrchestrationRequestsForDashboard();
+
+        Assert.assertEquals(orchestrationRequestsForDashboard.size(), 2);
+    }
+
+    @Test(enabled = false)
+    public void testGetManualTasksByRequestId() throws Exception {
+        MsoController msoController = new MsoController(null);
+        List<Task> orchestrationRequestsForDashboard = msoController.getManualTasksByRequestId("za1234d1-5a33-55df-13ab-12abad84e335");
+
+        Assert. assertEquals(orchestrationRequestsForDashboard.get(0).getTaskId(), "daf4dd84-b77a-42da-a051-3239b7a9392c");
+    }
+
+
+    public void testCompleteManualTask() throws Exception { // TODO not done yet
+        RequestInfo requestInfo = new RequestInfo();
+        requestInfo.setResponseValue("rollback");
+        requestInfo.setRequestorId("abc");
+        requestInfo.setSource("VID");
+        RequestDetails requestDetails = new RequestDetails();
+        requestDetails.setRequestInfo(requestInfo);
+        MsoController msoController = new MsoController(null);
+        ResponseEntity<String> responseEntity = msoController.manualTaskComplete("daf4dd84-b77a-42da-a051-3239b7a9392c", requestDetails);
+        String assertString = "{ \\\"status\\\": 200, \\\"entity\\\": {\\n\" +\n" +
+                "                \"  \\\"taskRequestReference\\\": {\\n\" +\n" +
+                "                \"     \\\"taskId\\\": \\\"daf4dd84-b77a-42da-a051-3239b7a9392c\\\"\\n\" +\n" +
+                "                \"      }\\n\" +\n" +
+                "                \"}\\n\" +\n" +
+                "                \"}";
+        Assert.assertEquals(responseEntity.getBody(), StringEscapeUtils.unescapeJava(assertString));
+    }
+
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controllers/PromiseEcompRequestIdFilterTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controllers/PromiseEcompRequestIdFilterTest.java
new file mode 100644
index 0000000..2b64031
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controllers/PromiseEcompRequestIdFilterTest.java
@@ -0,0 +1,184 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controllers;
+
+import com.google.common.collect.ImmutableMap;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+import org.mockito.stubbing.Answer;
+import org.onap.portalsdk.core.web.support.UserUtils;
+import org.onap.osam.filters.PromiseEcompRequestIdFilter;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.testng.annotations.Test;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+import java.util.function.Function;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.argThat;
+import static org.onap.portalsdk.core.util.SystemProperties.ECOMP_REQUEST_ID;
+
+@Test
+public class PromiseEcompRequestIdFilterTest {
+
+    private final String anotherHeader = "ANDREI_RUBLEV";
+    private final String anotherValue = "foo value";
+    private final String mixedCaseHeader = "x-ecomp-REQUESTID";
+
+    @Test
+    public void givenRequestIdHeader_headerValueNotChanged() throws IOException, ServletException {
+
+        final String someTxId = "863850e2-8545-4efd-94b8-afba5f52b3d5";
+
+        final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
+                anotherHeader, anotherValue,
+                ECOMP_REQUEST_ID, someTxId
+        );
+
+        buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, specificTxId(someTxId));
+    }
+
+    @Test
+    public void givenMixedCaseRequestIdHeader_headerValueNotChanged() throws IOException, ServletException {
+
+        final String someTxId = "729bbd8d-b0c2-4809-a794-dcccd9cda2c0";
+
+        final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
+                mixedCaseHeader, someTxId,
+                anotherHeader, anotherValue
+        );
+
+        buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, specificTxId(someTxId));
+    }
+
+    @Test
+    public void givenNoRequestIdHeader_headerValueWasGenerated() throws IOException, ServletException {
+
+        final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
+                anotherHeader, anotherValue
+        );
+
+        buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, UserUtils::getRequestId);
+    }
+
+    
+    private void buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(
+            ImmutableMap<String, String> originalRequestHeaders,
+            Function<HttpServletRequest, String> txIdExtractor
+    ) throws IOException, ServletException {
+        HttpServletRequest servletRequest = createMockedHttpServletRequest(originalRequestHeaders);
+        HttpServletResponse servletResponse = createMockedHttpServletResponse();
+
+        final FilterChain capturingFilterChain = Mockito.mock(FilterChain.class);
+
+        //////////////////
+        //
+        // doFilter() is the function under test
+        //
+        new PromiseEcompRequestIdFilter().doFilter(servletRequest, servletResponse, capturingFilterChain);
+        //
+        //////////////////
+
+        final ServletRequest capturedServletRequest = extractCapturedServletRequest(capturingFilterChain);
+        final ServletResponse capturedServletResponse = extractCapturedServletResponse(capturingFilterChain);
+        final String expectedTxId = txIdExtractor.apply((HttpServletRequest) capturedServletRequest);
+
+        assertRequestObjectHeaders(capturedServletRequest, expectedTxId);
+        assertResponseObjectHeaders(capturedServletResponse, expectedTxId);
+    }
+
+
+    private void assertRequestObjectHeaders(ServletRequest request, String expectedTxId) {
+        final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+
+        assertThat(Collections.list(httpServletRequest.getHeaderNames()),
+                containsInAnyOrder(equalToIgnoringCase(ECOMP_REQUEST_ID), equalToIgnoringCase(anotherHeader)));
+
+        assertThat(httpServletRequest.getHeader(anotherHeader), is(anotherValue));
+
+        assertThat(httpServletRequest.getHeader(ECOMP_REQUEST_ID), is(expectedTxId));
+        assertThat(httpServletRequest.getHeader(mixedCaseHeader), is(expectedTxId));
+
+        assertThat(UserUtils.getRequestId(httpServletRequest), is(expectedTxId));
+        assertThat(UserUtils.getRequestId(httpServletRequest), is(not(emptyOrNullString())));
+    }
+
+    private void assertResponseObjectHeaders(ServletResponse response, String txId) {
+        final String REQUEST_ID_HEADER_NAME_IN_RESPONSE = mixedCaseHeader + "-echo";
+        final HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+
+        assertThat("header " + REQUEST_ID_HEADER_NAME_IN_RESPONSE.toLowerCase() + " in response must be provided",
+                httpServletResponse.getHeader(REQUEST_ID_HEADER_NAME_IN_RESPONSE), is(txId));
+    }
+
+
+
+    private HttpServletRequest createMockedHttpServletRequest(Map<String, String> requestHeaders) {
+        HttpServletRequest servletRequest = Mockito.mock(HttpServletRequest.class);
+        requestHeaders.forEach((k, v) -> {
+            Mockito.when(servletRequest.getHeader(argThat(equalToIgnoringCase(k)))).thenReturn(v);
+            Mockito.when(servletRequest.getHeaders(argThat(equalToIgnoringCase(k)))).then(returnEnumerationAnswer(v));
+        });
+        Mockito.when(servletRequest.getHeaderNames()).then(returnEnumerationAnswer(requestHeaders.keySet()));
+        return servletRequest;
+    }
+
+    private HttpServletResponse createMockedHttpServletResponse() {
+        return new MockHttpServletResponse();
+    }
+
+    private static Answer<Enumeration<String>> returnEnumerationAnswer(String ... items) {
+        return returnEnumerationAnswer(Arrays.asList(items));
+    }
+
+    private static Answer<Enumeration<String>> returnEnumerationAnswer(Collection<String> items) {
+        return invocation -> Collections.enumeration(items);
+    }
+
+    private Function<HttpServletRequest, String> specificTxId(String someTxId) {
+        return r -> someTxId;
+    }
+
+    private ServletRequest extractCapturedServletRequest(FilterChain capturingFilterChain) throws IOException, ServletException {
+        ArgumentCaptor<ServletRequest> captor = ArgumentCaptor.forClass(ServletRequest.class);
+        Mockito.verify(capturingFilterChain).doFilter(captor.capture(), any());
+        return captor.getValue();
+    }
+
+    private ServletResponse extractCapturedServletResponse(FilterChain capturingFilterChain) throws IOException, ServletException {
+        ArgumentCaptor<ServletResponse> captor = ArgumentCaptor.forClass(ServletResponse.class);
+        Mockito.verify(capturingFilterChain).doFilter(any(), captor.capture());
+        return captor.getValue();
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controllers/VidControllerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controllers/VidControllerTest.java
new file mode 100644
index 0000000..4b02752
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controllers/VidControllerTest.java
@@ -0,0 +1,211 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controllers;
+
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import net.javacrumbs.jsonunit.JsonAssert;
+//import org.apache.commons.io.IOUtils;
+//import org.onap.vid.asdc.AsdcCatalogException;
+//import org.onap.vid.asdc.AsdcClient;
+//import org.onap.vid.asdc.parser.ToscaParserImpl2;
+//import org.onap.vid.model.*;
+//import org.onap.portalsdk.core.util.SystemProperties;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.mock.web.MockServletContext;
+//import org.springframework.test.context.ContextConfiguration;
+//import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
+//import org.springframework.test.context.web.WebAppConfiguration;
+//import org.testng.Assert;
+//import org.testng.annotations.Test;
+//
+//import static org.onap.vid.testUtils.TestUtils.assertJsonStringEqualsIgnoreNulls;
+//
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.nio.file.Path;
+//import java.util.Map;
+//import java.util.UUID;
+//
+////import org.junit.Assert;
+////import org.junit.Ignore;
+////import org.junit.Test;
+////import org.junit.runner.RunWith;
+////import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+//
+//@ContextConfiguration(classes = {LocalWebConfig.class, SystemProperties.class})
+////@RunWith(SpringJUnit4ClassRunner.class)
+//@WebAppConfiguration
+//
+//public class VidControllerTest extends AbstractTestNGSpringContextTests {
+//
+//    @Autowired
+//    MockServletContext context;
+//    @Autowired
+//    private AsdcClient asdcClient;
+//    private ToscaParserImpl2 p2 = new ToscaParserImpl2();
+//    private ObjectMapper om = new ObjectMapper();
+//
+//
+//    @Test
+//    public void assertEqualsBetweenServices() throws Exception {
+//        for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
+//            Service expectedService = mockHelper.getNewServiceModel().getService();
+//            Service actualService = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getService();
+//            assertJsonStringEqualsIgnoreNulls(om.writeValueAsString(expectedService), om.writeValueAsString(actualService));
+//        }
+//    }
+//
+////    @Test
+////    public void assertEqualBetweenObjects() throws Exception {
+////        for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
+////            final Path csarPath = getCsarPath(mockHelper.getUuid());
+////            System.out.println("Comparing for csar " + csarPath);
+////            ServiceModel actualServiceModel = p2.makeServiceModel(csarPath, getServiceByUuid(mockHelper.getUuid()));
+////            assertJsonStringEqualsIgnoreNulls(om.writeValueAsString(mockHelper.getNewServiceModel()), om.writeValueAsString(actualServiceModel));
+////        }
+////    }
+//
+////    @Test
+////    public void assertEqualsBetweenNetworkNodes() throws Exception {
+////        for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
+////            Map<String, Network> expectedNetworksMap = mockHelper.getNewServiceModel().getNetworks();
+////            Map<String, Network> actualNetworksMap = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getNetworks();
+////            for (Map.Entry<String, Network> entry : expectedNetworksMap.entrySet()) {
+////                Network expectedNetwork = entry.getValue();
+////                Network actualNetwork = actualNetworksMap.get(entry.getKey());
+////                Assert.assertEquals(expectedNetwork.getModelCustomizationName(), actualNetwork.getModelCustomizationName());
+////                verifyBaseNodeProperties(expectedNetwork, actualNetwork);
+////                compareProperties(expectedNetwork.getProperties(), actualNetwork.getProperties());
+////            }
+////        }
+////    }
+//
+//    //Because we are not supporting the old flow, the JSON are different by definition.
+//    @Test
+//    public void assertEqualsBetweenVnfsOfTosca() throws Exception {
+//        for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
+//            Map<String, VNF> expectedVnfsMap = mockHelper.getNewServiceModel().getVnfs();
+//            Map<String, VNF> actualVnfsMap = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getVnfs();
+//            for (Map.Entry<String, VNF> entry : expectedVnfsMap.entrySet()) {
+//                VNF expectedVnf = entry.getValue();
+//                VNF actualVnf = actualVnfsMap.get(entry.getKey());
+//                //need to uncomment these after 1806 merge
+//                //verifyBaseNodeProperties(expectedVnf, actualVnf);
+//                Assert.assertEquals(expectedVnf.getModelCustomizationName(), actualVnf.getModelCustomizationName());
+//                //compareProperties(expectedVnf.getProperties(), actualVnf.getProperties());
+//                //assertJsonStringEqualsIgnoreNulls(om.writeValueAsString(expectedVnf), om.writeValueAsString(actualVnf));
+//            }
+//        }
+//    }
+//
+//    @Test
+//    public void assertEqualsBetweenVolumeGroups() throws Exception {
+//        for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
+//            Map<String, VolumeGroup> actualVolumeGroups = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getVolumeGroups();
+//            Map<String, VolumeGroup> expectedVolumeGroups = mockHelper.getNewServiceModel().getVolumeGroups();
+//            JsonAssert.assertJsonEquals(actualVolumeGroups, expectedVolumeGroups);
+//        }
+//    }
+//
+//    @Test
+//    public void assertEqualsBetweenVfModules() throws Exception {
+//        for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
+//            Map<String, VfModule> actualVfModules = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getVfModules();
+//            Map<String, VfModule> expectedVfModules = mockHelper.getNewServiceModel().getVfModules();
+//            //need to uncomment after 1906 merge
+//            //JsonAssert.assertJsonEquals(actualVfModules, expectedVfModules);
+//        }
+//    }
+//
+//    /*@Test
+//    public void assertEqualsBetweenPolicyConfigurationNodes() throws Exception {
+//        for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
+//            Map<String, PortMirroringConfig> actualConfigurations = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getConfigurations();
+//            Map<String, PortMirroringConfig> expectedConfigurations = mockHelper.getNewServiceModel().getConfigurations();
+//            JsonAssert.assertJsonEquals(actualConfigurations, expectedConfigurations);
+//        }
+//    }*/
+//
+//    @Test
+//    public void assertEqualsBetweenServiceProxyNodes() throws Exception {
+//        for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
+//            Map<String, ServiceProxy> actualServiceProxies = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getServiceProxies();
+//            Map<String, ServiceProxy> expectedServiceProxies = mockHelper.getNewServiceModel().getServiceProxies();
+//            JsonAssert.assertJsonEquals(actualServiceProxies, expectedServiceProxies);
+//        }
+//    }
+//
+//    private void verifyBaseNodeProperties(Node expectedNode, Node actualNode) {
+//        Assert.assertEquals(expectedNode.getName(), actualNode.getName());
+//        Assert.assertEquals(expectedNode.getCustomizationUuid(), actualNode.getCustomizationUuid());
+//        Assert.assertEquals(expectedNode.getDescription(), actualNode.getDescription());
+//        Assert.assertEquals(expectedNode.getInvariantUuid(), actualNode.getInvariantUuid());
+//        Assert.assertEquals(expectedNode.getUuid(), actualNode.getUuid());
+//        Assert.assertEquals(expectedNode.getVersion(), actualNode.getVersion());
+//    }
+//
+//    private void compareProperties(Map<String, String> expectedProperties, Map<String, String> actualProperties) {
+//        for (Map.Entry<String, String> property : expectedProperties.entrySet()) {
+//            String expectedValue = property.getValue();
+//            String key = property.getKey();
+//            String actualValue = actualProperties.get(key);
+//            Assert.assertEquals(expectedValue, actualValue);
+//        }
+//    }
+//
+//    private ToscaParserMockHelper[] getExpectedServiceModel() throws IOException {
+//        ToscaParserMockHelper[] mockHelpers = {
+//                new ToscaParserMockHelper(Constants.vlUuid, Constants.vlFilePath),
+//                new ToscaParserMockHelper(Constants.vfUuid, Constants.vfFilePath),
+//                new ToscaParserMockHelper(Constants.configurationUuid, Constants.configurationFilePath),
+//        };
+//        for (ToscaParserMockHelper mockHelper : mockHelpers) {
+//            InputStream jsonFile = VidControllerTest.class.getClassLoader().getResourceAsStream(mockHelper.getFilePath());
+//            String expectedJsonAsString = IOUtils.toString(jsonFile);
+//            NewServiceModel newServiceModel1 = om.readValue(expectedJsonAsString, NewServiceModel.class);
+//            mockHelper.setNewServiceModel(newServiceModel1);
+//        }
+//        return mockHelpers;
+//    }
+//
+//    private Path getCsarPath(String uuid) throws AsdcCatalogException {
+//        return asdcClient.getServiceToscaModel(UUID.fromString(uuid));
+//    }
+//
+//    private org.onap.vid.asdc.beans.Service getServiceByUuid(String uuid) throws AsdcCatalogException {
+//        return asdcClient.getService(UUID.fromString(uuid));
+//    }
+//
+//    public class Constants {
+//        public static final String configurationUuid = "ee6d61be-4841-4f98-8f23-5de9da846ca7";
+//        public static final String configurationFilePath = "policy-configuration-csar.JSON";
+//        static final String vfUuid = "48a52540-8772-4368-9cdb-1f124ea5c931";
+//        static final String vlUuid = "cb49608f-5a24-4789-b0f7-2595473cb997";
+//        //        public static final String PNFUuid = "68101369-6f08-4e99-9a28-fa6327d344f3";
+//        static final String vfFilePath = "vf-csar.JSON";
+//        static final String vlFilePath = "vl-csar.JSON";
+////        public static final String PNFFilePath = "/Users/Oren/Git/Att/vid_internal/vid-app-common/src/main/resources/pnf.csar";
+//
+//    }
+//
+//}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/controllers/ViewEditSubControllerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/controllers/ViewEditSubControllerTest.java
new file mode 100644
index 0000000..3067eef
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/controllers/ViewEditSubControllerTest.java
@@ -0,0 +1,68 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.controllers;
+//package org.onap.vid.controller;
+//
+//import javax.servlet.http.HttpServletRequest;
+//
+//import org.junit.Test;
+//import org.springframework.web.servlet.ModelAndView;
+//
+//public class ViewEditSubControllerTest {
+//
+//	private ViewEditSubController createTestSubject() {
+//		return new ViewEditSubController();
+//	}
+//
+//	@Test
+//	public void testWelcome() throws Exception {
+//		ViewEditSubController testSubject;
+//		HttpServletRequest request = null;
+//		ModelAndView result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.welcome(request);
+//	}
+//
+//
+//	@Test
+//	public void testGetViewName() throws Exception {
+//		ViewEditSubController testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getViewName();
+//	}
+//
+//	@Test
+//	public void testSetViewName() throws Exception {
+//		ViewEditSubController testSubject;
+//		String viewName = "";
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		testSubject.setViewName(viewName);
+//	}
+//}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/dao/FnAppDoaImplTest.java b/onap-enabler-be/src/test/java/org/onap/osam/dao/FnAppDoaImplTest.java
new file mode 100644
index 0000000..c958a2f
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/dao/FnAppDoaImplTest.java
@@ -0,0 +1,119 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.dao;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class FnAppDoaImplTest {
+
+    private FnAppDoaImpl createTestSubject() {
+        return new FnAppDoaImpl();
+    }
+
+    @Test
+    public void testGetConnection() throws Exception {
+        String driver2 = "";
+        String url = "";
+        String username = "";
+        String password = "";
+        Connection result;
+
+        // test 1
+        url = null;
+        username = null;
+        password = null;
+        result = FnAppDoaImpl.getConnection(driver2, url, username);
+        Assert.assertEquals(null, result);
+
+        // test 2
+        url = "";
+        username = null;
+        password = null;
+        result = FnAppDoaImpl.getConnection(driver2, url, username);
+        Assert.assertEquals(null, result);
+
+        // test 3
+        username = null;
+        url = null;
+        password = null;
+        result = FnAppDoaImpl.getConnection(driver2, url, username);
+        Assert.assertEquals(null, result);
+
+        // test 4
+        username = "";
+        url = null;
+        password = null;
+        result = FnAppDoaImpl.getConnection(driver2, url, username);
+        Assert.assertEquals(null, result);
+
+        // test 5
+        password = null;
+        url = null;
+        username = null;
+        result = FnAppDoaImpl.getConnection(driver2, url, username);
+        Assert.assertEquals(null, result);
+
+        // test 6
+        password = "";
+        url = null;
+        username = null;
+        result = FnAppDoaImpl.getConnection(driver2, url, username);
+        Assert.assertEquals(null, result);
+    }
+
+    @Test
+    public void testCleanup() throws Exception {
+        ResultSet rs = null;
+        PreparedStatement st = null;
+
+        // test 1
+        rs = null;
+        FnAppDoaImpl.cleanup(rs, st, null);
+
+        // test 2
+        st = null;
+        FnAppDoaImpl.cleanup(rs, st, null);
+
+        // test 3
+        FnAppDoaImpl.cleanup(rs, st, null);
+    }
+
+    @Test
+    public void testGetProfileCount() throws Exception {
+        FnAppDoaImpl testSubject;
+        String driver = "";
+        String URL = "";
+        String username = "";
+        String password = "";
+        int result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getProfileCount(driver, URL, username, password);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/factories/MsoRequestFactoryTest.java b/onap-enabler-be/src/test/java/org/onap/osam/factories/MsoRequestFactoryTest.java
new file mode 100644
index 0000000..60e7d2b
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/factories/MsoRequestFactoryTest.java
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.factories;
+
+import org.junit.Test;
+
+public class MsoRequestFactoryTest {
+
+    private MsoRequestFactory createTestSubject() {
+        return new MsoRequestFactory();
+    }
+
+    @Test
+    public void testCreateMsoRequest() throws Exception {
+        MsoRequestFactory testSubject;
+        String path = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.createMsoRequest(path);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/integrationTest/AaiIntegrationTest.java b/onap-enabler-be/src/test/java/org/onap/osam/integrationTest/AaiIntegrationTest.java
new file mode 100644
index 0000000..16b4f1c
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/integrationTest/AaiIntegrationTest.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.integrationTest;
+
+import org.onap.osam.aai.AaiClientInterface;
+import org.onap.osam.aai.AaiResponse;
+import org.onap.osam.aai.model.GetServiceModelsByDistributionStatusResponse;
+import org.onap.osam.aai.model.Result;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+
+@ContextConfiguration(classes = {SystemProperties.class})
+
+
+@WebAppConfiguration
+public class AaiIntegrationTest extends AbstractTestNGSpringContextTests {
+
+
+    @Autowired
+    AaiClientInterface aaiClient;
+
+    @Test(enabled = false)
+    public void testGetServiceModelsFromAai() {
+        AaiResponse<GetServiceModelsByDistributionStatusResponse> serviceModelsByDistributionStatusResponse = aaiClient.getServiceModelsByDistributionStatus();
+        GetServiceModelsByDistributionStatusResponse response = serviceModelsByDistributionStatusResponse.getT();
+        for(Result result: response.getResults()){
+            Assert.assertNotNull(result.getModel().getModelInvariantId());
+            Assert.assertNotNull(result.getModel().getModelVers().getModelVer().get(0).getModelVersionId());
+            Assert.assertNotNull(result.getModel().getModelVers().getModelVer().get(0).getModelName());
+            Assert.assertNotNull(result.getModel().getModelVers().getModelVer().get(0).getModelVersion());
+        }
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/job/command/JobCommandFactoryTest.java b/onap-enabler-be/src/test/java/org/onap/osam/job/command/JobCommandFactoryTest.java
new file mode 100644
index 0000000..9c82b45
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/job/command/JobCommandFactoryTest.java
@@ -0,0 +1,90 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.job.command;
+
+import com.google.common.collect.ImmutableMap;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.osam.job.Job;
+import org.onap.osam.job.JobCommand;
+import org.onap.osam.job.JobType;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class JobCommandFactoryTest {
+
+    private JobCommandFactory jobCommandFactory;
+
+    @Mock
+    private Job job;
+
+    @Mock
+    private JobCommand mockCommand;
+
+    @BeforeMethod
+    public void initMocks() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @BeforeMethod
+    public void setUp() {
+        jobCommandFactory = new JobCommandFactory(any -> mockCommand);
+    }
+
+    @DataProvider
+    public Object[][] jobTypes() {
+        return Arrays.stream(
+                JobType.values()
+        ).map(v -> new Object[]{v}).collect(Collectors.toList()).toArray(new Object[][]{});
+
+    }
+
+    @Test(dataProvider = "jobTypes")
+    public void givenJob_createCommandCallsTheInitAndReturnsTheInstance(JobType jobType) {
+
+        final UUID uuid = UUID.randomUUID();
+        final Map<String, Object> data = ImmutableMap.of("foo", "bar");
+
+        when(job.getType()).thenReturn(jobType);
+        when(job.getUuid()).thenReturn(uuid);
+        when(job.getData()).thenReturn(data);
+
+        final JobCommand command = jobCommandFactory.toCommand(job);
+
+        verify(mockCommand).init(uuid, data);
+
+        assertThat(command, equalTo(mockCommand));
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/job/impl/JobWorkerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/job/impl/JobWorkerTest.java
new file mode 100644
index 0000000..0c4dc2d
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/job/impl/JobWorkerTest.java
@@ -0,0 +1,123 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.job.impl;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.commons.lang3.RandomUtils;
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.hamcrest.Matcher;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.osam.job.*;
+import org.onap.osam.job.command.HttpCallCommand;
+import org.onap.osam.job.command.JobCommandFactory;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.util.Map;
+import java.util.UUID;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class JobWorkerTest {
+
+    @InjectMocks
+    private JobWorker jobWorker = new JobWorker();
+
+    @Mock
+    private JobCommandFactory jobCommandFactory;
+
+    private final JobCommand jobCommand = mock(JobCommand.class);
+    private Job jobUnderTest;
+    private JobAdapter.AsyncJobRequest originalData;
+    private JobType originalType;
+
+    @BeforeMethod
+    public void initMocks() {
+        MockitoAnnotations.initMocks(this);
+
+        when(jobCommandFactory.toCommand(any())).thenReturn(jobCommand);
+
+        originalData = new JobAdapter.AsyncJobRequest() {
+            public final Map datum = ImmutableMap.of("some", "data");
+            public final String foobar = "aux";
+        };
+
+        originalType = JobType.ServiceInstantiation;
+        jobUnderTest = new JobAdapterImpl().createJob(
+                originalType,
+                originalData,
+                UUID.randomUUID(),
+                "my user id",
+                RandomUtils.nextInt()
+        );
+    }
+
+    @Test
+    public void executeJobAndStepToNext_givenNull_onlyStatusModified() {
+
+        assertNextJobAfterExecuteJob(null, new String[]{"status"}, allOf(
+                hasProperty("status", is(Job.JobStatus.STOPPED)),
+                hasProperty("data", hasEntry("request", originalData)),
+                hasProperty("type", is(originalType)))
+        );
+    }
+
+    @Test
+    public void executeJobAndStepToNext_givenNextJob_jobDataIsModified() {
+
+        final Job.JobStatus nextStatus = Job.JobStatus.IN_PROGRESS;
+
+        final UUID jobUuid = UUID.randomUUID();
+        final NextCommand nextCommand = new NextCommand(nextStatus, new HttpCallCommand("my strange url", jobUuid));
+
+        String[] excludedFields = {"status", "data", "type"};
+
+        assertNextJobAfterExecuteJob(nextCommand, excludedFields, allOf(
+                hasProperty("status", is(nextStatus)),
+                hasProperty("data", is(nextCommand.getCommand().getData())),
+                hasProperty("type", is(nextCommand.getCommand().getType())))
+        );
+    }
+
+    private void assertNextJobAfterExecuteJob(NextCommand nextCommand, String[] excludedFields, Matcher<Job> jobMatcher) {
+        when(jobCommand.call()).thenReturn(nextCommand);
+
+        String jobBefore = new ReflectionToStringBuilder(jobUnderTest, ToStringStyle.SHORT_PREFIX_STYLE).setExcludeFieldNames(excludedFields).toString();
+
+        ////// FUNCTION UNDER TEST /////
+        Job nextJob = jobWorker.executeJobAndGetNext(jobUnderTest);
+        ////////////////////////////////
+
+        String jobAfter = new ReflectionToStringBuilder(nextJob, ToStringStyle.SHORT_PREFIX_STYLE).setExcludeFieldNames(excludedFields).toString();
+
+        assertThat(nextJob, jobMatcher);
+        assertThat(jobAfter, equalTo(jobBefore));
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/logging/VidLoggerAspectTest.java b/onap-enabler-be/src/test/java/org/onap/osam/logging/VidLoggerAspectTest.java
new file mode 100644
index 0000000..c10ef96
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/logging/VidLoggerAspectTest.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.logging;
+
+import org.junit.Test;
+
+
+public class VidLoggerAspectTest {
+
+    private VidLoggerAspect createTestSubject() {
+        return new VidLoggerAspect();
+    }
+
+    @Test
+    public void testVidControllers() throws Exception {
+        VidLoggerAspect testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.vidControllers();
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/CategoryParameterOptionTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/CategoryParameterOptionTest.java
new file mode 100644
index 0000000..1e3b6d5
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/CategoryParameterOptionTest.java
@@ -0,0 +1,211 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CategoryParameterOptionTest {
+
+    private CategoryParameterOption createTestSubject() {
+        return new CategoryParameterOption();
+    }
+
+    @Test
+    public void testGetId() throws Exception {
+        CategoryParameterOption testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getId();
+    }
+
+    @Test
+    public void testSetId() throws Exception {
+        CategoryParameterOption testSubject;
+        Long id = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setId(id);
+    }
+
+    @Test
+    public void testGetAppId() throws Exception {
+        CategoryParameterOption testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAppId();
+    }
+
+    @Test
+    public void testSetAppId() throws Exception {
+        CategoryParameterOption testSubject;
+        String appId = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setAppId(appId);
+    }
+
+    @Test
+    public void testGetName() throws Exception {
+        CategoryParameterOption testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getName();
+    }
+
+    @Test
+    public void testSetName() throws Exception {
+        CategoryParameterOption testSubject;
+        String name = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setName(name);
+    }
+
+    @Test
+    public void testGetCategoryParameter() throws Exception {
+        CategoryParameterOption testSubject;
+        CategoryParameter result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getCategoryParameter();
+    }
+
+    @Test
+    public void testSetCategoryParameter() throws Exception {
+        CategoryParameterOption testSubject;
+        CategoryParameter categoryParameter = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setCategoryParameter(categoryParameter);
+    }
+
+    @Test
+    public void testGetCreated() throws Exception {
+        CategoryParameterOption testSubject;
+        Date result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getCreated();
+    }
+
+    @Test
+    public void testGetModified() throws Exception {
+        CategoryParameterOption testSubject;
+        Date result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getModified();
+    }
+
+    @Test
+    public void testGetCreatedId() throws Exception {
+        CategoryParameterOption testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getCreatedId();
+    }
+
+    @Test
+    public void testGetModifiedId() throws Exception {
+        CategoryParameterOption testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getModifiedId();
+    }
+
+    @Test
+    public void testGetAuditUserId() throws Exception {
+        CategoryParameterOption testSubject;
+        Serializable result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAuditUserId();
+    }
+
+    @Test
+    public void testGetRowNum() throws Exception {
+        CategoryParameterOption testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRowNum();
+    }
+
+    @Test
+    public void testGetAuditTrail() throws Exception {
+        CategoryParameterOption testSubject;
+        Set result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAuditTrail();
+    }
+
+    @Test
+    public void testEquals() throws Exception {
+        CategoryParameterOption testSubject;
+        Object o = null;
+        boolean result;
+
+        // test 1
+        testSubject = createTestSubject();
+        o = null;
+        result = testSubject.equals(o);
+        Assert.assertEquals(false, result);
+    }
+
+    @Test
+    public void testHashCode() throws Exception {
+        CategoryParameterOption testSubject;
+        int result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.hashCode();
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/CategoryParameterTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/CategoryParameterTest.java
new file mode 100644
index 0000000..3b57f06
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/CategoryParameterTest.java
@@ -0,0 +1,207 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
+import org.junit.Test;
+
+public class CategoryParameterTest {
+
+    private CategoryParameter createTestSubject() {
+        return new CategoryParameter();
+    }
+
+    @Test
+    public void testGetFamily() throws Exception {
+        CategoryParameter testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getFamily();
+    }
+
+    @Test
+    public void testSetFamily() throws Exception {
+        CategoryParameter testSubject;
+        String family = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setFamily(family);
+    }
+
+    @Test
+    public void testGetId() throws Exception {
+        CategoryParameter testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getId();
+    }
+
+    @Test
+    public void testGetCreated() throws Exception {
+        CategoryParameter testSubject;
+        Date result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getCreated();
+    }
+
+    @Test
+    public void testGetModified() throws Exception {
+        CategoryParameter testSubject;
+        Date result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getModified();
+    }
+
+    @Test
+    public void testGetCreatedId() throws Exception {
+        CategoryParameter testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getCreatedId();
+    }
+
+    @Test
+    public void testGetModifiedId() throws Exception {
+        CategoryParameter testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getModifiedId();
+    }
+
+    @Test
+    public void testGetName() throws Exception {
+        CategoryParameter testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getName();
+    }
+
+    @Test
+    public void testSetName() throws Exception {
+        CategoryParameter testSubject;
+        String name = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setName(name);
+    }
+
+    @Test
+    public void testGetAuditUserId() throws Exception {
+        CategoryParameter testSubject;
+        Serializable result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAuditUserId();
+    }
+
+    @Test
+    public void testGetRowNum() throws Exception {
+        CategoryParameter testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRowNum();
+    }
+
+    @Test
+    public void testGetAuditTrail() throws Exception {
+        CategoryParameter testSubject;
+        Set result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAuditTrail();
+    }
+
+    @Test
+    public void testGetOptions() throws Exception {
+        CategoryParameter testSubject;
+        Set<CategoryParameterOption> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getOptions();
+    }
+
+    @Test
+    public void testSetOptions() throws Exception {
+        CategoryParameter testSubject;
+        Set<CategoryParameterOption> options = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setOptions(options);
+    }
+
+    @Test
+    public void testAddOption() throws Exception {
+        CategoryParameter testSubject;
+        CategoryParameterOption option = null;
+        boolean result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.addOption(option);
+    }
+
+    @Test
+    public void testIsIdSupported() throws Exception {
+        CategoryParameter testSubject;
+        boolean result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.isIdSupported();
+    }
+
+    @Test
+    public void testSetIdSupported() throws Exception {
+        CategoryParameter testSubject;
+        boolean idSupported = false;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setIdSupported(idSupported);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/ExceptionResponseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/ExceptionResponseTest.java
new file mode 100644
index 0000000..68e2ae1
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/ExceptionResponseTest.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import org.junit.Test;
+
+public class ExceptionResponseTest {
+
+    private ExceptionResponse createTestSubject() {
+        return new ExceptionResponse();
+    }
+
+    @Test
+    public void testGetException() throws Exception {
+        ExceptionResponse testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getException();
+    }
+
+    @Test
+    public void testSetException() throws Exception {
+        ExceptionResponse testSubject;
+        String exception = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setException(exception);
+    }
+
+    @Test
+    public void testGetMessage() throws Exception {
+        ExceptionResponse testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getMessage();
+    }
+
+    @Test
+    public void testSetMessage() throws Exception {
+        ExceptionResponse testSubject;
+        String message = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setMessage(message);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/ListOfErrorsResponseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/ListOfErrorsResponseTest.java
new file mode 100644
index 0000000..0fcd266
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/ListOfErrorsResponseTest.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import java.util.List;
+
+import org.junit.Test;
+
+public class ListOfErrorsResponseTest {
+
+    private ListOfErrorsResponse createTestSubject() {
+        return new ListOfErrorsResponse();
+    }
+
+    @Test
+    public void testGetErrors() throws Exception {
+        ListOfErrorsResponse testSubject;
+        List<String> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getErrors();
+    }
+
+    @Test
+    public void testSetErrors() throws Exception {
+        ListOfErrorsResponse testSubject;
+        List<String> errors = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setErrors(errors);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/ModelUtilTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/ModelUtilTest.java
new file mode 100644
index 0000000..0c7fcb1
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/ModelUtilTest.java
@@ -0,0 +1,70 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class ModelUtilTest {
+
+	private ModelUtil createTestSubject() {
+		return new ModelUtil();
+	}
+
+	
+	@Test
+	public void testGetTags() throws Exception {
+		String[] namespaces;
+		String constantValue = "test";
+		String[] result;
+
+		// test 1
+		namespaces = null;
+		result = ModelUtil.getTags(namespaces, constantValue);
+		Assert.assertNull(result);
+
+		// test 2
+		namespaces = new String[] { "" };
+		result = ModelUtil.getTags(namespaces, constantValue);
+		Assert.assertArrayEquals(new String[] { constantValue }, result);
+	}
+
+	
+	@Test
+	public void testIsType() throws Exception {
+		String type = "a";
+		String[] tags;
+		boolean result;
+
+		// test 1
+		tags = null;
+		result = ModelUtil.isType(type, tags);
+		Assert.assertEquals(false, result);
+
+		// test 2
+		tags = new String[] { "a" };
+		result = ModelUtil.isType(type, tags);
+		Assert.assertEquals(true, result);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/RequestReferencesContainerTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/RequestReferencesContainerTest.java
new file mode 100644
index 0000000..83611c5
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/RequestReferencesContainerTest.java
@@ -0,0 +1,76 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import java.util.Map;
+
+import org.junit.Test;
+import org.onap.osam.domain.mso.RequestReferences;
+
+public class RequestReferencesContainerTest {
+
+    private RequestReferencesContainer createTestSubject() {
+        return new RequestReferencesContainer(new RequestReferences());
+    }
+
+    @Test
+    public void testGetAdditionalProperties() throws Exception {
+        RequestReferencesContainer testSubject;
+        Map<String, Object> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAdditionalProperties();
+    }
+
+    @Test
+    public void testSetAdditionalProperty() throws Exception {
+        RequestReferencesContainer testSubject;
+        String name = "";
+        Object value = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setAdditionalProperty(name, value);
+    }
+
+    @Test
+    public void testGetRequestReferences() throws Exception {
+        RequestReferencesContainer testSubject;
+        RequestReferences result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRequestReferences();
+    }
+
+    @Test
+    public void testToString() throws Exception {
+        RequestReferencesContainer testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.toString();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/ResultTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/ResultTest.java
new file mode 100644
index 0000000..9b1f3f4
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/ResultTest.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import org.junit.Test;
+
+public class ResultTest {
+
+    private Result createTestSubject() {
+        return new Result("");
+    }
+
+    @Test
+    public void testGetResult() throws Exception {
+        Result testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getResult();
+    }
+
+    @Test
+    public void testSetResult() throws Exception {
+        Result testSubject;
+        String result = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setResult(result);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/ServiceInstanceSearchResultTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/ServiceInstanceSearchResultTest.java
new file mode 100644
index 0000000..bfb3e4b
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/ServiceInstanceSearchResultTest.java
@@ -0,0 +1,204 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import org.junit.Test;
+
+public class ServiceInstanceSearchResultTest {
+
+    private ServiceInstanceSearchResult createTestSubject() {
+        return new ServiceInstanceSearchResult();
+    }
+
+    @Test
+    public void testGetServiceInstanceId() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getServiceInstanceId();
+    }
+
+    @Test
+    public void testSetServiceInstanceId() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String serviceInstanceId = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setServiceInstanceId(serviceInstanceId);
+    }
+
+    @Test
+    public void testGetGlobalCustomerId() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getGlobalCustomerId();
+    }
+
+    @Test
+    public void testSetGlobalCustomerId() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String globalCustomerId = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setGlobalCustomerId(globalCustomerId);
+    }
+
+    @Test
+    public void testGetServiceType() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getServiceType();
+    }
+
+    @Test
+    public void testSetServiceType() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String serviceType = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setServiceType(serviceType);
+    }
+
+    @Test
+    public void testGetServiceInstanceName() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getServiceInstanceName();
+    }
+
+    @Test
+    public void testSetServiceInstanceName() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String serviceInstanceName = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setServiceInstanceName(serviceInstanceName);
+    }
+
+    @Test
+    public void testGetSubscriberName() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getSubscriberName();
+    }
+
+    @Test
+    public void testSetSubscriberName() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String subscriberName = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setSubscriberName(subscriberName);
+    }
+
+    @Test
+    public void testGetAaiModelInvariantId() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAaiModelInvariantId();
+    }
+
+    @Test
+    public void testSetAaiModelInvariantId() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String aaiModelInvariantId = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setAaiModelInvariantId(aaiModelInvariantId);
+    }
+
+    @Test
+    public void testGetAaiModelVersionId() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAaiModelVersionId();
+    }
+
+    @Test
+    public void testSetAaiModelVersionId() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        String aaiModelVersionId = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setAaiModelVersionId(aaiModelVersionId);
+    }
+
+    @Test
+    public void testGetIsPermitted() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        boolean result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getIsPermitted();
+    }
+
+    @Test
+    public void testSetIsPermitted() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        boolean isPermitted = false;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setIsPermitted(isPermitted);
+    }
+
+    @Test
+    public void testEquals() throws Exception {
+        ServiceInstanceSearchResult testSubject;
+        Object other = null;
+        boolean result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.equals(other);
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/VNFDaoTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/VNFDaoTest.java
new file mode 100644
index 0000000..1182a0f
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/VNFDaoTest.java
@@ -0,0 +1,176 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
+import org.junit.Test;
+
+public class VNFDaoTest {
+
+    private VNFDao createTestSubject() {
+        return new VNFDao();
+    }
+
+    @Test
+    public void testGetId() throws Exception {
+        VNFDao testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getId();
+    }
+
+    @Test
+    public void testGetCreated() throws Exception {
+        VNFDao testSubject;
+        Date result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getCreated();
+    }
+
+    @Test
+    public void testGetModified() throws Exception {
+        VNFDao testSubject;
+        Date result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getModified();
+    }
+
+    @Test
+    public void testGetCreatedId() throws Exception {
+        VNFDao testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getCreatedId();
+    }
+
+    @Test
+    public void testGetModifiedId() throws Exception {
+        VNFDao testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getModifiedId();
+    }
+
+    @Test
+    public void testGetAuditUserId() throws Exception {
+        VNFDao testSubject;
+        Serializable result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAuditUserId();
+    }
+
+    @Test
+    public void testGetRowNum() throws Exception {
+        VNFDao testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRowNum();
+    }
+
+    @Test
+    public void testGetAuditTrail() throws Exception {
+        VNFDao testSubject;
+        Set result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAuditTrail();
+    }
+
+    @Test
+    public void testGetVnfUUID() throws Exception {
+        VNFDao testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getVnfUUID();
+    }
+
+    @Test
+    public void testGetVnfInvariantUUID() throws Exception {
+        VNFDao testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getVnfInvariantUUID();
+    }
+
+    @Test
+    public void testSetVnfUUID() throws Exception {
+        VNFDao testSubject;
+        String vnfUUID = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setVnfUUID(vnfUUID);
+    }
+
+    @Test
+    public void testSetVnfInvariantUUID() throws Exception {
+        VNFDao testSubject;
+        String vnfInvariantUUID = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setVnfInvariantUUID(vnfInvariantUUID);
+    }
+
+    @Test
+    public void testGetWorkflows() throws Exception {
+        VNFDao testSubject;
+        Set<VidWorkflow> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getWorkflows();
+    }
+
+    @Test
+    public void testSetWorkflows() throws Exception {
+        VNFDao testSubject;
+        Set<VidWorkflow> workflows = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setWorkflows(workflows);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/VidWorkflowTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/VidWorkflowTest.java
new file mode 100644
index 0000000..6a85cd4
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/VidWorkflowTest.java
@@ -0,0 +1,136 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+
+import org.junit.Test;
+
+public class VidWorkflowTest {
+
+    private VidWorkflow createTestSubject() {
+        return new VidWorkflow();
+    }
+
+    @Test
+    public void testGetId() throws Exception {
+        VidWorkflow testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getId();
+    }
+
+    @Test
+    public void testGetCreated() throws Exception {
+        VidWorkflow testSubject;
+        Date result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getCreated();
+    }
+
+    @Test
+    public void testGetModified() throws Exception {
+        VidWorkflow testSubject;
+        Date result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getModified();
+    }
+
+    @Test
+    public void testGetCreatedId() throws Exception {
+        VidWorkflow testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getCreatedId();
+    }
+
+    @Test
+    public void testGetModifiedId() throws Exception {
+        VidWorkflow testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getModifiedId();
+    }
+
+    @Test
+    public void testGetAuditUserId() throws Exception {
+        VidWorkflow testSubject;
+        Serializable result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAuditUserId();
+    }
+
+    @Test
+    public void testGetRowNum() throws Exception {
+        VidWorkflow testSubject;
+        Long result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRowNum();
+    }
+
+    @Test
+    public void testGetAuditTrail() throws Exception {
+        VidWorkflow testSubject;
+        Set result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAuditTrail();
+    }
+
+    @Test
+    public void testGetWokflowName() throws Exception {
+        VidWorkflow testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getWokflowName();
+    }
+
+    @Test
+    public void testSetWokflowName() throws Exception {
+        VidWorkflow testSubject;
+        String wokflowName = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setWokflowName(wokflowName);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/WorkflowTest.java b/onap-enabler-be/src/test/java/org/onap/osam/model/WorkflowTest.java
new file mode 100644
index 0000000..10a66c5
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/WorkflowTest.java
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import java.util.Collection;
+
+import org.junit.Test;
+
+public class WorkflowTest {
+
+	private Workflow createTestSubject() {
+		return new Workflow();
+	}
+
+	@Test
+	public void testGetId() throws Exception {
+		Workflow testSubject;
+		int result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getId();
+	}
+
+	@Test
+	public void testGetWorkflowName() throws Exception {
+		Workflow testSubject;
+		String result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getWorkflowName();
+	}
+
+	@Test
+	public void testGetVnfNames() throws Exception {
+		Workflow testSubject;
+		Collection<String> result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getVnfNames();
+	}
+
+	@Test
+	public void testSetId() throws Exception {
+		Workflow testSubject;
+		int id = 0;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setId(id);
+	}
+
+	@Test
+	public void testSetWorkflowName() throws Exception {
+		Workflow testSubject;
+		String workflowName = "";
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setWorkflowName(workflowName);
+	}
+
+	@Test
+	public void testSetVnfName() throws Exception {
+		Workflow testSubject;
+		Collection<String> vnfNames = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setVnfName(vnfNames);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/model/oeModel.java b/onap-enabler-be/src/test/java/org/onap/osam/model/oeModel.java
new file mode 100644
index 0000000..46757b3
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/model/oeModel.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.model;
+
+import java.util.List;
+import java.util.Map;
+
+public class oeModel {
+    public Map<String,List<Map<String,String>>> categoryParameters;
+}
+
+
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoBusinessLogicImplTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoBusinessLogicImplTest.java
new file mode 100644
index 0000000..743d218
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoBusinessLogicImplTest.java
@@ -0,0 +1,195 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.osam.controllers.MsoController;
+import org.onap.osam.mso.rest.RequestDetails;
+import org.onap.osam.mso.rest.RequestDetailsWrapper;
+import org.onap.osam.properties.Features;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.testng.Assert;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import org.togglz.core.manager.FeatureManager;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.onap.osam.controllers.MsoController.SVC_INSTANCE_ID;
+import static org.onap.osam.mso.MsoBusinessLogicImpl.validateEndpointPath;
+
+@ContextConfiguration(classes = {SystemProperties.class})
+@WebAppConfiguration
+public class MsoBusinessLogicImplTest extends AbstractTestNGSpringContextTests {
+
+    private static final String SERVICE_INSTANCE_ID = "1";
+    private static final String VNF_INSTANCE_ID = "1";
+    private static final String EXPECTED_SCALE_OUT_PATH = "/serviceInstantiation/v7/serviceInstances/1/vnfs/1/vfModules/scaleOut";
+    private static final Path PATH_TO_NOT_PROCESSED_SCALE_OUT_REQUEST = Paths.get("src", "test", "resources", "payload_jsons", "scaleOutVfModulePayload.json");
+    private static final Path PATH_TO_FINAL_SCALE_OUT_REQUEST = Paths.get("src", "test", "resources", "payload_jsons", "scaleOutVfModulePayloadToMso.json");
+    private static final ObjectMapper OBJECT_MAPPER=new ObjectMapper();
+
+    @InjectMocks
+    private MsoBusinessLogicImpl msoBusinessLogic;
+
+    @Mock
+    private FeatureManager featureManagerMock;
+
+    @Mock
+    private MsoInterface msoInterfaceMock;
+
+
+    @BeforeTest
+    public void initMocks() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void validateEndpointPath_endPointIsNotEmptyAndVaild_returnProperty() {
+        System.setProperty("TestEnv", "123");
+        String foundEndPoint = validateEndpointPath("TestEnv");
+        Assert.assertEquals("123", foundEndPoint);
+    }
+
+    @Test(expectedExceptions = RuntimeException.class)
+    public void validateEndpointPath_endPointIsNull_throwRuntimeException() {
+        validateEndpointPath("NotExists");
+    }
+
+    @Test(expectedExceptions = RuntimeException.class)
+    public void validateEndpointPath_endPointIsNotEmptyButDoesntExists_throwRuntimeException() {
+        System.setProperty("EmptyEndPoint", "");
+        validateEndpointPath("EmptyEndPoint");
+    }
+
+
+    //@Test(dataProvider = "unAssignOrDeleteParams")
+    public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOffOrUnAssignFlagIsFalse(boolean isAssignFlag, String status) {
+        Mockito.reset(msoInterfaceMock);
+        String endpoint = validateEndpointPath(isAssignFlag ? MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE : MsoProperties.MSO_REST_API_SVC_INSTANCE);
+        RequestDetails requestDetails = new RequestDetails();
+
+        when(featureManagerMock.isActive(Features.FLAG_UNASSIGN_SERVICE)).thenReturn(isAssignFlag);
+
+        msoBusinessLogic.deleteSvcInstance(requestDetails, "tempId", status);
+
+        verify(msoInterfaceMock).deleteSvcInstance(requestDetails, endpoint + "/tempId");
+    }
+
+    @DataProvider
+    public Object[][] unAssignOrDeleteParams() {
+        return new Object[][]{
+                {Boolean.FALSE, "active"},
+                {Boolean.FALSE, "created"},
+                {Boolean.TRUE, "Active"},
+                {Boolean.TRUE, "unexpected-status"},
+        };
+    }
+
+    //@Test(dataProvider = "unAssignStatus")
+    public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOnAndUnAssignFlagIsTrue(String status) {
+        Mockito.reset(msoInterfaceMock);
+        // in the test Features.FLAG_UNASSIGN_SERVICE is active so the endpoint should be MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE
+        String endpoint = validateEndpointPath(MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE);
+        RequestDetails requestDetails = new RequestDetails();
+
+        when(featureManagerMock.isActive(Features.FLAG_UNASSIGN_SERVICE)).thenReturn(true);
+
+        msoBusinessLogic.deleteSvcInstance(requestDetails, "tempId", status);
+
+        verify(msoInterfaceMock).unassignSvcInstance(requestDetails, endpoint + "/tempId/unassign");
+    }
+
+    @DataProvider
+    public Object[][] unAssignStatus() {
+        return new Object[][]{
+                {"Created"},
+                {"Pendingdelete"},
+                {"pending-Delete"},
+                {"Assigned"}
+        };
+    }
+
+    @Test
+    public void deleteVnf_verifyEndPointPathConstructing() {
+        String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
+        RequestDetails requestDetails = new RequestDetails();
+
+        String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, "serviceInstanceTempId");
+
+        msoBusinessLogic.deleteVnf(requestDetails, "serviceInstanceTempId", "vnfInstanceTempId");
+        verify(msoInterfaceMock).deleteVnf(requestDetails, vnf_endpoint + "/vnfInstanceTempId");
+    }
+
+    @Test
+    public void deleteVfModule_verifyEndPointPathConstructing() {
+        String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
+        RequestDetails requestDetails = new RequestDetails();
+
+        String vf__modules_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, "serviceInstanceTempId").replaceFirst(MsoController.VNF_INSTANCE_ID, "vnfInstanceTempId");
+
+        msoBusinessLogic.deleteVfModule(requestDetails, "serviceInstanceTempId", "vnfInstanceTempId", "vfModuleTempId");
+        verify(msoInterfaceMock).deleteVfModule(requestDetails, vf__modules_endpoint + "/vfModuleTempId");
+    }
+
+
+    //@Test - fails after code cutting - TBD later
+    public void shouldSendProperScaleOutRequest() throws IOException {
+        ArgumentCaptor<RequestDetailsWrapper> requestDetailsWrapperArgumentCaptor = ArgumentCaptor.forClass(RequestDetailsWrapper.class);
+        RequestDetails requestDetails = getScaleOutRequest();
+        RequestDetailsWrapper expectedRequestWrapper = getExpectedRequestWrapper();
+
+        msoBusinessLogic.scaleOutVfModuleInstance(requestDetails, SERVICE_INSTANCE_ID, VNF_INSTANCE_ID);
+
+        verify(msoInterfaceMock).scaleOutVFModuleInstance(requestDetailsWrapperArgumentCaptor.capture(), eq(EXPECTED_SCALE_OUT_PATH));
+        RequestDetailsWrapper actual = requestDetailsWrapperArgumentCaptor.getAllValues().get(0);
+
+        assertThat(expectedRequestWrapper.requestDetails).isEqualTo(actual.requestDetails);
+    }
+
+    private RequestDetails getScaleOutRequest() throws IOException {
+        return OBJECT_MAPPER.readValue(PATH_TO_NOT_PROCESSED_SCALE_OUT_REQUEST.toFile(), RequestDetails.class);
+    }
+
+    private RequestDetailsWrapper getExpectedRequestWrapper() throws IOException {
+        return OBJECT_MAPPER.readValue(PATH_TO_FINAL_SCALE_OUT_REQUEST.toFile(), new TypeReference<RequestDetailsWrapper>() {
+        });
+    }
+}
+
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoBusinessLogicTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoBusinessLogicTest.java
new file mode 100644
index 0000000..b1347d0
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoBusinessLogicTest.java
@@ -0,0 +1,80 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.osam.mso.rest.RequestDetails;
+import org.onap.osam.mso.rest.RequestDetailsWrapper;
+import org.testng.annotations.Test;
+
+import java.net.URL;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+@RunWith(MockitoJUnitRunner.class)
+public class MsoBusinessLogicTest {
+
+    @InjectMocks
+    private MsoBusinessLogicImpl msoBusinessLogic;
+
+    @Mock
+    private MsoInterface msoClient;
+
+    @Test
+    public void testCreateInstance() throws Exception {
+        String instanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d";
+        final RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
+        requestDetailsWrapper.requestDetails = setRequestDetails("mso_request_create_configuration.json");
+        Mockito.doReturn(getOkResponse(instanceId)).when(msoClient).createConfigurationInstance(requestDetailsWrapper, "/serviceInstances/v6/3f93c7cb-2fd0-4557-9514-e189b7b04f9d/configurations");
+        final MsoResponseWrapper msoResponseWrapper = msoBusinessLogic.createConfigurationInstance(requestDetailsWrapper, instanceId);
+
+        assertNotNull(msoResponseWrapper);
+        assertEquals(202, msoResponseWrapper.getStatus());
+    }
+
+    private MsoResponseWrapper getOkResponse(String instanceId){
+        MsoResponseWrapper responseWrapper = new MsoResponseWrapper();
+        String entity = " \"body\": {\n" +
+                "      \"requestReferences\": {\n" +
+                "        \"instanceId\": \""+instanceId+"\",\n" +
+                "        \"requestId\": \"b6dc9806-b094-42f7-9386-a48de8218ce8\"\n" +
+                "      }";
+        responseWrapper.setEntity(entity);
+        responseWrapper.setStatus(202);
+        return responseWrapper;
+    }
+
+    private RequestDetails setRequestDetails(String bodyFileName)throws Exception {
+        final URL resource = this.getClass().getResource("/payload_jsons/" + bodyFileName);
+        ObjectMapper mapper = new ObjectMapper();
+        RequestDetails requestDetails = mapper.readValue(resource, RequestDetails.class);
+        return requestDetails;
+
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoResponseWrapper2Test.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoResponseWrapper2Test.java
new file mode 100644
index 0000000..4ec0f98
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoResponseWrapper2Test.java
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso;
+
+import org.junit.Test;
+
+public class MsoResponseWrapper2Test {
+
+    private MsoResponseWrapper2 createTestSubject() {
+        return new MsoResponseWrapper2(new RestObject());
+    }
+
+    @Test
+    public void testGetStatus() throws Exception {
+        MsoResponseWrapper2 testSubject;
+        int result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getStatus();
+    }
+
+    @Test
+    public void testGetResponse() throws Exception {
+        MsoResponseWrapper2 testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getResponse();
+    }
+
+    @Test
+    public void testGetEntity() throws Exception {
+        MsoResponseWrapper2 testSubject;
+        Object result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getEntity();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoResponseWrapperTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoResponseWrapperTest.java
new file mode 100644
index 0000000..9124d5f
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoResponseWrapperTest.java
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso;
+
+import org.junit.Test;
+
+public class MsoResponseWrapperTest {
+
+    private MsoResponseWrapper createTestSubject() {
+        return new MsoResponseWrapper();
+    }
+
+    @Test
+    public void testGetEntity() throws Exception {
+        MsoResponseWrapper testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getEntity();
+    }
+
+    @Test
+    public void testGetStatus() throws Exception {
+        MsoResponseWrapper testSubject;
+        int result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getStatus();
+    }
+
+    @Test
+    public void testSetStatus() throws Exception {
+        MsoResponseWrapper testSubject;
+        int v = 0;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setStatus(v);
+    }
+
+    @Test
+    public void testSetEntity() throws Exception {
+        MsoResponseWrapper testSubject;
+        String v = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setEntity(v);
+    }
+
+    @Test
+    public void testToString() throws Exception {
+        MsoResponseWrapper testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.toString();
+    }
+
+    @Test
+    public void testGetResponse() throws Exception {
+        MsoResponseWrapper testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getResponse();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoUtilTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoUtilTest.java
new file mode 100644
index 0000000..93230e6
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/MsoUtilTest.java
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MsoUtilTest {
+
+	private MsoUtil createTestSubject() {
+		return new MsoUtil();
+	}
+
+	@Test
+	public void testWrapResponse() throws Exception {
+		String body = "";
+		int statusCode = 0;
+		MsoResponseWrapper result;
+
+		// default test
+		result = MsoUtil.wrapResponse(body, statusCode);
+	}
+
+
+	@Test
+	public void testWrapResponse_2() throws Exception {
+		RestObject<String> rs = null;
+		MsoResponseWrapper result;
+
+		// test 1
+		result = MsoUtil.wrapResponse(rs);
+		Assert.assertNotNull(result);
+	}
+
+	@Test
+	public void testConvertPojoToString() throws Exception {
+		String result;
+
+		// test 1
+		result = MsoUtil.convertPojoToString(null);
+		Assert.assertEquals("", result);
+	}
+
+	@Test
+	public void testMain() throws Exception {
+		String[] args = new String[] { "" };
+
+		// default test
+		MsoUtil.main(args);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/RestMsoImplementationTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/RestMsoImplementationTest.java
new file mode 100644
index 0000000..03f8446
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/RestMsoImplementationTest.java
@@ -0,0 +1,124 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso;
+
+import org.junit.Test;
+
+import javax.ws.rs.core.MultivaluedHashMap;
+
+public class RestMsoImplementationTest {
+
+    private RestMsoImplementation createTestSubject() {
+        return new RestMsoImplementation();
+    }
+
+    @Test
+    public void testInitMsoClient() throws Exception {
+        RestMsoImplementation testSubject;
+        MultivaluedHashMap<String, Object> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.initMsoClient();
+        } catch (Exception e) {
+        }
+    }
+
+
+    @Test
+    public void testGetForObject() throws Exception {
+        RestMsoImplementation testSubject;
+        String sourceID = "";
+        String path = "";
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            testSubject.GetForObject(sourceID, path, null);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDelete() throws Exception {
+        RestMsoImplementation testSubject;
+        String sourceID = "";
+        String path = "";
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            testSubject.Delete(null, null, sourceID, path, null);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testPostForObject() throws Exception {
+        RestMsoImplementation testSubject;
+        Object requestDetails = null;
+        String sourceID = "";
+        String path = "";
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            testSubject.PostForObject(requestDetails, sourceID, path, null);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+
+
+    @Test
+    public void testPrepareClient() throws Exception {
+        RestMsoImplementation testSubject;
+        String path = "";
+        String methodName = "";
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            testSubject.prepareClient(path, methodName);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+
+
+
+    // @Test
+    // public void testInitMsoClient() throws Exception {
+    // RestMsoImplementation testSubject;
+    //
+    // // default test
+    // testSubject = createTestSubject();
+    // testSubject.initMsoClient();
+    // }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/RestObjectTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/RestObjectTest.java
new file mode 100644
index 0000000..60420d2
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/RestObjectTest.java
@@ -0,0 +1,100 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso;
+
+import org.junit.Test;
+
+public class RestObjectTest {
+
+    private RestObject createTestSubject() {
+        return new RestObject();
+    }
+
+    @Test
+    public void testSet() throws Exception {
+        RestObject testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.set(null);
+    }
+
+    @Test
+    public void testGet() throws Exception {
+        RestObject testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.get();
+    }
+
+    @Test
+    public void testSetStatusCode() throws Exception {
+        RestObject testSubject;
+        int v = 0;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setStatusCode(v);
+    }
+
+    @Test
+    public void testGetStatusCode() throws Exception {
+        RestObject testSubject;
+        int result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getStatusCode();
+    }
+
+    @Test
+    public void testGetRaw() throws Exception {
+        RestObject testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRaw();
+    }
+
+    @Test
+    public void testSetRaw() throws Exception {
+        RestObject testSubject;
+        String rawT = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setRaw(rawT);
+    }
+
+    @Test
+    public void testToString() throws Exception {
+        RestObject testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.toString();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/AsyncRequestStatusTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/AsyncRequestStatusTest.java
new file mode 100644
index 0000000..3d94f03
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/AsyncRequestStatusTest.java
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import org.junit.Test;
+
+
+public class AsyncRequestStatusTest {
+
+	private AsyncRequestStatus createTestSubject() {
+		return new AsyncRequestStatus();
+	}
+
+	
+	@Test
+	public void testToString() throws Exception {
+		AsyncRequestStatus testSubject;
+		String result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.toString();
+	}
+
+	
+	@Test
+	public void testHashCode() throws Exception {
+		AsyncRequestStatus testSubject;
+		int result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.hashCode();
+	}
+
+	
+	@Test
+	public void testEquals() throws Exception {
+		AsyncRequestStatus testSubject;
+		Object other = null;
+		boolean result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.equals(other);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/MsoRestClientNewTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/MsoRestClientNewTest.java
new file mode 100644
index 0000000..16024bb
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/MsoRestClientNewTest.java
@@ -0,0 +1,471 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+package org.onap.osam.mso.rest;
+
+import com.xebialabs.restito.server.StubServer;
+import org.glassfish.grizzly.http.util.HttpStatus;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.osam.client.SyncRestClient;
+import org.onap.osam.controllers.MsoController;
+import org.onap.osam.mso.MsoInterface;
+import org.onap.osam.mso.MsoProperties;
+import org.onap.osam.mso.MsoResponseWrapper;
+import org.onap.osam.mso.MsoResponseWrapperInterface;
+import org.onap.osam.mso.RestObject;
+import org.springframework.test.context.ContextConfiguration;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Properties;
+import java.util.UUID;
+
+import static org.onap.osam.controllers.MsoController.SVC_INSTANCE_ID;
+import static org.onap.osam.controllers.MsoController.VNF_INSTANCE_ID;
+
+@ContextConfiguration(classes = {SystemProperties.class})
+public class MsoRestClientNewTest {
+
+    private static StubServer server;
+    private static StubServer securedServer;
+    private static Properties props = new Properties();
+    private static String msoCreateServiceInstanceJson;
+    private static String msoScaleOutVfModule;
+    private final static String CREATE_INSTANCE_RESPONSE_STR =
+            "{\"requestReferences\":{\"instanceId\":\"baa13544-0e95-4644-9565-9a198a29a294\","
+                    + "\"requestId\":\"a42a1a35-3d63-4629-bbe0-4989fa7414cb\"}}";
+    private final static String SERVICE_INSTANCE_ID = "12345";
+    private static final String SAMPLE_VNF_INSTANCE_ID = "111";
+    private static final String SAMPLE_VNF_MODULE_ID = "987";
+    private static final String SAMPLE_NETWORK_INSTANCE_ID = "666";
+    private static final String SAMPLE_CONFIGURATION_ID = "997";
+    private static final String SAMPLE_REQUEST_ID = "7777";
+
+
+    @BeforeClass
+    public static void start() throws IOException {
+        server = new StubServer().run();
+        securedServer = new StubServer().secured().run();
+
+        Path resourceDirectory =
+                Paths.get("src", "test", "resources", "WEB-INF", "conf", "system.properties");
+        try (InputStream is = Files.newInputStream(resourceDirectory)) {
+            props.load(is);
+        }
+
+        Path msoServiceInstantiationJsonFilePath =
+                Paths.get("src", "test", "resources", "payload_jsons", "mso_service_instantiation.json");
+
+        Path scaleOutJsonFilePath = Paths.get("src", "test", "resources", "payload_jsons", "scaleOutVfModulePayloadToMso.json");
+        msoCreateServiceInstanceJson =
+                String.join("\n", Files.readAllLines(msoServiceInstantiationJsonFilePath));
+        msoScaleOutVfModule = String.join("\n", Files.readAllLines(scaleOutJsonFilePath));
+
+    }
+
+    @AfterClass
+    public static void stop() {
+        server.stop();
+        securedServer.stop();
+    }
+
+
+    private String baseUrl() {
+        return String.format("http://localhost:%d", server.getPort());
+    }
+
+    @Test
+    public void testCreateSvcInstance() throws Exception {
+        String endpoint = props.getProperty(MsoProperties.MSO_REST_API_CONFIGURATIONS);
+        endpoint = endpoint.replace(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                endpoint,
+                HttpStatus.ACCEPTED_202,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createSvcInstance);
+        }
+    }
+
+    @Test
+    public void testCreateVnf() throws Exception {
+        String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE);
+        endpoint = endpoint.replace(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                endpoint,
+                HttpStatus.ACCEPTED_202,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+
+            closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createVnf);
+        }
+    }
+
+    @Test
+    public void testCreateNwInstance() throws Exception {
+        String endpoint = props.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
+        String nw_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                nw_endpoint,
+                HttpStatus.ACCEPTED_202,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createNwInstance);
+        }
+    }
+
+    @Test
+    public void testCreateVolumeGroupInstance() throws Exception {
+        String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
+        String vnf_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+        vnf_endpoint = vnf_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                vnf_endpoint,
+                HttpStatus.ACCEPTED_202,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createVolumeGroupInstance);
+        }
+    }
+
+    @Test
+    public void testCreateVfModuleInstance() throws Exception {
+        String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
+        String partial_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+        String vf_module_endpoint =
+                partial_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
+
+
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                vf_module_endpoint,
+                HttpStatus.ACCEPTED_202,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createVfModuleInstance);
+        }
+    }
+
+    @Test
+    public void testCreateConfigurationInstance() throws Exception {
+        MsoRestClientNew testSubject;
+        RequestDetailsWrapper requestDetails = null;
+        String endpoint = "";
+        MsoResponseWrapper result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.createConfigurationInstance(requestDetails, endpoint);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDeleteSvcInstance() throws Exception {
+        String endpoint = props.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
+        endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+
+
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                endpoint,
+                HttpStatus.NO_CONTENT_204,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteSvcInstance);
+        }
+    }
+
+    @Test
+    public void testDeleteVnf() throws Exception {
+        String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE);
+        endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                endpoint,
+                HttpStatus.NO_CONTENT_204,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteVnf);
+        }
+    }
+
+    @Test
+    public void testDeleteVfModule() throws Exception {
+        String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
+        String part_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+        String vf_modules_endpoint = part_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
+        String delete_vf_endpoint = vf_modules_endpoint + '/' + SAMPLE_VNF_MODULE_ID;
+
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                delete_vf_endpoint,
+                HttpStatus.NO_CONTENT_204,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteVfModule);
+        }
+    }
+
+    @Test
+    public void testDeleteVolumeGroupInstance() throws Exception {
+        String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
+        String svc_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+        String vnf_endpoint = svc_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
+        String delete_volume_group_endpoint = vnf_endpoint + "/" + SAMPLE_VNF_MODULE_ID;
+
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                delete_volume_group_endpoint,
+                HttpStatus.NO_CONTENT_204,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteVolumeGroupInstance);
+        }
+    }
+
+    @Test
+    public void testDeleteNwInstance() throws Exception {
+        String endpoint = props.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
+        String svc_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+        String delete_nw_endpoint = svc_endpoint + "/" + SAMPLE_NETWORK_INSTANCE_ID;
+
+        try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+            server,
+            delete_nw_endpoint,
+            HttpStatus.NO_CONTENT_204,
+            CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteNwInstance);
+        }
+    }
+
+    @Test
+    public void testGetOrchestrationRequest() {
+        String p = props.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQ);
+        String path = p + "/" + SAMPLE_REQUEST_ID;
+
+        try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+            server,
+            path,
+            HttpStatus.OK_200,
+            CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executeGet(msoRestClient()::getOrchestrationRequest);
+        }
+    }
+
+    @Test
+    public void testGetManualTasks() {
+        String p = props.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQ);
+        String path = p + "/" + UUID.randomUUID();
+
+        try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+            server,
+            path,
+            HttpStatus.OK_200,
+            CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executeGet(msoRestClient()::getManualTasks);
+        }
+    }
+
+    @Test
+    public void testGetOrchestrationRequestsForDashboard() throws Exception {
+        MsoRestClientNew testSubject;
+        String t = "";
+        String sourceId = "";
+        String endpoint = "";
+        RestObject restObject = null;
+        MsoResponseWrapper result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getOrchestrationRequestsForDashboard(t, sourceId, endpoint, restObject);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetManualTasksByRequestId() throws Exception {
+        MsoRestClientNew testSubject;
+        String t = "";
+        String sourceId = "";
+        String endpoint = "";
+        RestObject restObject = null;
+        MsoResponseWrapper result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getManualTasksByRequestId(t, sourceId, endpoint, restObject);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testCompleteManualTask() throws Exception {
+        MsoRestClientNew testSubject;
+        RequestDetails requestDetails = null;
+        String t = "";
+        String sourceId = "";
+        String endpoint = "";
+        RestObject restObject = null;
+        MsoResponseWrapper result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.completeManualTask(requestDetails, t, sourceId, endpoint, restObject);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testDeleteConfiguration() throws Exception {
+        MsoRestClientNew testSubject;
+        RequestDetailsWrapper requestDetails = null;
+        String pmc_endpoint = "";
+        MsoResponseWrapper result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.deleteConfiguration(requestDetails, pmc_endpoint);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testSetConfigurationActiveStatus() throws Exception {
+        String endpoint = "/serviceInstances/v5/<service_instance_id>/configurations/<configuration_id>";
+        endpoint = endpoint.replace(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+        endpoint = endpoint.replace(MsoController.CONFIGURATION_ID, SAMPLE_CONFIGURATION_ID);
+        endpoint = endpoint + "/activate";
+
+        try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+            server,
+            endpoint,
+            HttpStatus.ACCEPTED_202,
+            CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::setConfigurationActiveStatus);
+        }
+    }
+
+    @Test
+    public void testSetPortOnConfigurationStatus() throws Exception {
+        MsoRestClientNew testSubject;
+        RequestDetails request = null;
+        String path = "";
+        MsoResponseWrapper result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.setPortOnConfigurationStatus(request, path);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testChangeManagementUpdate() throws Exception {
+        MsoRestClientNew testSubject;
+        RequestDetailsWrapper requestDetails = null;
+        String endpoint = "";
+        MsoResponseWrapperInterface result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.changeManagementUpdate(requestDetails, endpoint);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testSetServiceInstanceStatus() throws Exception {
+        MsoRestClientNew testSubject;
+        RequestDetails requestDetails = null;
+        String t = "";
+        String sourceId = "";
+        String endpoint = "";
+        RestObject<String> restObject = null;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            testSubject.setServiceInstanceStatus(requestDetails, t, sourceId, endpoint, restObject);
+        } catch (Exception e) {
+        }
+    }
+
+    @Test
+    public void testRemoveRelationshipFromServiceInstance() throws Exception {
+        String serviceEndpoint = props.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
+        String removeRelationshipsPath = serviceEndpoint + "/" + SERVICE_INSTANCE_ID + "/removeRelationships";
+
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                removeRelationshipsPath,
+                HttpStatus.ACCEPTED_202,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::removeRelationshipFromServiceInstance);
+        }
+    }
+
+    @Test
+    public void testAddRelationshipToServiceInstance() throws Exception {
+        MsoRestClientNew testSubject;
+        RequestDetails requestDetails = null;
+        String addRelationshipsPath = "";
+        MsoResponseWrapper result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.addRelationshipToServiceInstance(requestDetails, addRelationshipsPath);
+        } catch (Exception e) {
+        }
+    }
+    @Test
+    public void testScaleOutVfModule() throws IOException {
+        String serviceEndpoint = props.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_SCALE_OUT);
+        String partial_endpoint = serviceEndpoint.replaceFirst(SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+        String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
+        try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+                server,
+                vf_module_endpoint,
+                HttpStatus.ACCEPTED_202,
+                CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+            closure.executePostCall(msoScaleOutVfModule, msoRestClient()::scaleOutVFModuleInstance);
+        }
+
+    }
+
+    private MsoRestClientNew msoRestClient() {
+        return new MsoRestClientNew(new SyncRestClient(MsoInterface.objectMapper()), baseUrl());
+    }
+
+    private MsoRestClientNew createTestSubject() {
+        return new MsoRestClientNew(null, "");
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/MsoRestClientTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/MsoRestClientTest.java
new file mode 100644
index 0000000..ffe65cc
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/MsoRestClientTest.java
@@ -0,0 +1,93 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+package org.onap.osam.mso.rest;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.json.JSONObject;
+import org.junit.Assert;
+import org.onap.osam.client.SyncRestClient;
+import org.onap.osam.domain.mso.CloudConfiguration;
+import org.onap.osam.domain.mso.ModelInfo;
+import org.onap.osam.domain.mso.RequestInfo;
+import org.onap.osam.domain.mso.RequestParameters;
+import org.onap.osam.mso.MsoBusinessLogic;
+import org.onap.osam.mso.MsoBusinessLogicImpl;
+import org.onap.osam.controllers.LocalWebConfig;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.testng.annotations.Test;
+
+
+@ContextConfiguration(classes = {LocalWebConfig.class, SystemProperties.class})
+@WebAppConfiguration
+public class MsoRestClientTest {
+
+
+    private MsoBusinessLogic msoBusinessLogic = new MsoBusinessLogicImpl(new MsoRestClientNew(new SyncRestClient(), ""), null);
+    private ObjectMapper om = new ObjectMapper();
+
+    @Test
+    public void createInPlaceMsoRequest() {
+        String result = null;
+        try {
+            RequestDetails requestDetails = generateMockMsoRequest();
+            result = om.writeValueAsString(msoBusinessLogic.generateInPlaceMsoRequest(requestDetails));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (result == null) {
+            Assert.fail("Failed to create mso request");
+        }
+        JSONObject jsonObj = new JSONObject(result);
+        Assert.assertNotNull(jsonObj.getJSONObject("requestDetails"));
+    }
+
+    private RequestDetails generateMockMsoRequest() {
+        RequestDetails requestDetails = new RequestDetails();
+        //requestDetails.setVnfInstanceId("vnf-instance-id");
+        //requestDetails.setVnfName("vnf-name");
+        CloudConfiguration cloudConfiguration = new CloudConfiguration();
+        cloudConfiguration.setTenantId("tenant-id");
+        cloudConfiguration.setLcpCloudRegionId("lcp-region");
+        requestDetails.setCloudConfiguration(cloudConfiguration);
+        ModelInfo modelInfo = new ModelInfo();
+        modelInfo.setModelInvariantId("model-invarient-id");
+        modelInfo.setModelCustomizationName("modelCustomizationName");
+        requestDetails.setModelInfo(modelInfo);
+        RequestInfo requestInfo = new RequestInfo();
+        requestInfo.setRequestorId("ok883e");
+        requestInfo.setSource("VID");
+        requestDetails.setRequestInfo(requestInfo);
+        RequestParameters requestParameters = new RequestParameters();
+        requestParameters.setSubscriptionServiceType("subscriber-service-type");
+        requestParameters.setAdditionalProperty("a", 1);
+        requestParameters.setAdditionalProperty("b", 2);
+        requestParameters.setAdditionalProperty("c", 3);
+        requestParameters.setAdditionalProperty("d", 4);
+        String payload = "{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}";
+        requestParameters.setAdditionalProperty("payload", payload);
+
+        requestDetails.setRequestParameters(requestParameters);
+        return requestDetails;
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/MsoRestClientTestUtil.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/MsoRestClientTestUtil.java
new file mode 100644
index 0000000..1066be4
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/MsoRestClientTestUtil.java
@@ -0,0 +1,146 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import static com.xebialabs.restito.builder.stub.StubHttp.whenHttp;
+import static com.xebialabs.restito.builder.verify.VerifyHttp.verifyHttp;
+import static com.xebialabs.restito.semantics.Action.contentType;
+import static com.xebialabs.restito.semantics.Action.status;
+import static com.xebialabs.restito.semantics.Action.stringContent;
+import static com.xebialabs.restito.semantics.Condition.delete;
+import static com.xebialabs.restito.semantics.Condition.get;
+import static com.xebialabs.restito.semantics.Condition.method;
+import static com.xebialabs.restito.semantics.Condition.post;
+import static com.xebialabs.restito.semantics.Condition.uri;
+import static com.xebialabs.restito.semantics.Condition.withHeader;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.xebialabs.restito.semantics.Action;
+import com.xebialabs.restito.server.StubServer;
+import java.io.IOException;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+
+import org.glassfish.grizzly.http.Method;
+import org.glassfish.grizzly.http.util.HttpStatus;
+import org.json.JSONObject;
+import org.junit.Assert;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.osam.mso.MsoResponseWrapper;
+
+class MsoRestClientTestUtil implements AutoCloseable {
+  private final StubServer server;
+  private final String endpoint;
+  private final String responsePayload;
+  private final HttpStatus expectedStatus;
+  private final String expectedResponseStr;
+
+  MsoRestClientTestUtil(StubServer server, String endpoint, HttpStatus expectedStatus,
+      String responsePayload,
+      String expectedResponseStr) {
+    this.server = server;
+    this.endpoint = endpoint;
+    this.responsePayload = responsePayload;
+    this.expectedStatus = expectedStatus;
+    this.expectedResponseStr = expectedResponseStr;
+  }
+
+  void executePost(String jsonPayload, BiFunction<RequestDetails, String, MsoResponseWrapper> func) throws IOException {
+    whenHttp(server)
+        .match(post(endpoint))
+        .then(status(expectedStatus), jsonContent(responsePayload), contentType(MediaType.APPLICATION_JSON));
+
+    RequestDetails sampleRequestDetails =
+        new ObjectMapper().readValue(jsonPayload, RequestDetails.class);
+
+    MsoResponseWrapper response = func.apply(sampleRequestDetails, endpoint);
+    JSONObject actualJson = new JSONObject(response.getEntity());
+
+    Assert.assertEquals(expectedStatus.getStatusCode(), response.getStatus());
+    Assert.assertEquals(expectedResponseStr, actualJson.toString());
+    verifyServer(server, endpoint, Method.POST);
+
+  }
+  void executePostCall(String jsonPayload, BiFunction<RequestDetailsWrapper, String, MsoResponseWrapper> func) throws IOException {
+    whenHttp(server)
+            .match(post(endpoint))
+            .then(status(expectedStatus), jsonContent(responsePayload), contentType(MediaType.APPLICATION_JSON));
+
+    RequestDetailsWrapper  sampleRequestDetails =
+            new ObjectMapper().readValue(jsonPayload, RequestDetailsWrapper.class);
+
+    MsoResponseWrapper response = func.apply(sampleRequestDetails, endpoint);
+    JSONObject actualJson = new JSONObject(response.getEntity());
+
+    Assert.assertEquals(expectedStatus.getStatusCode(), response.getStatus());
+    Assert.assertEquals(expectedResponseStr, actualJson.toString());
+    verifyServer(server, endpoint, Method.POST);
+  }
+
+  void executeDelete(String jsonPayload, BiFunction<RequestDetails, String, MsoResponseWrapper> func)
+      throws IOException {
+    whenHttp(server)
+        .match(delete(endpoint))
+        .then(status(expectedStatus), jsonContent(responsePayload), contentType(MediaType.APPLICATION_JSON));
+
+    RequestDetails sampleRequestDetails =
+        new ObjectMapper().readValue(jsonPayload, RequestDetails.class);
+    MsoResponseWrapper response = func.apply(sampleRequestDetails, endpoint);
+
+    Assert.assertEquals(expectedStatus.getStatusCode(), response.getStatus());
+    verifyServer(server, endpoint, Method.DELETE);
+  }
+
+  void executeGet(Function<String, MsoResponseWrapper> func) {
+    whenHttp(server)
+        .match(get(endpoint))
+        .then(status(expectedStatus), jsonContent(responsePayload), contentType(MediaType.APPLICATION_JSON));
+
+    MsoResponseWrapper response = func.apply(endpoint);
+
+    Assert.assertEquals(expectedStatus.getStatusCode(), response.getStatus());
+    verifyServer(server, endpoint, Method.GET);
+  }
+
+  private void verifyServer(StubServer server, String endpoint, Method httpMethod) {
+    verifyHttp(server).once(
+        method(httpMethod),
+        uri(endpoint),
+        withHeader(HttpHeaders.AUTHORIZATION),
+        withHeader(HttpHeaders.ACCEPT),
+        withHeader(HttpHeaders.CONTENT_TYPE),
+        withHeader(MsoRestClientNew.X_FROM_APP_ID),
+        withHeader(SystemProperties.ECOMP_REQUEST_ID));
+  }
+
+  private Action jsonContent(String str) {
+    return stringContent(str);
+  }
+
+  @Override
+  public void close() {
+  }
+}
+
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/OutgoingRequestIdTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/OutgoingRequestIdTest.java
new file mode 100644
index 0000000..5c42a31
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/OutgoingRequestIdTest.java
@@ -0,0 +1,212 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.InjectMocks;
+import org.mockito.Matchers;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.onap.osam.aai.util.AAIRestInterface;
+import org.onap.osam.filters.PromiseEcompRequestIdFilter;
+import org.onap.osam.mso.RestMsoImplementation;
+import org.onap.osam.mso.RestObject;
+import org.onap.osam.testUtils.TestUtils;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.core.MultivaluedMap;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.equalToIgnoringCase;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.hasToString;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.matchesPattern;
+
+
+public class OutgoingRequestIdTest {
+
+
+    @InjectMocks
+    private RestMsoImplementation restMsoImplementation;
+
+    @InjectMocks
+    private AAIRestInterface aaiRestInterface;
+
+
+    @Captor
+    private ArgumentCaptor<MultivaluedMap<String, Object>> multivaluedMapArgumentCaptor;
+
+    @BeforeClass
+    public void initMocks() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @BeforeMethod
+    private void putRequestInSpringContext() {
+        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes((HttpServletRequest) PromiseEcompRequestIdFilter.wrapIfNeeded(new MockHttpServletRequest())));
+    }
+
+    @DataProvider
+    public Object[][] msoMethods() {
+        return Stream.<ThrowingConsumer<RestMsoImplementation>>of(
+
+                client -> client.Get(new Object(), "whatever source id", "/any path", new RestObject<>()),
+                client -> client.GetForObject("whatever source id", "/any path", Object.class),
+                client -> client.Post(new Object(), "some payload", "whatever source id", "/any path", new RestObject<>()),
+                client -> client.PostForObject("some payload", "whatever source id", "/any path", Object.class),
+                client -> client.Put(Object.class, new RequestDetailsWrapper(), "whatever source id", "/any path", new RestObject<>())
+
+        ).map(l -> ImmutableList.of(l).toArray()).collect(Collectors.toList()).toArray(new Object[][]{});
+    }
+
+    @Test(dataProvider = "msoMethods")
+    public void mso(Consumer<RestMsoImplementation> f) throws Exception {
+        final TestUtils.JavaxRsClientMocks mocks = setAndGetMocksInsideRestImpl(restMsoImplementation);
+
+        f.accept(restMsoImplementation);
+
+        verifyRequestIdHeaderWasAdded(mocks.getFakeBuilder());
+    }
+
+    @DataProvider
+    public Object[][] aaiMethods() {
+        return Stream.<ThrowingConsumer<AAIRestInterface>>of(
+
+                client -> client.RestGet("from app id", "some transId", "/any path", false),
+                client -> client.Delete("whatever source id", "some transId", "/any path"),
+                client -> client.RestPost("from app id", "/any path", "some payload", false),
+                client -> client.RestPut("from app id", "/any path", "some payload", false)
+
+        ).map(l -> ImmutableList.of(l).toArray()).collect(Collectors.toList()).toArray(new Object[][]{});
+    }
+
+    //@Test(dataProvider = "aaiMethods")
+    public void aai(Consumer<AAIRestInterface> f) throws Exception {
+        final TestUtils.JavaxRsClientMocks mocks = setAndGetMocksInsideRestImpl(aaiRestInterface);
+
+        f.accept(aaiRestInterface);
+
+        verifyRequestIdHeaderWasAdded(mocks.getFakeBuilder());
+    }
+
+//    @Test(dataProvider = "schedulerMethods")
+//    public void scheduler(Consumer<AAIRestInterface> f) throws Exception {
+//
+//        This test os not feasible in the wat acheduler is implemented today,
+//        as Scheduler's client is rewritten in every call.
+//
+//        :-(
+//
+//    }
+
+    private void verifyRequestIdHeaderWasAdded(Invocation.Builder fakeBuilder) {
+        final String requestIdHeader = "x-ecomp-requestid";
+        final String uuidRegex = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
+
+        // Checks that the builder was called with either one of header("x-ecomp-requestid", uuid)
+        // or the plural brother: headers(Map.of("x-ecomp-requestid", Set.of(uuid))
+
+        Object requestId;
+        // The 'verify()' will capture the request id. If no match -- AssertionError will
+        // catch for a second chance -- another 'verify()'.
+        try {
+            ArgumentCaptor<Object> argumentCaptor = ArgumentCaptor.forClass(Object.class);
+            Mockito.verify(fakeBuilder)
+                    .header(
+                            Matchers.argThat(equalToIgnoringCase(requestIdHeader)),
+                            argumentCaptor.capture()
+                    );
+            requestId = argumentCaptor.getValue();
+
+        } catch (AssertionError e) {
+            Mockito.verify(fakeBuilder).headers(multivaluedMapArgumentCaptor.capture());
+
+            final MultivaluedMap<String, Object> headersMap = multivaluedMapArgumentCaptor.getValue();
+            final String thisRequestIdHeader = getFromSetCaseInsensitive(headersMap.keySet(), requestIdHeader);
+
+            assertThat(headersMap.keySet(), hasItem(thisRequestIdHeader));
+            requestId = headersMap.getFirst(thisRequestIdHeader);
+        }
+
+        assertThat("header '" + requestIdHeader + "' should be a uuid", requestId,
+                allOf(instanceOf(String.class), hasToString(matchesPattern(uuidRegex))));
+    }
+
+    private String getFromSetCaseInsensitive(Set<String> set, String key) {
+        return set.stream()
+                .filter(anotherString -> anotherString.equalsIgnoreCase(key))
+                .findFirst()
+                .orElse(key);
+    }
+
+    private TestUtils.JavaxRsClientMocks setAndGetMocksInsideRestImpl(Class<?> clazz) throws IllegalAccessException {
+        TestUtils.JavaxRsClientMocks mocks = new TestUtils.JavaxRsClientMocks();
+        Client fakeClient = mocks.getFakeClient();
+
+        FieldUtils.writeStaticField(clazz, "client", fakeClient, true);
+
+        return mocks;
+    }
+
+    private TestUtils.JavaxRsClientMocks setAndGetMocksInsideRestImpl(Object instance) throws IllegalAccessException {
+        TestUtils.JavaxRsClientMocks mocks = new TestUtils.JavaxRsClientMocks();
+        Client fakeClient = mocks.getFakeClient();
+
+        FieldUtils.writeField(instance, "client", fakeClient, true);
+
+        return mocks;
+    }
+
+    @FunctionalInterface
+    public interface ThrowingConsumer<T> extends Consumer<T> {
+        @Override
+        default void accept(T t) {
+            try {
+                acceptThrows(t);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        void acceptThrows(T t) throws Exception;
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RelatedInstanceTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RelatedInstanceTest.java
new file mode 100644
index 0000000..63f4bca
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RelatedInstanceTest.java
@@ -0,0 +1,115 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import java.util.Map;
+
+import org.junit.Test;
+import org.onap.osam.domain.mso.ModelInfo;
+
+
+public class RelatedInstanceTest {
+
+	private RelatedInstance createTestSubject() {
+		return new RelatedInstance();
+	}
+
+	
+	@Test
+	public void testGetModelInfo() throws Exception {
+		RelatedInstance testSubject;
+		ModelInfo result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getModelInfo();
+	}
+
+	
+	@Test
+	public void testSetModelInfo() throws Exception {
+		RelatedInstance testSubject;
+		ModelInfo modelInfo = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setModelInfo(modelInfo);
+	}
+
+	
+	@Test
+	public void testToString() throws Exception {
+		RelatedInstance testSubject;
+		String result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.toString();
+	}
+
+	
+	@Test
+	public void testGetAdditionalProperties() throws Exception {
+		RelatedInstance testSubject;
+		Map<String, Object> result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getAdditionalProperties();
+	}
+
+	
+	@Test
+	public void testSetAdditionalProperty() throws Exception {
+		RelatedInstance testSubject;
+		String name = "";
+		Object value = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setAdditionalProperty(name, value);
+	}
+
+	
+	@Test
+	public void testHashCode() throws Exception {
+		RelatedInstance testSubject;
+		int result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.hashCode();
+	}
+
+	
+	@Test
+	public void testEquals() throws Exception {
+		RelatedInstance testSubject;
+		Object other = null;
+		boolean result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.equals(other);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RelatedModelTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RelatedModelTest.java
new file mode 100644
index 0000000..545d76a
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RelatedModelTest.java
@@ -0,0 +1,115 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import java.util.Map;
+
+import org.junit.Test;
+import org.onap.osam.domain.mso.ModelInfo;
+
+
+public class RelatedModelTest {
+
+	private RelatedModel createTestSubject() {
+		return new RelatedModel();
+	}
+
+	
+	@Test
+	public void testGetModelInfo() throws Exception {
+		RelatedModel testSubject;
+		ModelInfo result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getModelInfo();
+	}
+
+	
+	@Test
+	public void testSetModelInfo() throws Exception {
+		RelatedModel testSubject;
+		ModelInfo modelInfo = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setModelInfo(modelInfo);
+	}
+
+	
+	@Test
+	public void testToString() throws Exception {
+		RelatedModel testSubject;
+		String result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.toString();
+	}
+
+	
+	@Test
+	public void testGetAdditionalProperties() throws Exception {
+		RelatedModel testSubject;
+		Map<String, Object> result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getAdditionalProperties();
+	}
+
+	
+	@Test
+	public void testSetAdditionalProperty() throws Exception {
+		RelatedModel testSubject;
+		String name = "";
+		Object value = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setAdditionalProperty(name, value);
+	}
+
+	
+	@Test
+	public void testHashCode() throws Exception {
+		RelatedModel testSubject;
+		int result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.hashCode();
+	}
+
+	
+	@Test
+	public void testEquals() throws Exception {
+		RelatedModel testSubject;
+		Object other = null;
+		boolean result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.equals(other);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestDetailsTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestDetailsTest.java
new file mode 100644
index 0000000..696b2d5
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestDetailsTest.java
@@ -0,0 +1,204 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+import org.onap.osam.domain.mso.*;
+
+
+public class RequestDetailsTest {
+
+	private RequestDetails createTestSubject() {
+		return new RequestDetails();
+	}
+
+	
+	@Test
+	public void testGetCloudConfiguration() throws Exception {
+		RequestDetails testSubject;
+		CloudConfiguration result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getCloudConfiguration();
+	}
+
+	
+	@Test
+	public void testSetCloudConfiguration() throws Exception {
+		RequestDetails testSubject;
+		CloudConfiguration cloudConfiguration = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setCloudConfiguration(cloudConfiguration);
+	}
+
+	
+	@Test
+	public void testGetModelInfo() throws Exception {
+		RequestDetails testSubject;
+		ModelInfo result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getModelInfo();
+	}
+
+	
+	@Test
+	public void testSetModelInfo() throws Exception {
+		RequestDetails testSubject;
+		ModelInfo modelInfo = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setModelInfo(modelInfo);
+	}
+
+	
+	@Test
+	public void testGetRelatedInstanceList() throws Exception {
+		RequestDetails testSubject;
+		List<RelatedInstanceWrapper> result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getRelatedInstanceList();
+	}
+
+	
+	@Test
+	public void testSetRelatedInstanceList() throws Exception {
+		RequestDetails testSubject;
+		List<RelatedInstanceWrapper> relatedInstanceList = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setRelatedInstanceList(relatedInstanceList);
+	}
+
+	
+	@Test
+	public void testGetRequestInfo() throws Exception {
+		RequestDetails testSubject;
+		RequestInfo result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getRequestInfo();
+	}
+
+	
+	@Test
+	public void testSetRequestInfo() throws Exception {
+		RequestDetails testSubject;
+		RequestInfo requestInfo = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setRequestInfo(requestInfo);
+	}
+
+	
+	@Test
+	public void testGetSubscriberInfo() throws Exception {
+		RequestDetails testSubject;
+		SubscriberInfo result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getSubscriberInfo();
+	}
+
+	
+	@Test
+	public void testSetSubscriberInfo() throws Exception {
+		RequestDetails testSubject;
+		SubscriberInfo subscriberInfo = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setSubscriberInfo(subscriberInfo);
+	}
+
+	
+	@Test
+	public void testToString() throws Exception {
+		RequestDetails testSubject;
+		String result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.toString();
+	}
+
+	
+	@Test
+	public void testGetAdditionalProperties() throws Exception {
+		RequestDetails testSubject;
+		Map<String, Object> result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getAdditionalProperties();
+	}
+
+	
+	@Test
+	public void testSetAdditionalProperty() throws Exception {
+		RequestDetails testSubject;
+		String name = "";
+		Object value = null;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setAdditionalProperty(name, value);
+	}
+
+	
+	@Test
+	public void testHashCode() throws Exception {
+		RequestDetails testSubject;
+		int result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.hashCode();
+	}
+
+	
+	@Test
+	public void testEquals() throws Exception {
+		RequestDetails testSubject;
+		Object other = null;
+		boolean result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.equals(other);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestListTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestListTest.java
new file mode 100644
index 0000000..0a1c109
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestListTest.java
@@ -0,0 +1,107 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+
+public class RequestListTest {
+
+    private RequestList createTestSubject() {
+        return new RequestList();
+    }
+
+    @Test
+    public void testGetRequestList() throws Exception {
+        RequestList testSubject;
+        List<RequestWrapper> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRequestList();
+    }
+
+    @Test
+    public void testSetRequestList() throws Exception {
+        RequestList testSubject;
+        List<RequestWrapper> l = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setRequestList(l);
+    }
+
+    @Test
+    public void testToString() throws Exception {
+        RequestList testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.toString();
+    }
+
+    @Test
+    public void testGetAdditionalProperties() throws Exception {
+        RequestList testSubject;
+        Map<String, Object> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAdditionalProperties();
+    }
+
+    @Test
+    public void testSetAdditionalProperty() throws Exception {
+        RequestList testSubject;
+        String name = "";
+        Object value = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setAdditionalProperty(name, value);
+    }
+
+    @Test
+    public void testHashCode() throws Exception {
+        RequestList testSubject;
+        int result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.hashCode();
+    }
+
+    @Test
+    public void testEquals() throws Exception {
+        RequestList testSubject;
+        Object other = null;
+        boolean result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.equals(other);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestTest.java
new file mode 100644
index 0000000..65b2433
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestTest.java
@@ -0,0 +1,125 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import org.junit.Test;
+import org.onap.osam.domain.mso.InstanceIds;
+import org.onap.osam.domain.mso.RequestStatus;
+
+public class RequestTest {
+
+    private Request createTestSubject() {
+        return new Request();
+    }
+
+    @Test
+    public void testGetInstanceIds() throws Exception {
+        Request testSubject;
+        InstanceIds result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getInstanceIds();
+    }
+
+    @Test
+    public void testSetInstanceIds() throws Exception {
+        Request testSubject;
+        InstanceIds instanceIds = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setInstanceIds(instanceIds);
+    }
+
+    @Test
+    public void testGetRequestDetails() throws Exception {
+        Request testSubject;
+        RequestDetails result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRequestDetails();
+    }
+
+    @Test
+    public void testSetRequestDetails() throws Exception {
+        Request testSubject;
+        RequestDetails requestDetails = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setRequestDetails(requestDetails);
+    }
+
+    @Test
+    public void testGetRequestStatus() throws Exception {
+        Request testSubject;
+        RequestStatus result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRequestStatus();
+    }
+
+    @Test
+    public void testSetRequestStatus() throws Exception {
+        Request testSubject;
+        RequestStatus requestStatus = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setRequestStatus(requestStatus);
+    }
+
+    @Test
+    public void testToString() throws Exception {
+        Request testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.toString();
+    }
+
+    @Test
+    public void testEquals() throws Exception {
+        Request testSubject;
+        Object other = null;
+        boolean result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.equals(other);
+    }
+
+    @Test
+    public void testHashCode() throws Exception {
+        Request testSubject;
+        int result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.hashCode();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestWrapperTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestWrapperTest.java
new file mode 100644
index 0000000..b75a308
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/RequestWrapperTest.java
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import org.junit.Test;
+
+public class RequestWrapperTest {
+
+    private RequestWrapper createTestSubject() {
+        return new RequestWrapper();
+    }
+
+    @Test
+    public void testGetRequest() throws Exception {
+        RequestWrapper testSubject;
+        Request result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getRequest();
+    }
+
+    @Test
+    public void testSetRequest() throws Exception {
+        RequestWrapper testSubject;
+        Request request = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setRequest(request);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/ResponseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/ResponseTest.java
new file mode 100644
index 0000000..36f1cb8
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/ResponseTest.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import org.junit.Test;
+
+public class ResponseTest {
+
+    private Response createTestSubject() {
+        return new Response();
+    }
+
+    @Test
+    public void testGetStatus() throws Exception {
+        Response testSubject;
+        int result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getStatus();
+    }
+
+    @Test
+    public void testSetStatus() throws Exception {
+        Response testSubject;
+        int status = 0;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setStatus(status);
+    }
+
+    @Test
+    public void testGetEntity() throws Exception {
+        Response testSubject;
+        RequestList result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getEntity();
+    }
+
+    @Test
+    public void testSetEntity() throws Exception {
+        Response testSubject;
+        RequestList entity = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setEntity(entity);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/TaskListTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/TaskListTest.java
new file mode 100644
index 0000000..92858b1
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/TaskListTest.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import java.util.List;
+
+import org.junit.Test;
+
+public class TaskListTest {
+
+    private TaskList createTestSubject() {
+        return new TaskList();
+    }
+
+    @Test
+    public void testGetTaskList() throws Exception {
+        TaskList testSubject;
+        List<Task> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getTaskList();
+    }
+
+    @Test
+    public void testSetTaskList() throws Exception {
+        TaskList testSubject;
+        List<Task> taskList = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setTaskList(taskList);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/TaskTest.java b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/TaskTest.java
new file mode 100644
index 0000000..71533c7
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/mso/rest/TaskTest.java
@@ -0,0 +1,274 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.mso.rest;
+
+import java.util.List;
+
+import org.junit.Test;
+
+public class TaskTest {
+
+    private Task createTestSubject() {
+        return new Task();
+    }
+
+    @Test
+    public void testGetTaskId() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getTaskId();
+    }
+
+    @Test
+    public void testSetTaskId() throws Exception {
+        Task testSubject;
+        String taskId = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setTaskId(taskId);
+    }
+
+    @Test
+    public void testGetType() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getType();
+    }
+
+    @Test
+    public void testSetType() throws Exception {
+        Task testSubject;
+        String type = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setType(type);
+    }
+
+    @Test
+    public void testGetNfRole() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getNfRole();
+    }
+
+    @Test
+    public void testSetNfRole() throws Exception {
+        Task testSubject;
+        String nfRole = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setNfRole(nfRole);
+    }
+
+    @Test
+    public void testGetSubscriptionServiceType() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getSubscriptionServiceType();
+    }
+
+    @Test
+    public void testSetSubscriptionServiceType() throws Exception {
+        Task testSubject;
+        String subscriptionServiceType = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setSubscriptionServiceType(subscriptionServiceType);
+    }
+
+    @Test
+    public void testGetOriginalRequestId() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getOriginalRequestId();
+    }
+
+    @Test
+    public void testSetOriginalRequestId() throws Exception {
+        Task testSubject;
+        String originalRequestId = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setOriginalRequestId(originalRequestId);
+    }
+
+    @Test
+    public void testGetOriginalRequestorId() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getOriginalRequestorId();
+    }
+
+    @Test
+    public void testSetOriginalRequestorId() throws Exception {
+        Task testSubject;
+        String originalRequestorId = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setOriginalRequestorId(originalRequestorId);
+    }
+
+    @Test
+    public void testGetErrorSource() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getErrorSource();
+    }
+
+    @Test
+    public void testSetErrorSource() throws Exception {
+        Task testSubject;
+        String errorSource = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setErrorSource(errorSource);
+    }
+
+    @Test
+    public void testGetErrorCode() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getErrorCode();
+    }
+
+    @Test
+    public void testSetErrorCode() throws Exception {
+        Task testSubject;
+        String errorCode = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setErrorCode(errorCode);
+    }
+
+    @Test
+    public void testGetErrorMessage() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getErrorMessage();
+    }
+
+    @Test
+    public void testSetErrorMessage() throws Exception {
+        Task testSubject;
+        String errorMessage = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setErrorMessage(errorMessage);
+    }
+
+    @Test
+    public void testGetBuildingBlockName() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getBuildingBlockName();
+    }
+
+    @Test
+    public void testSetBuildingBlockName() throws Exception {
+        Task testSubject;
+        String buildingBlockName = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setBuildingBlockName(buildingBlockName);
+    }
+
+    @Test
+    public void testGetBuildingBlockStep() throws Exception {
+        Task testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getBuildingBlockStep();
+    }
+
+    @Test
+    public void testSetBuildingBlockStep() throws Exception {
+        Task testSubject;
+        String buildingBlockStep = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setBuildingBlockStep(buildingBlockStep);
+    }
+
+    @Test
+    public void testGetValidResponses() throws Exception {
+        Task testSubject;
+        List<String> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getValidResponses();
+    }
+
+    @Test
+    public void testSetValidResponses() throws Exception {
+        Task testSubject;
+        List<String> validResponses = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setValidResponses(validResponses);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyResponseWrapperTest.java b/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyResponseWrapperTest.java
new file mode 100644
index 0000000..55a8201
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyResponseWrapperTest.java
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.policy;
+
+import org.junit.Test;
+
+public class PolicyResponseWrapperTest {
+
+	private PolicyResponseWrapper createTestSubject() {
+		return new PolicyResponseWrapper();
+	}
+
+	@Test
+	public void testGetEntity() throws Exception {
+		PolicyResponseWrapper testSubject;
+		String result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getEntity();
+	}
+
+	@Test
+	public void testGetStatus() throws Exception {
+		PolicyResponseWrapper testSubject;
+		int result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getStatus();
+	}
+
+	@Test
+	public void testSetStatus() throws Exception {
+		PolicyResponseWrapper testSubject;
+		int v = 0;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setStatus(v);
+	}
+
+	@Test
+	public void testSetEntity() throws Exception {
+		PolicyResponseWrapper testSubject;
+		String v = "";
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setEntity(v);
+	}
+
+	@Test
+	public void testToString() throws Exception {
+		PolicyResponseWrapper testSubject;
+		String result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.toString();
+	}
+
+	@Test
+	public void testGetResponse() throws Exception {
+		PolicyResponseWrapper testSubject;
+		String result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getResponse();
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyRestIntTest.java b/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyRestIntTest.java
new file mode 100644
index 0000000..20a7da4
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyRestIntTest.java
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.policy;
+
+import org.junit.Test;
+import org.onap.osam.policy.rest.RequestDetails;
+
+public class PolicyRestIntTest {
+
+	private PolicyRestInt createTestSubject() {
+		return new PolicyRestInt();
+	}
+
+	@Test
+	public void testLogRequest() throws Exception {
+		PolicyRestInt testSubject;
+		RequestDetails r = null;
+
+		// test 1
+		testSubject = createTestSubject();
+		r = null;
+		testSubject.logRequest(r);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyRestInterfaceFactoryTest.java b/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyRestInterfaceFactoryTest.java
new file mode 100644
index 0000000..6f25540
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyRestInterfaceFactoryTest.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.policy;
+
+import org.junit.Test;
+
+public class PolicyRestInterfaceFactoryTest {
+
+    private PolicyRestInterfaceFactory createTestSubject() {
+        return new PolicyRestInterfaceFactory();
+    }
+
+    @Test
+    public void testGetInstance() throws Exception {
+        PolicyRestInterfaceIfc result;
+
+        // default test
+        result = PolicyRestInterfaceFactory.getInstance();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyRestInterfaceTest.java b/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyRestInterfaceTest.java
new file mode 100644
index 0000000..7b61e5d
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyRestInterfaceTest.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.policy;
+
+import org.junit.Test;
+import org.onap.osam.policy.rest.RequestDetails;
+
+public class PolicyRestInterfaceTest {
+
+    private PolicyRestInterface createTestSubject() {
+        return new PolicyRestInterface();
+    }
+
+    @Test
+    public void testLogRequest() throws Exception {
+        PolicyRestInterface testSubject;
+        RequestDetails r = null;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.logRequest(r);
+    }
+
+    /*@Test
+    public void testInitRestClient() throws Exception {
+        PolicyRestInterface testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.initRestClient();
+    }*/
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyUtilTest.java b/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyUtilTest.java
new file mode 100644
index 0000000..3379e9b
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/policy/PolicyUtilTest.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.policy;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PolicyUtilTest {
+
+	private PolicyUtil createTestSubject() {
+		return new PolicyUtil();
+	}
+
+	@Test
+	public void testWrapResponse() throws Exception {
+		String body = "";
+		int statusCode = 0;
+		PolicyResponseWrapper result;
+
+		// default test
+		result = PolicyUtil.wrapResponse(body, statusCode);
+	}
+
+
+	@Test
+	public void testWrapResponse_2() throws Exception {
+		RestObject<String> rs = null;
+		PolicyResponseWrapper result;
+
+		// test 1
+		rs = null;
+		result = PolicyUtil.wrapResponse(rs);
+		Assert.assertNotNull(result);
+	}
+
+	@Test
+	public void testConvertPojoToString() throws Exception {
+		String result;
+
+		// test 1
+		result = PolicyUtil.convertPojoToString(null);
+		Assert.assertEquals("", result);
+	}
+
+	@Test
+	public void testMain() throws Exception {
+		String[] args = new String[] { "" };
+
+		// default test
+		PolicyUtil.main(args);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/policy/RestObjectTest.java b/onap-enabler-be/src/test/java/org/onap/osam/policy/RestObjectTest.java
new file mode 100644
index 0000000..3d91f18
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/policy/RestObjectTest.java
@@ -0,0 +1,70 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.policy;
+
+import org.junit.Test;
+
+public class RestObjectTest {
+
+	private RestObject createTestSubject() {
+		return new RestObject();
+	}
+
+	@Test
+	public void testSet() throws Exception {
+		RestObject testSubject;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.set(null);
+	}
+
+	@Test
+	public void testGet() throws Exception {
+		RestObject testSubject;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.get();
+	}
+
+	@Test
+	public void testSetStatusCode() throws Exception {
+		RestObject testSubject;
+		int v = 0;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setStatusCode(v);
+	}
+
+	@Test
+	public void testGetStatusCode() throws Exception {
+		RestObject testSubject;
+		int result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getStatusCode();
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/policy/rest/RequestDetailsTest.java b/onap-enabler-be/src/test/java/org/onap/osam/policy/rest/RequestDetailsTest.java
new file mode 100644
index 0000000..78a8995
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/policy/rest/RequestDetailsTest.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.policy.rest;
+
+import org.junit.Test;
+
+
+public class RequestDetailsTest {
+
+	private RequestDetails createTestSubject() {
+		return new RequestDetails();
+	}
+
+
+	@Test
+	public void testGetPolicyName() throws Exception {
+		RequestDetails testSubject;
+		String result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getPolicyName();
+	}
+
+
+	@Test
+	public void testSetPolicyName() throws Exception {
+		RequestDetails testSubject;
+		String policyName = "";
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setPolicyName(policyName);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/properties/VidPropertiesTest.java b/onap-enabler-be/src/test/java/org/onap/osam/properties/VidPropertiesTest.java
new file mode 100644
index 0000000..a0c726e
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/properties/VidPropertiesTest.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.properties;
+
+import org.junit.Test;
+
+
+public class VidPropertiesTest {
+
+	private VidProperties createTestSubject() {
+		return new VidProperties();
+	}
+
+
+	@Test
+	public void testGetAsdcModelNamespace() throws Exception {
+		String result;
+
+		// default test
+		result = VidProperties.getAsdcModelNamespace();
+	}
+
+
+	@Test
+	public void testGetPropertyWithDefault() throws Exception {
+		String propName = "";
+		String defaultValue = "";
+		String result;
+
+		// default test
+		result = VidProperties.getPropertyWithDefault(propName, defaultValue);
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/roles/RoleProviderTest.java b/onap-enabler-be/src/test/java/org/onap/osam/roles/RoleProviderTest.java
new file mode 100644
index 0000000..2272381
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/roles/RoleProviderTest.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.roles;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.Test;
+
+
+public class RoleProviderTest {
+
+	private RoleProvider createTestSubject() {
+		return new RoleProvider();
+	}
+
+	
+	@Test
+	public void testExtractRoleFromSession() throws Exception {
+		HttpServletRequest request = null;
+		List<String> result;
+
+		// default test
+		result = RoleProvider.extractRoleFromSession(request);
+	}
+
+	
+//	@Test
+//	public void testGetUserRoles() throws Exception {
+//		RoleProvider testSubject;
+//		HttpServletRequest request = null;
+//		List<Role> result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getUserRoles(request);
+//	}
+
+	
+	@Test
+	public void testSplitRole() throws Exception {
+		RoleProvider testSubject;
+		String roleAsString = "";
+		String[] result;
+
+		// default test
+		testSubject = createTestSubject();
+		//TODO:fix result = testSubject.splitRole(roleAsString);
+	}
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/roles/RoleTest.java b/onap-enabler-be/src/test/java/org/onap/osam/roles/RoleTest.java
new file mode 100644
index 0000000..0d29853
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/roles/RoleTest.java
@@ -0,0 +1,82 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.roles;
+
+import org.junit.Test;
+
+public class RoleTest {
+
+    private Role createTestSubject() {
+        return new Role(EcompRole.READ, "", "", "");
+    }
+
+    @Test
+    public void testGetEcompRole() throws Exception {
+        Role testSubject;
+        EcompRole result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getEcompRole();
+    }
+
+    @Test
+    public void testGetSubscribeName() throws Exception {
+        Role testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getSubscribeName();
+    }
+
+    @Test
+    public void testSetSubscribeName() throws Exception {
+        Role testSubject;
+        String subscribeName = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setSubscribeName(subscribeName);
+    }
+
+    @Test
+    public void testGetServiceType() throws Exception {
+        Role testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getServiceType();
+    }
+
+    @Test
+    public void testGetTenant() throws Exception {
+        Role testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getTenant();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/roles/RoleValidatorTest.java b/onap-enabler-be/src/test/java/org/onap/osam/roles/RoleValidatorTest.java
new file mode 100644
index 0000000..401af85
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/roles/RoleValidatorTest.java
@@ -0,0 +1,81 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.roles;
+
+import org.junit.Test;
+import org.onap.osam.mso.rest.RequestDetails;
+
+public class RoleValidatorTest {
+
+    private RoleValidator createTestSubject() {
+        return new RoleValidator(null);
+    }
+
+    @Test
+    public void testIsMsoRequestValid() throws Exception {
+        RoleValidator testSubject;
+        RequestDetails mso_request = null;
+        boolean result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.isMsoRequestValid(mso_request);
+    }
+
+    @Test
+    public void testIsServicePermitted() throws Exception {
+        RoleValidator testSubject;
+        String subscriberName = "";
+        String serviceType = "";
+        boolean result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.isServicePermitted(subscriberName, serviceType);
+    }
+
+    @Test
+    public void testIsSubscriberPermitted() throws Exception {
+        RoleValidator testSubject;
+        String subscriberName = "";
+        boolean result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.isSubscriberPermitted(subscriberName);
+    }
+
+    @Test
+    public void testIsTenantPermitted() throws Exception {
+        RoleValidator testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        String tenantName = "";
+        boolean result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.isTenantPermitted(globalCustomerId, serviceType, tenantName);
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjectTest.java b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjectTest.java
new file mode 100644
index 0000000..41438e6
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjectTest.java
@@ -0,0 +1,90 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.scheduler;
+
+import org.junit.Test;
+
+public class RestObjectTest {
+
+    private RestObject createTestSubject() {
+        return new RestObject();
+    }
+
+    @Test
+    public void testSet() throws Exception {
+        RestObject testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.set(null);
+    }
+
+    @Test
+    public void testGet() throws Exception {
+        RestObject testSubject;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.get();
+    }
+
+    @Test
+    public void testSetStatusCode() throws Exception {
+        RestObject testSubject;
+        int v = 0;
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setStatusCode(v);
+    }
+
+    @Test
+    public void testGetStatusCode() throws Exception {
+        RestObject testSubject;
+        int result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getStatusCode();
+    }
+
+    @Test
+    public void testSetUUID() throws Exception {
+        RestObject testSubject;
+        String uuid = "";
+
+        // default test
+        testSubject = createTestSubject();
+        testSubject.setUUID(uuid);
+    }
+
+    @Test
+    public void testGetUUID() throws Exception {
+        RestObject testSubject;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getUUID();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/GetTimeSlotsRestObjectTest.java b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/GetTimeSlotsRestObjectTest.java
new file mode 100644
index 0000000..f40a0e4
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/GetTimeSlotsRestObjectTest.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+//package org.onap.vid.scheduler.RestObjects;
+//
+//import org.junit.Test;
+//
+//
+//public class GetTimeSlotsRestObjectTest {
+//
+//	private GetTimeSlotsRestObject createTestSubject() {
+//		return new GetTimeSlotsRestObject();
+//	}
+//
+//
+//	@Test
+//	public void testSetUUID() throws Exception {
+//		GetTimeSlotsRestObject testSubject;
+//		String uuid = "";
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		testSubject.setUUID(uuid);
+//	}
+//
+//
+//	@Test
+//	public void testGetUUID() throws Exception {
+//		GetTimeSlotsRestObject testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getUUID();
+//	}
+//}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/PostCreateNewVnfRestObjectTest.java b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/PostCreateNewVnfRestObjectTest.java
new file mode 100644
index 0000000..24b472a
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/PostCreateNewVnfRestObjectTest.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+//package org.onap.vid.scheduler.RestObjects;
+//
+//import org.junit.Test;
+//
+//
+//public class PostCreateNewVnfRestObjectTest {
+//
+//	private PostCreateNewVnfRestObject createTestSubject() {
+//		return new PostCreateNewVnfRestObject();
+//	}
+//
+//
+//	@Test
+//	public void testSetUUID() throws Exception {
+//		PostCreateNewVnfRestObject testSubject;
+//		String uuid = "";
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		testSubject.setUUID(uuid);
+//	}
+//
+//
+//	@Test
+//	public void testGetUUID() throws Exception {
+//		PostCreateNewVnfRestObject testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getUUID();
+//	}
+//}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/PostSubmitVnfChangeRestObjectTest.java b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/PostSubmitVnfChangeRestObjectTest.java
new file mode 100644
index 0000000..04c3200
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/PostSubmitVnfChangeRestObjectTest.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+//package org.onap.vid.scheduler.RestObjects;
+//
+//import org.junit.Test;
+//
+//
+//public class PostSubmitVnfChangeRestObjectTest {
+//
+//	private PostSubmitVnfChangeRestObject createTestSubject() {
+//		return new PostSubmitVnfChangeRestObject();
+//	}
+//
+//
+//	@Test
+//	public void testSetUUID() throws Exception {
+//		PostSubmitVnfChangeRestObject testSubject;
+//		String uuid = "";
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		testSubject.setUUID(uuid);
+//	}
+//
+//
+//	@Test
+//	public void testGetUUID() throws Exception {
+//		PostSubmitVnfChangeRestObject testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getUUID();
+//	}
+//}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/RestObjectTest.java b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/RestObjectTest.java
new file mode 100644
index 0000000..4faa297
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/RestObjects/RestObjectTest.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.scheduler.RestObjects;
+
+import org.junit.Test;
+
+
+public class RestObjectTest {
+
+	private RestObject createTestSubject() {
+		return new RestObject();
+	}
+
+
+	@Test
+	public void testSet() throws Exception {
+		RestObject testSubject;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.set(null);
+	}
+
+
+	@Test
+	public void testGet() throws Exception {
+		RestObject testSubject;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.get();
+	}
+
+
+	@Test
+	public void testSetStatusCode() throws Exception {
+		RestObject testSubject;
+		int v = 0;
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setStatusCode(v);
+	}
+
+
+	@Test
+	public void testGetStatusCode() throws Exception {
+		RestObject testSubject;
+		int result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getStatusCode();
+	}
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerResponseWrappers/PostCreateNewVnfWrapperTest.java b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerResponseWrappers/PostCreateNewVnfWrapperTest.java
new file mode 100644
index 0000000..20bd458
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerResponseWrappers/PostCreateNewVnfWrapperTest.java
@@ -0,0 +1,77 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+//package org.onap.vid.scheduler.SchedulerResponseWrappers;
+//
+//import org.junit.Test;
+//
+//
+//public class PostCreateNewVnfWrapperTest {
+//
+//	private PostCreateNewVnfWrapper createTestSubject() {
+//		return new PostCreateNewVnfWrapper();
+//	}
+//
+//
+//	@Test
+//	public void testGetUuid() throws Exception {
+//		PostCreateNewVnfWrapper testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getUuid();
+//	}
+//
+//
+//	@Test
+//	public void testSetUuid() throws Exception {
+//		PostCreateNewVnfWrapper testSubject;
+//		String v = "";
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		testSubject.setUuid(v);
+//	}
+//
+//
+//	@Test
+//	public void testToString() throws Exception {
+//		PostCreateNewVnfWrapper testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.toString();
+//	}
+//
+//
+//	@Test
+//	public void testGetResponse() throws Exception {
+//		PostCreateNewVnfWrapper testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getResponse();
+//	}
+//}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerResponseWrappers/PostSubmitVnfChangeTimeSlotsWrapperTest.java b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerResponseWrappers/PostSubmitVnfChangeTimeSlotsWrapperTest.java
new file mode 100644
index 0000000..a8bfd3c
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerResponseWrappers/PostSubmitVnfChangeTimeSlotsWrapperTest.java
@@ -0,0 +1,77 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+//package org.onap.vid.scheduler.SchedulerResponseWrappers;
+//
+//import org.junit.Test;
+//
+//
+//public class PostSubmitVnfChangeTimeSlotsWrapperTest {
+//
+//	private PostSubmitVnfChangeTimeSlotsWrapper createTestSubject() {
+//		return new PostSubmitVnfChangeTimeSlotsWrapper();
+//	}
+//
+//
+//	@Test
+//	public void testGetUuid() throws Exception {
+//		PostSubmitVnfChangeTimeSlotsWrapper testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getUuid();
+//	}
+//
+//
+//	@Test
+//	public void testSetUuid() throws Exception {
+//		PostSubmitVnfChangeTimeSlotsWrapper testSubject;
+//		String v = "";
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		testSubject.setUuid(v);
+//	}
+//
+//
+//	@Test
+//	public void testToString() throws Exception {
+//		PostSubmitVnfChangeTimeSlotsWrapper testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.toString();
+//	}
+//
+//
+//	@Test
+//	public void testGetResponse() throws Exception {
+//		PostSubmitVnfChangeTimeSlotsWrapper testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getResponse();
+//	}
+//}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerResponseWrappers/SchedulerResponseWrapperTest.java b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerResponseWrappers/SchedulerResponseWrapperTest.java
new file mode 100644
index 0000000..b68570a
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerResponseWrappers/SchedulerResponseWrapperTest.java
@@ -0,0 +1,99 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+//package org.onap.vid.scheduler.SchedulerResponseWrappers;
+//
+//import org.junit.Test;
+//
+//
+//public class SchedulerResponseWrapperTest {
+//
+//	private SchedulerResponseWrapper createTestSubject() {
+//		return new SchedulerResponseWrapper();
+//	}
+//
+//	
+//	@Test
+//	public void testGetEntity() throws Exception {
+//		SchedulerResponseWrapper testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getEntity();
+//	}
+//
+//	
+//	@Test
+//	public void testGetStatus() throws Exception {
+//		SchedulerResponseWrapper testSubject;
+//		int result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getStatus();
+//	}
+//
+//	
+//	@Test
+//	public void testSetStatus() throws Exception {
+//		SchedulerResponseWrapper testSubject;
+//		int v = 0;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		testSubject.setStatus(v);
+//	}
+//
+//	
+//	@Test
+//	public void testSetEntity() throws Exception {
+//		SchedulerResponseWrapper testSubject;
+//		String v = "";
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		testSubject.setEntity(v);
+//	}
+//
+//	
+//	@Test
+//	public void testToString() throws Exception {
+//		SchedulerResponseWrapper testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.toString();
+//	}
+//
+//	
+//	@Test
+//	public void testGetResponse() throws Exception {
+//		SchedulerResponseWrapper testSubject;
+//		String result;
+//
+//		// default test
+//		testSubject = createTestSubject();
+//		result = testSubject.getResponse();
+//	}
+//}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerRestInterfaceTest.java b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerRestInterfaceTest.java
new file mode 100644
index 0000000..23a4287
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/SchedulerRestInterfaceTest.java
@@ -0,0 +1,138 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+
+package org.onap.osam.scheduler;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.xebialabs.restito.semantics.Action;
+import org.glassfish.grizzly.http.util.HttpStatus;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.osam.exceptions.GenericUncheckedException;
+import org.onap.osam.testUtils.StubServerUtil;
+import org.testng.annotations.AfterMethod;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
+
+@RunWith(MockitoJUnitRunner.class)
+public class SchedulerRestInterfaceTest {
+
+    private static final String SAMPLE_USERNAME = "sample";
+    private static final String SAMPLE_PASSWORD = "paS$w0Rd";
+    private static final String SAMPLE_SCHEDULER_SERVER_URL = "http://localhost";
+    private static final String SAMPLE_SOURCE_ID = "AAI";
+    private static final JSONParser JSON_PARSER = new JSONParser();
+    private static final String RESPONSE_CONTENT = "\"schedules\": \"SAMPLE STRING\"";
+    private static final String ERROR_RESPONSE = "\"error\": \"Internal server error!\"";
+    private static Map<String, String> DUMMY_SYSTEM_PROPERTIES = new HashMap<String, String>() {{
+        put(SchedulerProperties.SCHEDULER_USER_NAME_VAL, SAMPLE_USERNAME);
+        put(SchedulerProperties.SCHEDULER_PASSWORD_VAL, SAMPLE_PASSWORD);
+        put(SchedulerProperties.SCHEDULER_SERVER_URL_VAL, SAMPLE_SCHEDULER_SERVER_URL);
+    }};
+    private static StubServerUtil serverUtil;
+    private static SchedulerRestInterface schedulerInterface = new SchedulerRestInterface((key) -> DUMMY_SYSTEM_PROPERTIES.get(key));
+
+    @BeforeClass
+    public static void setUpClass() {
+        serverUtil = new StubServerUtil();
+        serverUtil.runServer();
+    }
+
+    @AfterClass
+    public static void tearDownClass() {
+        serverUtil.stopServer();
+    }
+
+
+    @AfterMethod
+    public void tearDown() {
+        serverUtil.stopServer();
+    }
+
+    @Test
+    public void testShouldGetOKWhenStringIsExpected() throws JsonProcessingException, ParseException {
+        prepareEnvForTest();
+        RestObject<String> sampleRestObj = new RestObject<>();
+        serverUtil.prepareGetCall("/test", RESPONSE_CONTENT, Action.ok());
+
+        schedulerInterface.Get("", SAMPLE_SOURCE_ID, "", sampleRestObj);
+
+        assertResponseHasExpectedBodyAndStatus(sampleRestObj, RESPONSE_CONTENT, 200);
+    }
+
+    @Test(expected = GenericUncheckedException.class)
+    public void shouldRaiseExceptionWhenErrorOccursDuringGet() throws JsonProcessingException {
+        prepareEnvForTest();
+        RestObject<String> sampleRestObj = new RestObject<>();
+
+        serverUtil.prepareGetCall("/test", ERROR_RESPONSE, Action.status(HttpStatus.INTERNAL_SERVER_ERROR_500));
+
+        schedulerInterface.Get("", SAMPLE_SOURCE_ID, "", sampleRestObj);
+    }
+
+    @Test
+    public void shouldDeleteResourceSuccessfully() throws JsonProcessingException, ParseException {
+        prepareEnvForTest();
+        RestObject<String> sampleRestObj = new RestObject<>();
+        serverUtil.prepareDeleteCall("/test", RESPONSE_CONTENT, Action.ok());
+
+        schedulerInterface.Delete("", SAMPLE_SOURCE_ID, "", sampleRestObj);
+
+        assertResponseHasExpectedBodyAndStatus(sampleRestObj, RESPONSE_CONTENT, 200);
+    }
+
+    @Test
+    public void shouldRaiseExceptionWhenErrorOccursDuringDelete() throws JsonProcessingException, ParseException {
+        prepareEnvForTest();
+        RestObject<String> sampleRestObj = new RestObject<>();
+        serverUtil.prepareDeleteCall("/test", ERROR_RESPONSE, Action.status(HttpStatus.INTERNAL_SERVER_ERROR_500));
+
+        schedulerInterface.Delete("", SAMPLE_SOURCE_ID, "", sampleRestObj);
+
+        assertResponseHasExpectedBodyAndStatus(sampleRestObj, ERROR_RESPONSE, 500);
+    }
+
+
+    private void assertResponseHasExpectedBodyAndStatus(RestObject<String> sampleRestObj, String expectedResponse, int expectedStatusCode) throws ParseException {
+        Object parsedResult = JSON_PARSER.parse(sampleRestObj.get());
+
+        assertThat(sampleRestObj.getStatusCode()).isEqualTo(expectedStatusCode);
+        assertThat(parsedResult).isInstanceOf(String.class).isEqualTo(expectedResponse);
+        assertThat(sampleRestObj.getUUID()).isNull();
+
+    }
+
+    private void prepareEnvForTest() {
+        String targetUrl = serverUtil.constructTargetUrl("http", "test");
+        DUMMY_SYSTEM_PROPERTIES.put(SchedulerProperties.SCHEDULER_SERVER_URL_VAL, targetUrl);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/scheduler/rest/RequestDetailsTest.java b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/rest/RequestDetailsTest.java
new file mode 100644
index 0000000..d82f1d9
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/scheduler/rest/RequestDetailsTest.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.scheduler.rest;
+
+import org.onap.osam.mso.rest.RequestDetails;
+
+
+public class RequestDetailsTest {
+
+	private RequestDetails createTestSubject() {
+		return new RequestDetails();
+	}
+
+
+	/*@Test
+	public void testGetDomain() throws Exception {
+		RequestDetails testSubject;
+		String result;
+
+		// default test
+		testSubject = createTestSubject();
+		result = testSubject.getDomain();
+	}
+
+
+	@Test
+	public void testSetDomain() throws Exception {
+		RequestDetails testSubject;
+		String domain = "";
+
+		// default test
+		testSubject = createTestSubject();
+		testSubject.setDomain(domain);
+	}*/
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/selenium/FirstClass.java b/onap-enabler-be/src/test/java/org/onap/osam/selenium/FirstClass.java
new file mode 100644
index 0000000..188d27d
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/selenium/FirstClass.java
@@ -0,0 +1,597 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.selenium;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.support.ui.Select;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+import org.apache.log4j.Logger;
+import org.testng.Assert;
+
+public class FirstClass {
+	
+		WebElement loginButton;
+		
+		/** The eg. */
+		String eg;
+		
+		/** The login. */
+		WebElement login;
+		
+		/** The pwd. */
+		WebElement pwd;
+		
+		/** The log. */
+		Logger log;
+		
+		/** The errormessage. */
+		WebElement errormessage;
+		
+					
+		/** The driver. */
+		WebDriver driver=new FirefoxDriver();
+		
+		
+		
+		/** The config prop. */
+		private final Properties configProp = new Properties();
+		
+		
+		/**
+		 * Instantiates a new first class.
+		 */
+		private  FirstClass() {
+			// TODO Auto-generated constructor stub
+			//
+			try{
+			//	InputStream input =this.getClass().getClassLoader().getResourceAsStream("objectmap.properties");
+			//FileInputStream input1 = new FileInputStream("objectmap.properties");
+				
+			InputStream input =new FileInputStream("objectconfig.properties");
+			System.out.println("Read all properties from file");
+			configProp.load(input);
+			System.out.println("Read all properties from file completed");
+			}
+			catch(IOException e) {
+				
+				e.printStackTrace();
+			}
+		}
+		
+		
+		/*
+		
+		
+		@BeforeClass
+		public void setUp() {
+			System.out.println("*******************");
+			System.out.println("launching IE browser");
+			System.setProperty("webdriver.ie.driver", driverPath+"IEDriverServer.exe");
+			driver = new InternetExplorerDriver();
+			driver.findElement(By.className());
+			driver.manage().window().maximize();
+			
+
+			 login = driver.findElement(By.xpath("//input[@class='fn-ebz-text ng-pristine ng-valid']"));
+			 pwd = driver.findElement(By.xpath("//input[@class='span3 ng-pristine ng-valid']"));
+			 loginButton = driver.findElement(By.id("loginBtn"));
+		}
+		
+		
+	*/
+		/**
+		 * Sets the up.
+		 */
+		// TODO Auto-generated method stub
+		@BeforeClass
+		public void setUp()
+		{
+			
+						
+			//WebDriver driver=new FirefoxDriver();
+			
+			log = Logger.getLogger(FirstClass.class.getName());
+		
+		
+		
+		// Get url
+		driver.get(configProp.getProperty("baseURL"));
+		driver.manage().window().maximize();
+		
+		
+		 login = driver.findElement(By.xpath(configProp.getProperty("login")));
+		 
+		 pwd = driver.findElement(By.xpath(configProp.getProperty("pwd")));
+		 loginButton = driver.findElement(By.id(configProp.getProperty("loginButton")));
+		}
+		
+		
+		/**
+		 * Empty username password.
+		 */
+		@Test(priority=1)
+		public void emptyUsernamePassword()
+		{
+		
+			
+		//User Name and Password field is empty
+		log.info("-----VID-11 TC-8----Username and password empty");
+		loginButton.click();
+		errormessage=driver.findElement(By.xpath("//*[@id='errorInfo']/span"));
+		String errmsg= errormessage.getText();
+		//System.out.println("Error message is"+errmsg);
+		//String expected = "Invaild username or password, Please try again";
+		
+		//Assert.assertEquals(errmsg,expected);
+
+		Boolean str = driver.getPageSource().contains("Invalid username or password, Please try again");
+		System.out.println(driver.getPageSource().contains("Invalid username or password, Please try again"));
+		
+		if(str==true)
+		{
+			log.info("Error message validated");
+			log.info("VID-11 TC-8 PASSED");
+			
+		}else
+			log.error("Failed validation");
+		
+		}
+
+
+		
+		/**
+		 * Invalid user name.
+		 */
+		@Test(priority=2)
+		public void invalidUserName()
+		{
+		
+		log.info("-----VID-11 TC-6----Invalid Username and Valid Password");
+		
+		
+		login.sendKeys("xxx");
+		pwd.sendKeys("abc123");
+		loginButton.click();
+		try {
+			Thread.sleep(5000);
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		String errmsg= errormessage.getText();
+		String expected = "Invalid username or password, Please try again";
+		Assert.assertEquals(errmsg,expected);
+		//Boolean str1 = driver.getPageSource().contains("Invalid username or password, Please try again");
+		//System.out.print(str1);
+		
+		log.info("VID-11 TC-6 PASSED");
+				
+		}
+		
+		
+		/**
+		 * Invalid password.
+		 */
+		@Test(priority=3)
+		public void invalidPassword()
+		{
+		log.info("-----VID-11 TC-7----Valid Username and Invalid Password");
+		//  Valid user name and Invalid password.
+				login.clear();
+				pwd.clear();
+				login.sendKeys("testuser");
+				pwd.sendKeys("xxx");
+				loginButton.click();
+				driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+		
+				
+				String errmsg= errormessage.getText();
+				String expected = "Invalid username or password, Please try again";
+				Assert.assertEquals(errmsg,expected);
+				
+				//Boolean str2 = driver.getPageSource().contains("Invaild username or password, Please try again");
+				//System.out.print(str2);
+				
+				log.info("VID-11 TC-7 PASSED");
+		}
+		
+			
+		/**
+		 * Login successful.
+		 */
+		@Test(priority=4)
+		public void loginSuccessful()
+		{
+		log.info("-----VID-11 TC-1----Valid Username and Valid Password");
+		//Login with valid user name and password.
+		login.clear();
+		login.sendKeys("su");
+		pwd.clear();
+		pwd.sendKeys("fusion");
+		
+				
+		loginButton.click();
+		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+		
+		try {
+			Thread.sleep(6000);
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		Assert.assertTrue(driver.getPageSource().contains("Search Existing Service Instances"));
+		log.info("VID-11 TC-1 PASSED");
+		
+		}
+		
+		
+		/**
+		 * Verify home page elements left pane.
+		 */
+		@Test(priority=5)
+		public void verifyHomePageElementsLeftPane()
+		
+		{
+			
+			
+			log.info("VID-10 TC 1 ");
+			//VID Home
+			log.info("VID 11 TC-2");
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[1]/a/span")).isDisplayed();
+			//Create New Service Instance
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[2]/a/span")).isDisplayed();
+			
+			//Browse Service Type
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[3]/a/span")).isDisplayed();
+			//View Log		
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[4]/a/span")).isDisplayed();
+			
+			//Profile
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[5]/a/span")).isDisplayed();
+			//Admin
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[6]/a/span")).isDisplayed();
+			//Logout
+			driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[7]/a/span")).isDisplayed();
+			
+			//Infrastructure Subscriber Name
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[1]/div/label")).isDisplayed();
+			//Infrastructure Subscriber Name Select Drop down
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select")).isDisplayed();
+			//Infrastructure Service Type
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[1]/div/label")).isDisplayed();
+			//Infrastructure Service Type Select Drop down
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select")).isDisplayed();
+			//Submit button 
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[3]/td/div/button")).isDisplayed();
+			
+			//Login Snippet Icon
+			driver.findElement(By.xpath(".//*[@class='icon-user-small login-snippet-icon']")).isDisplayed();
+			
+			
+			//String bodyText = driver.findElement(By.tagName("body")).getText();
+			//Assert.assertTrue("Text not found!", bodyText.contains("Search Existing Service Instances"));
+			//Assert.IsTrue(driver.getPageSource.Contains("Search Existing Service Instances"));
+			 
+			log.info("VID-12 TC-1");
+			Assert.assertTrue(driver.getPageSource().contains("Search Existing Service Instances"));
+			Assert.assertTrue(driver.getPageSource().contains("Please search by the Subscriber name or Service Type from below:"));
+			log.info("VID-12 TC-1 PASSED");
+			log.info("VID-10 TC 1 PASSED");
+			log.info("VID-11 TC-2 PASSED");
+		}
+		
+		
+		/**
+		 * Disabled submit button.
+		 */
+		@Test(priority=6)
+		public void disabledSubmitButton()
+		{
+			log.info("VID-12 TC-13");
+			//Assert submit button disabled.
+			Assert.assertFalse(driver.findElement(By.xpath(configProp.getProperty("submitButton"))).isEnabled());
+			log.info("VID-12 TC-13 PASSED");
+
+		} 
+		
+		/**
+		 * Default list box value.
+		 */
+		@Test(priority=7)
+		public void defaultListBoxValue()
+		{
+			log.info("VID-12 TC-2");
+			
+			
+			//WebElement subscribername =driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select"));
+			
+			Select oSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown"))));
+			Select iSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("serviceTypeDropDown"))));
+			
+			
+			WebElement ielement=iSelect.getFirstSelectedOption();
+			WebElement oelement=oSelect.getFirstSelectedOption();
+			String defaultsubscribername=oelement.getText();
+			String defaultservicetype=ielement.getText();
+			
+			Assert.assertEquals(defaultsubscribername,"Select Subscriber Name");
+			Assert.assertEquals(defaultservicetype,"Select Service Type");
+			
+		
+			
+			
+		//Verify Select Subscriber Name isDisplayed.
+		//driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select/option[1]")).isSelected();
+				
+		//Verify Select Service Type isDisplayed.	
+		//driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select/option[1]")).isSelected();
+			
+			
+			log.info("VID-12 TC-2 PASSED");
+
+		}
+
+
+		
+		/**
+		 * Select subscriber name drop down.
+		 *
+		 * @throws InterruptedException the interrupted exception
+		 */
+		@Test(priority=8)
+		public void selectSubscriberNameDropDown() throws InterruptedException
+		{
+			log.info("------------------VID-10 TC-2,VID-12 TC-11, VID-12 TC-9, VID 12 TC-10,VID-12 TC-6, VID 12 TC-5--------------------");
+			
+			
+			driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown")));
+			
+			driver.findElement(By.xpath(configProp.getProperty("serviceTypeDropDown")));
+			Thread.sleep(5000);
+			
+			//Infrastructure Subscriber Name
+			Select oSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown"))));
+			
+			List <WebElement> elementCount = oSelect.getOptions();
+			log.info("Select Element Count of Service Name");
+			System.out.println(elementCount.size());
+			
+			
+			//Verifying getInfrastructureSubscribersList
+			log.info("VID-29 TC-1");
+			Assert.assertTrue(elementCount.size()>0);
+			log.info("VID-29 TC-1 PASSED");
+			
+			oSelect.selectByIndex(2);
+			String selectedOption = new Select(driver.findElement(By.xpath(configProp.getProperty("subscriberNameDropDown")))).getFirstSelectedOption().getText();
+
+			System.out.println("Service Name selected is " +selectedOption);
+			log.info("VID-10 TC-2 PASSED");
+					
+			//Submit button is clicked
+			driver.findElement(By.xpath(configProp.getProperty("submitButton"))).click();
+			
+			
+			//Verify whether the page header is displayed "Selected Subscriber's Service Instance Details:"
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/h1")).isDisplayed();
+			//Assert.assertTrue(driver.getPageSource().contains("Selected Subscriber's Service Instance Details:"))
+			
+			
+			//Verify whether the page header is displayed "Global Customer ID"
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/div/table/thead/tr/th[2]/div")).isDisplayed();
+			Assert.assertTrue(driver.getPageSource().contains("Global Customer ID"));
+			Assert.assertTrue(driver.getPageSource().contains("Subscriber Name"));
+			Assert.assertTrue(driver.getPageSource().contains("Service Type"));
+			Assert.assertTrue(driver.getPageSource().contains("Service Instance ID"));
+			
+			log.info("VID-12 TC-5 PASSED");
+			log.info("VID-12 TC-11 PASSED");
+			
+			WebElement serviceinstancetable =driver.findElement(By.xpath("//table[@class='tablesorter tablesorter-default ng-isolate-scope']"));
+			
+			List<WebElement> rows_table = serviceinstancetable.findElements(By.tagName("tr"));
+			  //To calculate no of rows In table.
+			  int rows_count = rows_table.size();
+			  
+			  //Loop will execute till the last row of table.
+			  for (int row=0; row<rows_count; row++){
+			   //To locate columns(cells) of that specific row.
+			   List<WebElement> Columns_row = rows_table.get(row).findElements(By.tagName("td"));
+			   //To calculate no of columns(cells) In that specific row.
+			   int columns_count = Columns_row.size();
+			   //System.out.println("Number of cells In Row "+row+" are "+columns_count);
+			   
+			   //Loop will execute till the last cell of that specific row.
+			   for (int column=0; column<columns_count; column++){
+			    //To retrieve text from that specific cell.
+			    String celtext = Columns_row.get(column).getText();
+			    //System.out.println("Cell Value Of row number "+row+" and column number "+column+" Is "+celtext);
+			   
+			    
+			    
+			    //log.info("Testing Get column and row value");
+			    List <WebElement> exx= rows_table.get(1).findElements(By.tagName("td"));
+			     eg=Columns_row.get(2).getText();
+			   // System.out.println("Cell value of row 1 and column 2 is" +eg);
+			   }
+			  }
+		
+			  
+			
+			
+			//Verify View/Edit isDisplayed and Click
+			
+			driver.findElement(By.xpath("//a[@alt='View/Edit']")).isDisplayed();
+			
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/div/table/tbody/tr[1]/td[1]/div/a")).click();
+			
+			log.info("User clicked View/Edit");
+			
+			//Verify the Subscriber Name displayed.	
+			String header= driver.findElement(By.xpath("//h1[@class='heading1 ng-binding']")).getText();
+			//System.out.println(header);
+			
+			
+			if(header.contains(eg))
+			{
+				System.out.println("Header contains the subscriber name");
+			}else
+				System.out.println("Header does not contain the subscriber name");
+			
+			
+			
+			Assert.assertTrue(driver.getPageSource().contains("PerfTest Subscriber00020021"));
+			log.info("VID-12 TC-6 PASSED");
+			
+			
+				
+			driver.navigate().back();
+			//Cancel button isDisplayed
+			driver.findElement(By.xpath("//button[@class='button button--small button--primary']")).isDisplayed();
+			log.info("VID-12 TC-9 PASSED");
+			
+			//Cancel button is clicked
+			driver.findElement(By.xpath("//button[@class='button button--small button--primary']")).click();
+			log.info("Cancel button is clicked");
+			
+			//Verifying VID Home page is displayed
+			Assert.assertTrue(driver.getPageSource().contains("Search Existing Service Instances"));
+			log.info("VID-12 TC-10 PASSED");
+			
+			   }
+		
+		
+		/**
+		 * Refresh subscriber name.
+		 */
+		@Test(priority=9)
+		public void refreshSubscriberName()
+		{
+			log.info("VID-10 TC-4");
+			
+			
+			driver.findElement(By.xpath(configProp.getProperty("refreshButtonSubscriberName"))).isDisplayed();
+			
+			log.info("VID-10 TC-4 PASSED");
+			
+			
+		}
+
+		
+		/**
+		 * Select subscriber type drop down.
+		 *
+		 * @throws InterruptedException the interrupted exception
+		 */
+		@Test(priority=9)
+		public void selectSubscriberTypeDropDown() throws InterruptedException
+		{
+			Thread.sleep(5000);
+			log.info("------------------VID-10 TC-3, VID-12 TC-12,--------------------");
+			//Infrastructure Subscriber Type
+			Select iSelect = new Select(driver.findElement(By.xpath(configProp.getProperty("serviceTypeDropDown"))));
+			
+			List <WebElement> ielementCount = iSelect.getOptions();
+			log.info("Select Element Count of Service type");
+			System.out.println(ielementCount.size());
+			iSelect.selectByIndex(1);
+			
+			log.info("VID-10 TC-3 PASSED");
+			
+						
+			//Submit button is clicked
+			driver.findElement(By.xpath(configProp.getProperty("submitButton"))).click();
+			
+			//Verify whether the page header is displayed "Selected Subscriber's Service Instance Details:"
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/h1")).isDisplayed();
+			//Assert.assertTrue(driver.getPageSource().contains("Selected Subscriber's Service Instance Details:"))
+			log.info("Page Header: Selected Subscriber's Service Instance Details");
+			
+			
+			//Verify whether the page header is displayed "Global Customer ID"
+			driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/div/table/thead/tr/th[2]/div")).isDisplayed();
+			
+			//Assert.assertTrue(driver.getPageSource().contains("Global Customer ID"));
+			log.info("Table is displayed");
+			
+			log.info("VID-12 TC-12 PASSED");
+			
+		}
+		
+		
+		
+		/**
+		 * Logout under profile.
+		 */
+		@Test(priority=10)
+		public void logoutUnderProfile()
+		{
+			
+			log.info("-----------VID-11 TC-5---------------------");
+			//driver.findElement(By.partialLinkText("Click here to login")).click();
+			//driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+			
+		
+			driver.findElement(By.xpath(".//*[@class='icon-user-small login-snippet-icon']")).click();			
+			driver.findElement(By.xpath(".//*[@id='reg-logout-div']/a")).click();
+			//Validate that the user has logged out of VID. Displays "Portal"
+			Assert.assertTrue(driver.getPageSource().contains("Portal"));
+			
+			log.info("VID-11 TC-5 PASSED");
+			
+		}
+
+		
+		
+		/**
+		 * Tear down.
+		 */
+		@AfterClass
+		public void tearDown()
+		{
+			driver.close();
+		
+		}
+		
+		
+		
+	}
+
+
+	
+
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/selenium/LogOutLeftPane.java b/onap-enabler-be/src/test/java/org/onap/osam/selenium/LogOutLeftPane.java
new file mode 100644
index 0000000..ca5c618
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/selenium/LogOutLeftPane.java
@@ -0,0 +1,240 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.selenium;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.log4j.Logger;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.support.ui.Select;
+import org.testng.Assert;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+@Test(enabled=false)
+public class LogOutLeftPane {
+
+	WebElement loginButton;
+	
+	/** The login. */
+	WebElement login;
+	
+	/** The pwd. */
+	WebElement pwd;
+	
+	/** The log. */
+	Logger log;
+	
+	/** The errormessage. */
+	WebElement errormessage;
+	
+	/** The driver. */
+	WebDriver driver=new FirefoxDriver();
+	
+	
+	/** The config prop. */
+	private final Properties configProp = new Properties();
+	
+	
+	/**
+	 * Instantiates a new log out left pane.
+	 */
+	private  LogOutLeftPane() {
+		// TODO Auto-generated constructor stub
+		//
+		try{
+		//	InputStream input =this.getClass().getClassLoader().getResourceAsStream("objectmap.properties");
+		//FileInputStream input1 = new FileInputStream("objectmap.properties");
+			
+		InputStream input =new FileInputStream("objectconfig.properties");
+		System.out.println("Read all properties from file");
+		configProp.load(input);
+		System.out.println("Read all properties from file completed");
+		}
+		catch(IOException e) {
+			
+			e.printStackTrace();
+		}
+	}
+	
+	
+	   
+	   
+	/**
+	 * Do before test.
+	 */
+	// TODO Auto-generated method stub
+	@BeforeTest
+	public void doBeforeTest()
+	{
+		//WebDriver driver=new FirefoxDriver();
+		
+		log = Logger.getLogger(LogOutLeftPane.class.getName());
+	
+	
+	
+	// Get url
+	driver.get("http://vid.onap.org:9080/vid/login_external.htm");
+	driver.manage().window().maximize();
+	
+	
+	 login = driver.findElement(By.xpath("//input[@class='fn-ebz-text ng-pristine ng-valid']"));
+	 pwd = driver.findElement(By.xpath("//input[@class='span3 ng-pristine ng-valid']"));
+	 loginButton = driver.findElement(By.id("loginBtn"));
+	}
+	
+	
+	/**
+	 * Expand collapse panel.
+	 *
+	 * @throws InterruptedException the interrupted exception
+	 */
+	@Test(priority=1)
+	public void expandCollapsePanel() throws InterruptedException
+	{
+
+		
+		
+		login.clear();
+		login.sendKeys("su");
+		pwd.clear();
+		pwd.sendKeys("fusion");
+		//driver.findElement(By.partialLinkText("Click here to login")).click();
+		//driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+		
+		loginButton.click();
+		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+		
+		
+		log.info("Clicking Profile link from left pane");
+		Thread.sleep(3000);
+		System.out.println("properties file details --->"+configProp.getProperty("profilelink"));
+		driver.findElement(By.xpath(configProp.getProperty("profilelink"))).click();
+		Thread.sleep(3000);
+		
+		//Verify whether the sub panel is displayed
+		//To verify the following :Search import from webphone and Self 
+		driver.findElement(By.xpath(".//*[@id='panel4']")).isDisplayed();
+		log.info("Expand and collapse passed for Profile link");
+		
+		//For Admin
+		//Verify expand and collapse working for ADMIN
+		log.info("Clicking Admin link from left pane");
+		driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[6]/a/span")).click();
+		//To verify the following: Roles, Roles Functions, Usages
+		driver.findElement(By.xpath(".//*[@id='panel5']")).isDisplayed();
+		
+	
+		log.info("Expand and collapse passed for ADMIN link");
+
+		log.info("VID-11 TC-3 PASSED");
+		
+	}
+	
+	
+	/**
+	 * Drop down list.
+	 *
+	 * @throws InterruptedException the interrupted exception
+	 */
+	@Test(priority=2)
+	public void dropDownList() throws InterruptedException
+	{
+		//VID-12 TC-3
+		log.info("VID-12 TC-3");
+		//driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select"));
+		
+		//driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select"));
+		Thread.sleep(5000);
+		
+		//Infrastructure Subscriber Name
+		Select oSelect = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select")));
+		Select iSelect = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select")));
+		
+		List <WebElement> elementCount = oSelect.getOptions();
+		log.info("Subscriber Name Drop Down");
+		System.out.println(elementCount.size());
+		oSelect.selectByIndex(1);
+		log.info("Subscriber name selected");
+		//String selectedOption = new Select(driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select"))).getFirstSelectedOption().getText();
+		
+		
+		List <WebElement> count = iSelect.getOptions();
+		log.info("Subscriber type drop down");
+		System.out.println(count.size());
+		oSelect.selectByIndex(1);
+		log.info("Subscriber type selected");
+		
+
+				
+		//Submit button is clicked
+		driver.findElement(By.xpath(".//*[@id='mContent']/div/div/table/tbody/tr[3]/td/div/button")).click();
+		
+		
+		//Verify whether the page header is displayed "Selected Subscriber's Service Instance Details:"
+		driver.findElement(By.xpath(".//*[@id='mContent']/div/div/div/h1")).isDisplayed();
+		log.info("VID-12 TC-3 PASSED");
+	}
+	
+	
+	
+	
+	/**
+	 * Logout left pane.
+	 */
+	@Test(priority=3)
+	public void logoutLeftPane()
+	{
+		//To Verify if the logout link redirects to Login page when clicked.
+		
+		
+		/*log.info("----------------VID-11 TC-4----------------");
+		login.clear();
+		login.sendKeys("testuser");
+		pwd.clear();
+		pwd.sendKeys("abc123");
+		//driver.findElement(By.partialLinkText("Click here to login")).click();
+		//driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
+		
+		loginButton.click();
+		driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);*/
+		log.info("----------------VID-11 TC-4----------------");
+		driver.findElement(By.xpath("html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[7]/a")).click();
+		//Validate that the user has logged out of VID. Displays "Portal"
+		Assert.assertTrue(driver.getPageSource().contains("Portal"));
+		
+		log.info("VID 11 TC-4 PASSED");
+		
+		driver.close();
+		
+	}
+	
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/services/AaiServiceImplTest.java b/onap-enabler-be/src/test/java/org/onap/osam/services/AaiServiceImplTest.java
new file mode 100644
index 0000000..7034134
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/services/AaiServiceImplTest.java
@@ -0,0 +1,358 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.services;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.osam.aai.AaiResponse;
+import org.onap.osam.aai.SubscriberFilteredResults;
+import org.onap.osam.aai.model.AaiGetOperationalEnvironments.OperationalEnvironmentList;
+import org.onap.osam.aai.model.AaiGetPnfs.Pnf;
+import org.onap.osam.aai.model.AaiGetTenatns.GetTenantsResponse;
+import org.onap.osam.model.SubscriberList;
+import org.onap.osam.roles.RoleValidator;
+
+public class AaiServiceImplTest {
+
+    private AaiServiceImpl createTestSubject() {
+        return new AaiServiceImpl();
+    }
+
+    @Test
+    public void testGetFullSubscriberList() throws Exception {
+        AaiServiceImpl testSubject;
+        RoleValidator roleValidator = null;
+        SubscriberFilteredResults result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getFullSubscriberList(roleValidator);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetOperationalEnvironments() throws Exception {
+        AaiServiceImpl testSubject;
+        String operationalEnvironmentType = "";
+        String operationalEnvironmentStatus = "";
+        AaiResponse<OperationalEnvironmentList> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getOperationalEnvironments(operationalEnvironmentType, operationalEnvironmentStatus);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetFullSubscriberList_1() throws Exception {
+        AaiServiceImpl testSubject;
+        AaiResponse<SubscriberList> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getFullSubscriberList();
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetSubscriberData() throws Exception {
+        AaiServiceImpl testSubject;
+        String subscriberId = "";
+        RoleValidator roleValidator = null;
+        AaiResponse result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getSubscriberData(subscriberId, roleValidator);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetServiceInstanceSearchResults() throws Exception {
+        AaiServiceImpl testSubject;
+        String subscriberId = "";
+        String instanceIdentifier = "";
+        RoleValidator roleValidator = null;
+        List<String> owningEntities = null;
+        List<String> projects = null;
+        AaiResponse result;
+
+        // test 1
+        testSubject = createTestSubject();
+        subscriberId = null;
+        instanceIdentifier = null;
+        result = testSubject.getServiceInstanceSearchResults(subscriberId, instanceIdentifier, roleValidator,
+                owningEntities, projects);
+        Assert.assertNotEquals(null, result);
+
+        /*/ test 2
+        testSubject = createTestSubject();
+        subscriberId = "";
+        instanceIdentifier = null;
+        result = testSubject.getServiceInstanceSearchResults(subscriberId, instanceIdentifier, roleValidator,
+                owningEntities, projects);
+        Assert.assertNotEquals(null, result);
+
+        // test 3
+        testSubject = createTestSubject();
+        instanceIdentifier = null;
+        subscriberId = null;
+        result = testSubject.getServiceInstanceSearchResults(subscriberId, instanceIdentifier, roleValidator,
+                owningEntities, projects);
+        Assert.assertEquals(null, result);
+
+        // test 4
+        testSubject = createTestSubject();
+        instanceIdentifier = "";
+        subscriberId = null;
+        result = testSubject.getServiceInstanceSearchResults(subscriberId, instanceIdentifier, roleValidator,
+                owningEntities, projects);
+        Assert.assertEquals(null, result);
+
+        // test 5
+        testSubject = createTestSubject();
+        owningEntities = null;
+        result = testSubject.getServiceInstanceSearchResults(subscriberId, instanceIdentifier, roleValidator,
+                owningEntities, projects);
+        Assert.assertEquals(null, result);
+
+        // test 6
+        testSubject = createTestSubject();
+        projects = null;
+        result = testSubject.getServiceInstanceSearchResults(subscriberId, instanceIdentifier, roleValidator,
+                owningEntities, projects);
+        Assert.assertEquals(null, result);*/
+    }
+
+    @Test
+    public void testGetVersionByInvariantId() throws Exception {
+        AaiServiceImpl testSubject;
+        List<String> modelInvariantId = null;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            testSubject.getVersionByInvariantId(modelInvariantId);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetSpecificPnf() throws Exception {
+        AaiServiceImpl testSubject;
+        String pnfId = "";
+        AaiResponse<Pnf> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getSpecificPnf(pnfId);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetPNFData() throws Exception {
+        AaiServiceImpl testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        String modelVersionId = "";
+        String modelInvariantId = "";
+        String cloudRegion = "";
+        String equipVendor = "";
+        String equipModel = "";
+        AaiResponse result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getPNFData(globalCustomerId, serviceType, modelVersionId, modelInvariantId,
+                    cloudRegion, equipVendor, equipModel);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetServices() throws Exception {
+        AaiServiceImpl testSubject;
+        RoleValidator roleValidator = null;
+        AaiResponse result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getServices(roleValidator);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetTenants() throws Exception {
+        AaiServiceImpl testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        RoleValidator roleValidator = null;
+        AaiResponse<GetTenantsResponse[]> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getTenants(globalCustomerId, serviceType, roleValidator);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetVNFData() throws Exception {
+        AaiServiceImpl testSubject;
+        String globalSubscriberId = "";
+        String serviceType = "";
+        String serviceInstanceId = "";
+        AaiResponse result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getVNFData(globalSubscriberId, serviceType, serviceInstanceId);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetVNFData_1() throws Exception {
+        AaiServiceImpl testSubject;
+        String globalSubscriberId = "";
+        String serviceType = "";
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            testSubject.getVNFData(globalSubscriberId, serviceType);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetAaiZones() throws Exception {
+        AaiServiceImpl testSubject;
+        AaiResponse result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getAaiZones();
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetAicZoneForPnf() throws Exception {
+        AaiServiceImpl testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        String serviceId = "";
+        AaiResponse result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getAicZoneForPnf(globalCustomerId, serviceType, serviceId);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetNodeTemplateInstances() throws Exception {
+        AaiServiceImpl testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        String modelVersionId = "";
+        String modelInvariantId = "";
+        String cloudRegion = "";
+        AaiResponse result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getNodeTemplateInstances(globalCustomerId, serviceType, modelVersionId,
+                    modelInvariantId, cloudRegion);
+        } catch (
+
+        Exception e) {
+        }
+    }
+
+    @Test
+    public void testGetServiceInstanceAssociatedPnfs() throws Exception {
+        AaiServiceImpl testSubject;
+        String globalCustomerId = "";
+        String serviceType = "";
+        String serviceInstanceId = "";
+        List<String> result;
+
+        // default test
+        try {
+            testSubject = createTestSubject();
+            result = testSubject.getServiceInstanceAssociatedPnfs(globalCustomerId, serviceType, serviceInstanceId);
+        } catch (
+
+        Exception e) {
+        }
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/services/AsyncInstantiationBaseTest.java b/onap-enabler-be/src/test/java/org/onap/osam/services/AsyncInstantiationBaseTest.java
new file mode 100644
index 0000000..b8118d2
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/services/AsyncInstantiationBaseTest.java
@@ -0,0 +1,213 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.services;
+
+import com.google.common.collect.ImmutableMap;
+import jersey.repackaged.com.google.common.collect.ImmutableList;
+import org.onap.osam.aai.AaiClientInterface;
+import org.onap.osam.aai.AaiResponse;
+import org.onap.osam.aai.model.AaiNodeQueryResponse;
+import org.onap.osam.aai.model.ResourceType;
+import org.onap.osam.domain.mso.ModelInfo;
+import org.onap.osam.domain.mso.RequestStatus;
+import org.onap.osam.model.serviceInstantiation.ServiceInstantiation;
+import org.onap.osam.model.serviceInstantiation.VfModule;
+import org.onap.osam.model.serviceInstantiation.Vnf;
+import org.onap.osam.mso.RestObject;
+import org.onap.osam.mso.rest.AsyncRequestStatus;
+import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
+import org.togglz.core.manager.FeatureManager;
+
+import javax.inject.Inject;
+import java.util.*;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+
+public class AsyncInstantiationBaseTest extends AbstractTestNGSpringContextTests {
+
+    public static final String OWNING_ENTITY_ID = "038d99af-0427-42c2-9d15-971b99b9b489";
+    public static final String PACKET_CORE = "PACKET CORE";
+    public static final String PROJECT_NAME = "{some project name}";
+    public static final String SUBSCRIBER_ID = "{some subscriber id}";
+    public static final String SUBSCRIBER_NAME = "{some subscriber name}";
+    public static final String PRODUCT_FAMILY_ID = "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb";
+    public static final String INSTANCE_NAME = "vPE_Service";
+    public static final String SUBSCRIPTION_SERVICE_TYPE = "VMX";
+    public static final String LCP_CLOUD_REGION_ID = "mdt1";
+    public static final String A6CA3EE0394ADE9403F075DB23167E = "88a6ca3ee0394ade9403f075db23167e";
+    public static final String TENANT_NAME = "USP-SIP-IC-24335-T-01";
+    public static final String AIC_ZONE_ID = "NFT1";
+    public static final String AIC_ZONE_NAME = "NFTJSSSS-NFT1";
+
+    protected HashMap<String, String> instanceParamsMapWithoutParams;
+    protected HashMap<String, String> vfModuleInstanceParamsMapWithParamsToRemove;
+    protected HashMap<String, String> vnfInstanceParamsMapWithParamsToRemove;
+
+    @Inject
+    protected FeatureManager featureManager;
+
+    @Inject
+    protected AaiClientInterface aaiClient;
+
+    public ServiceInstantiation generateMockServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs, int bulkSize, boolean isUserProvidedNaming, String projectName, boolean rollbackOnFailure) {
+        ModelInfo modelInfo = createModelInfo();
+
+        List<Map<String,String>> instanceParams = createInstanceParams();
+
+        return new ServiceInstantiation (
+                modelInfo,
+                AsyncInstantiationBusinessLogicTest.OWNING_ENTITY_ID,
+                AsyncInstantiationBusinessLogicTest.PACKET_CORE,
+                projectName,
+                AsyncInstantiationBusinessLogicTest.SUBSCRIBER_ID,
+                AsyncInstantiationBusinessLogicTest.SUBSCRIBER_NAME,
+                AsyncInstantiationBusinessLogicTest.PRODUCT_FAMILY_ID,
+                isUserProvidedNaming ? AsyncInstantiationBusinessLogicTest.INSTANCE_NAME : ""  ,
+                isUserProvidedNaming,
+                AsyncInstantiationBusinessLogicTest.SUBSCRIPTION_SERVICE_TYPE,
+                AsyncInstantiationBusinessLogicTest.LCP_CLOUD_REGION_ID,
+                AsyncInstantiationBusinessLogicTest.A6CA3EE0394ADE9403F075DB23167E,
+                AsyncInstantiationBusinessLogicTest.TENANT_NAME,
+                AsyncInstantiationBusinessLogicTest.AIC_ZONE_ID,
+                AsyncInstantiationBusinessLogicTest.AIC_ZONE_NAME,
+                vnfs,
+                instanceParams,
+                isPause,
+                bulkSize,
+                rollbackOnFailure
+                );
+    }
+
+    private List<Map<String,String>> createInstanceParams() {
+        List<Map<String, String>> instanceParams = new ArrayList<>();
+        HashMap<String, String> map = new HashMap<>();
+        map.put("instanceParams_test1" , "some text");
+        map.put("instanceParams_test2" , "another text");
+        instanceParams.add(map);
+        return instanceParams;
+    }
+
+    private VfModule createVfModule(String modelName, String modelVersionId, String modelCustomizationId,
+                                    List<Map<String, String>> instanceParams, String instanceName, String volumeGroupInstanceName) {
+        ModelInfo vfModuleInfo = new ModelInfo();
+        vfModuleInfo.setModelType("vfModule");
+        vfModuleInfo.setModelName(modelName);
+        vfModuleInfo.setModelVersionId(modelVersionId);
+        vfModuleInfo.setModelCustomizationId(modelCustomizationId);
+        return new VfModule(vfModuleInfo , instanceName, volumeGroupInstanceName, instanceParams);
+    }
+
+    private ModelInfo createVnfModelInfo() {
+        ModelInfo vnfModelInfo = new ModelInfo();
+        vnfModelInfo.setModelType("vnf");
+        vnfModelInfo.setModelName("2016-73_MOW-AVPN-vPE-BV-L");
+        vnfModelInfo.setModelVersionId("7f40c192-f63c-463e-ba94-286933b895f8");
+        vnfModelInfo.setModelCustomizationName("2016-73_MOW-AVPN-vPE-BV-L 0");
+        vnfModelInfo.setModelCustomizationId("ab153b6e-c364-44c0-bef6-1f2982117f04");
+        return vnfModelInfo;
+    }
+
+    private ModelInfo createModelInfo() {
+        ModelInfo modelInfo = new ModelInfo();
+        modelInfo.setModelType("service");
+        modelInfo.setModelVersionId("3c40d244-808e-42ca-b09a-256d83d19d0a");
+        modelInfo.setModelVersion("10.0");
+        modelInfo.setModelInvariantId("5d48acb5-097d-4982-aeb2-f4a3bd87d31b");
+        modelInfo.setModelName("MOW AVPN vMX BV vPE 1 Service");
+        return modelInfo;
+    }
+
+    protected Map<String, Vnf> createVnfList(HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams, boolean isUserProvidedNaming) {
+        Map<String, Vnf> vnfs = new HashMap<>();
+        ModelInfo vnfModelInfo = createVnfModelInfo();
+
+        Map<String, Map<String, VfModule>> vfModules = new HashMap<>();
+
+        List<Map<String, String>> instanceParams1 =ImmutableList.of((ImmutableMap.of("vmx_int_net_len", "24")));
+        VfModule vfModule1 = createVfModule("201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0", "4c75f813-fa91-45a4-89d0-790ff5f1ae79", "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f", instanceParams1, "vmxnjr001_AVPN_base_vPE_BV_base", null);
+        List<Map<String, String>> instanceParams2 = ImmutableList.of(vfModuleInstanceParamsMap);
+        VfModule vfModule2 = createVfModule("201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1", "56e2b103-637c-4d1a-adc8-3a7f4a6c3240", "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", instanceParams2, "vmxnjr001_AVPN_base_vRE_BV_expansion", "myVgName");
+
+        String vfModuleModelName = vfModule1.getModelInfo().getModelName();
+        vfModules.put(vfModuleModelName, new LinkedHashMap<>());
+
+        vfModules.get(vfModuleModelName).put(vfModule1.getInstanceName(),vfModule1);
+        vfModules.get(vfModuleModelName).put(vfModule2.getInstanceName(), vfModule2);
+
+        Vnf vnf = new Vnf(vnfModelInfo, "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", "vmxnjr001", isUserProvidedNaming,
+                "platformName", "mdt1", "88a6ca3ee0394ade9403f075db23167e", vnfInstanceParams,"lineOfBusinessName" ,vfModules);
+
+        vnfs.put(vnf.getInstanceName(), vnf);
+        return vnfs;
+    }
+
+    protected void createInstanceParamsMaps() {
+        instanceParamsMapWithoutParams = new HashMap<>();
+        instanceParamsMapWithoutParams.put("availability_zone_0" , "mtpocdv-kvm-az01");
+        instanceParamsMapWithoutParams.put("vre_a_volume_size_0" , "100");
+
+        vfModuleInstanceParamsMapWithParamsToRemove = new HashMap<>();
+        vfModuleInstanceParamsMapWithParamsToRemove.put(IAsyncInstantiationBusinessLogic.PARAMS_TO_IGNORE.get(0), "should be removed");
+        vfModuleInstanceParamsMapWithParamsToRemove.put("availability_zone_0" , "mtpocdv-kvm-az01");
+        vfModuleInstanceParamsMapWithParamsToRemove.put("vre_a_volume_size_0" , "100");
+
+        vnfInstanceParamsMapWithParamsToRemove = new HashMap<>();
+        vnfInstanceParamsMapWithParamsToRemove.put(IAsyncInstantiationBusinessLogic.PARAMS_TO_IGNORE.get(1), "should be removed");
+    }
+
+    protected AsyncRequestStatus asyncRequestStatusResponse(String msoStatus) {
+        AsyncRequestStatus asyncRequestStatus = new AsyncRequestStatus(new AsyncRequestStatus.Request(new RequestStatus()));
+        asyncRequestStatus.request.requestStatus.setRequestState(msoStatus);
+        asyncRequestStatus.request.requestId = UUID.randomUUID().toString();
+        return asyncRequestStatus;
+    }
+
+    protected RestObject<AsyncRequestStatus> asyncRequestStatusResponseAsRestObject(String msoStatus) {
+        return asyncRequestStatusResponseAsRestObject(msoStatus, 200);
+    }
+
+    protected RestObject<AsyncRequestStatus> asyncRequestStatusResponseAsRestObject(String msoStatus, int httpStatusCode) {
+        RestObject<AsyncRequestStatus> restObject = new RestObject<>();
+        restObject.set(asyncRequestStatusResponse(msoStatus));
+        restObject.setStatusCode(httpStatusCode);
+        return restObject;
+    }
+
+    protected void mockAaiClientAnyNameFree() {
+        when(aaiClient.searchNodeTypeByName(any(), any())).thenReturn(aaiNodeQueryResponseNameFree());
+    }
+
+    protected AaiResponse<AaiNodeQueryResponse> aaiNodeQueryResponseNameFree() {
+        return new AaiResponse<>(new AaiNodeQueryResponse(null),"", 200);
+    }
+
+    protected AaiResponse<AaiNodeQueryResponse> aaiNodeQueryBadResponse() {
+        return new AaiResponse<>(null,"", 404);
+    }
+
+    protected AaiResponse<AaiNodeQueryResponse> aaiNodeQueryResponseNameUsed(ResourceType type) {
+        AaiNodeQueryResponse mockAaiNodeQuery = new AaiNodeQueryResponse(ImmutableList.of(new AaiNodeQueryResponse.ResultData(type, "/some/mocked/link")));
+        return new AaiResponse<>(mockAaiNodeQuery,"", 200);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/services/AsyncInstantiationBusinessLogicTest.java b/onap-enabler-be/src/test/java/org/onap/osam/services/AsyncInstantiationBusinessLogicTest.java
new file mode 100644
index 0000000..0072018
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/services/AsyncInstantiationBusinessLogicTest.java
@@ -0,0 +1,845 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.services;
+
+import org.onap.osam.config.DataSourceConfig;
+import org.onap.osam.config.MockedAaiClientAndFeatureManagerConfig;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.test.context.ContextConfiguration;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
+import static org.mockito.Matchers.any;
+
+@ContextConfiguration(classes = {DataSourceConfig.class, SystemProperties.class, MockedAaiClientAndFeatureManagerConfig.class})
+public class AsyncInstantiationBusinessLogicTest extends AsyncInstantiationBaseTest {
+/*
+TO BE FIXED
+    @Inject
+    private DataAccessService dataAccessService;
+
+    @Mock
+    private JobAdapter jobAdapter;
+
+    @Mock
+    private JobsBrokerService jobsBrokerService;
+
+
+
+    @Autowired
+    private SessionFactory sessionFactory;
+
+    private IAsyncInstantiationBusinessLogic asyncInstantiationBL;
+
+    private int serviceCount = 0;
+
+    private static final String UPDATE_SERVICE_INFO_EXCEPTION_MESSAGE =
+            "Failed to retrieve job with uuid .* from ServiceInfo table. Instances found: .*";
+
+    private static final String DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE =
+            "Service status does not allow deletion from the queue";
+
+    @BeforeClass
+    void initServicesInfoService() {
+        MockitoAnnotations.initMocks(this);
+        asyncInstantiationBL = new AsyncInstantiationBusinessLogicImpl(dataAccessService, jobAdapter, jobsBrokerService, sessionFactory, aaiClient);
+        createInstanceParamsMaps();
+    }
+
+    @BeforeMethod
+    void defineMocks() {
+        mockAaiClientAnyNameFree();
+    }
+
+    @BeforeMethod
+    void resetServiceCount() {
+        serviceCount = 0;
+    }
+
+    @AfterMethod
+    void clearDb() {
+        dataAccessService.deleteDomainObjects(JobDaoImpl.class, "1=1", getPropsMap());
+        dataAccessService.deleteDomainObjects(ServiceInfo.class, "1=1", getPropsMap());
+        dataAccessService.deleteDomainObjects(JobAuditStatus.class, "1=1", getPropsMap());
+        dataAccessService.deleteDomainObjects(NameCounter.class, "1=1", getPropsMap());
+    }
+
+
+    private void createNewTestServicesInfoForFilter(String userId) {
+        LocalDateTime createdDate, modifiedDate;
+        LocalDateTime NOW = LocalDateTime.now();
+        UUID uuid;
+
+        // Old job
+        uuid = UUID.randomUUID();
+        addNewJob(uuid);
+        createdDate = NOW.minusYears(1);
+        addNewServiceInfo(uuid, userId, "Old", createdDate, createdDate, COMPLETED, false);
+
+        uuid = UUID.randomUUID();
+        addNewJob(uuid);
+        createdDate = NOW.minusDays(20);
+        modifiedDate = NOW.minusDays(19);
+        addNewServiceInfo(uuid, userId, "Hidden", createdDate, modifiedDate, PAUSE, true);
+
+        createNewTestServicesInfo(String.valueOf(userId));
+    }
+
+    private void createNewTestServicesInfo(String userId) {
+
+        LocalDateTime createdDate, modifiedDate;
+        LocalDateTime NOW = LocalDateTime.now();
+        UUID uuid;
+
+        uuid = UUID.randomUUID();
+        addNewJob(uuid);
+
+        createdDate = NOW.minusDays(40);
+        addNewServiceInfo(uuid, userId, "service instance 5", createdDate, createdDate, COMPLETED, false);
+        addNewServiceInfo(uuid, userId, "service instance 6", createdDate, createdDate, STOPPED, false);
+
+        uuid = UUID.randomUUID();
+        addNewJob(uuid);
+
+        createdDate = NOW.minusDays(20);
+        modifiedDate = NOW.minusDays(10);
+        addNewServiceInfo(uuid, userId, "service instance 4", createdDate, modifiedDate, STOPPED, false);
+        addNewServiceInfo(uuid, userId, "service instance 2", createdDate, modifiedDate, COMPLETED, false);
+        addNewServiceInfo(uuid, userId, "service instance 3", createdDate, modifiedDate, PAUSE, false);
+
+        modifiedDate = NOW.minusDays(19);
+        addNewServiceInfo(uuid, userId, "service instance 1", createdDate, modifiedDate, FAILED, false);
+
+
+        // Job to a different user
+        uuid = UUID.randomUUID();
+        addNewJob(uuid);
+
+        createdDate = NOW.minusMonths(2);
+        addNewServiceInfo(uuid, "2221", "service instance 7", createdDate, createdDate, COMPLETED, false);
+
+    }
+
+    private UUID createServicesInfoWithDefaultValues(Job.JobStatus status) {
+
+        LocalDateTime NOW = LocalDateTime.now();
+        UUID uuid;
+
+        uuid = UUID.randomUUID();
+        addNewJob(uuid, status);
+
+        addNewServiceInfo(uuid, null, "service instance 1", NOW, NOW, status, false);
+
+        return uuid;
+
+    }
+
+    private List<ServiceInfo> getFullList() {
+        List<ServiceInfo> expectedOrderServiceInfo = dataAccessService.getList(ServiceInfo.class, getPropsMap());
+        assertThat("Failed to retrieve all predefined services", expectedOrderServiceInfo.size(), equalTo(serviceCount));
+        expectedOrderServiceInfo.sort(new ServiceInfoComparator());
+        return expectedOrderServiceInfo;
+    }
+
+    private static Date toDate(LocalDateTime localDateTime) {
+        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    private LocalDateTime fromDate(Date date) {
+        return Instant.ofEpochMilli(date.getTime())
+                .atZone(ZoneId.systemDefault())
+                .toLocalDateTime();
+    }
+
+    private void addNewServiceInfo(UUID uuid, String userId, String serviceName, LocalDateTime createDate, LocalDateTime statusModifiedDate, Job.JobStatus status, boolean isHidden) {
+        ServiceInfo serviceInfo = new ServiceInfo();
+        serviceInfo.setJobId(uuid);
+        serviceInfo.setUserId(userId);
+        serviceInfo.setServiceInstanceName(serviceName);
+        serviceInfo.setStatusModifiedDate(toDate(statusModifiedDate));
+        serviceInfo.setJobStatus(status);
+        serviceInfo.setPause(false);
+        serviceInfo.setOwningEntityId("1234");
+        serviceInfo.setCreatedBulkDate(toDate(createDate));
+
+        serviceInfo.setHidden(isHidden);
+        dataAccessService.saveDomainObject(serviceInfo, getPropsMap());
+        setCreateDateToServiceInfo(uuid, createDate);
+        serviceCount++;
+
+    }
+
+    private void setCreateDateToServiceInfo(UUID jobUuid, LocalDateTime createDate) {
+        List<ServiceInfo> serviceInfoList = dataAccessService.getList(ServiceInfo.class, getPropsMap());
+        DaoUtils.tryWithSessionAndTransaction(sessionFactory, session -> {
+            serviceInfoList.stream()
+                    .filter(serviceInfo -> jobUuid.equals(serviceInfo.getJobId()))
+                    .forEach(serviceInfo -> {
+                        serviceInfo.setCreated(toDate(createDate));
+                        session.saveOrUpdate(serviceInfo);
+                    });
+            return 1;
+        });
+    }
+
+    private void addNewJob(UUID uuid) {
+        addNewJob(uuid, null);
+    }
+
+    private void addNewJob(UUID uuid, Job.JobStatus status) {
+        JobDaoImpl jobDao = new JobDaoImpl();
+        jobDao.setUuid(uuid);
+        jobDao.setStatus(status);
+        dataAccessService.saveDomainObject(jobDao, getPropsMap());
+    }
+
+    @Test
+    public void testServiceInfoAreOrderedAsExpected() {
+        int userId = 2222;
+        createNewTestServicesInfo(String.valueOf(userId));
+        List<ServiceInfo> expectedOrderServiceInfo = getFullList();
+        List<ServiceInfo> serviceInfoListResult = asyncInstantiationBL.getAllServicesInfo();
+        assertThat("Services aren't ordered as expected", serviceInfoListResult, equalTo(expectedOrderServiceInfo));
+    }
+
+    @Test
+    public void testServiceInfoAreFilteredAsExpected() {
+        int userId = 2222;
+        createNewTestServicesInfoForFilter(String.valueOf(userId));
+        List<ServiceInfo> expectedOrderServiceInfo = getFullList();
+
+        List<ServiceInfo> expectedFilterByUser = expectedOrderServiceInfo.stream().filter(x ->
+                !x.getServiceInstanceName().equals("Old") && !x.getServiceInstanceName().equals("Hidden")
+
+        ).collect(Collectors.toList());
+
+
+        List<ServiceInfo> serviceInfoFilteredByUser = asyncInstantiationBL.getAllServicesInfo();
+        assertThat("Services aren't ordered filtered as expected", serviceInfoFilteredByUser, equalTo(expectedFilterByUser));
+    }
+
+    @Test(dataProvider = "pauseAndInstanceParams", enabled = false) //Test is irrelevant with unique names feature
+    public void createServiceInstantiationMsoRequest(Boolean isPause, HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams) throws Exception {
+        ServiceInstantiation serviceInstantiationPayload = generateMockServiceInstantiationPayload(isPause, createVnfList(vfModuleInstanceParamsMap, vnfInstanceParams, true));
+        final URL resource = this.getClass().getResource("/payload_jsons/bulk_service_request.json");
+            RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
+                    asyncInstantiationBL.generateServiceInstantiationRequest(null, serviceInstantiationPayload, "az2016");
+            String expected = IOUtils.toString(resource, "UTF-8");
+            MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+    }
+
+    @Test(dataProvider = "pauseAndInstanceParams")
+    public void createServiceInstantiationMsoRequestUniqueName(Boolean isPause, HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams) throws Exception {
+        Mockito.reset(aaiClient);
+        mockAaiClientAnyNameFree();
+        ServiceInstantiation serviceInstantiationPayload = generateMockServiceInstantiationPayload(isPause, createVnfList(vfModuleInstanceParamsMap, vnfInstanceParams, true));
+        final URL resource = this.getClass().getResource("/payload_jsons/bulk_service_request_unique_names.json");
+        List<UUID> uuids = new ArrayList<>();
+        for (int i = 0; i < 2; i++) {
+            UUID currentUuid = createJobAndServiceInfo();
+            uuids.add(currentUuid);
+            RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
+                    asyncInstantiationBL.generateServiceInstantiationRequest(currentUuid, serviceInstantiationPayload, "az2016");
+            String unique =  String.format("00%s", i + 1);
+            String expected = IOUtils.toString(resource, "UTF-8")
+                    .replace("{SERVICE_UNIQENESS}", unique)
+                    .replace("{VNF_UNIQENESS}", unique)
+                    .replace("{VF_MODULE_UNIQENESS}", unique)
+                    .replace("{VF_MODULE_2_UNIQENESS}", unique)
+                    .replace("{VG_UNIQUENESS}", unique);
+            MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+            Optional<ServiceInfo> optionalServiceInfo = getJobById(currentUuid);
+            assertThat(optionalServiceInfo.get().getServiceInstanceName(), equalTo("vPE_Service_" + unique));
+            verifySearchNodeTypeByName(unique, "vPE_Service_", ResourceType.SERVICE_INSTANCE);
+            verifySearchNodeTypeByName(unique, "vmxnjr001_", ResourceType.GENERIC_VNF);
+            verifySearchNodeTypeByName(unique, "vmxnjr001_AVPN_base_vPE_BV_base_", ResourceType.VF_MODULE);
+            verifySearchNodeTypeByName(unique, "vmxnjr001_AVPN_base_vRE_BV_expansion_", ResourceType.VF_MODULE);
+            verifySearchNodeTypeByName(unique, "myVgName_", ResourceType.VOLUME_GROUP);
+        }
+    }
+
+    protected void verifySearchNodeTypeByName(String unique, String resourceName, ResourceType serviceInstance) {
+        verify(aaiClient, times(1)).searchNodeTypeByName(resourceName + unique, serviceInstance);
+    }
+
+    private HashMap<String, Object> getPropsMap() {
+        HashMap<String, Object> props = new HashMap<>();
+        props.put(FusionObject.Parameters.PARAM_USERID, 0);
+        return props;
+    }
+
+    @Test(enabled = false) //probably not needed with name uniqueness feature
+    public void pushBulkJob_bulkWithSize3_instancesNamesAreExactlyAsExpected() {
+        int bulkSize = 3;
+
+        final ServiceInstantiation request = generateMockServiceInstantiationPayload(
+                false,
+                createVnfList(instanceParamsMapWithoutParams, Collections.EMPTY_LIST, true),
+                bulkSize, true,PROJECT_NAME, true
+        );
+
+        // in "createJob()" we will probe the service, with the generated names
+        final Job job = mock(Job.class);
+        when(job.getStatus()).thenReturn(PENDING);
+        when(jobAdapter.createJob(any(), any(), any(), any(), any())).thenReturn(job);
+
+
+        final List<UUID> uuids = asyncInstantiationBL.pushBulkJob(request, "myUserId");
+
+
+        ArgumentCaptor<ServiceInstantiation> serviceInstantiationCaptor = new ArgumentCaptor<ServiceInstantiation>();
+        verify(jobAdapter, times(bulkSize)).createJob(any(), serviceInstantiationCaptor.capture(), any(), any(), any());
+
+        assertThat(serviceInstantiationCaptor.getAllValues().stream().map(v -> v.getInstanceName()).collect(Collectors.toList()),
+                containsInAnyOrder("vPE_Service_001", "vPE_Service_002", "vPE_Service_003"));
+
+        assertThat(uuids, hasSize(bulkSize));
+    }
+
+    @Test
+    public void generateMockServiceInstantiationPayload_serializeBackAndForth_sourceShouldBeTheSame() throws IOException {
+        ServiceInstantiation serviceInstantiationPayload = generateMockServiceInstantiationPayload(
+                false,
+                createVnfList(instanceParamsMapWithoutParams, ImmutableList.of(vnfInstanceParamsMapWithParamsToRemove, vnfInstanceParamsMapWithParamsToRemove), true),
+                2, false,PROJECT_NAME, false);
+        ObjectMapper mapper = new ObjectMapper();
+        final String asString = mapper.writeValueAsString(serviceInstantiationPayload);
+
+        final ServiceInstantiation asObject = mapper.readValue(asString, ServiceInstantiation.class);
+        final String asString2 = mapper.writeValueAsString(asObject);
+
+        JsonAssert.assertJsonEquals(asString, asString2);
+    }
+
+    public static class ServiceInfoComparator implements Comparator<ServiceInfo> {
+
+        @Override
+        public int compare(ServiceInfo o1, ServiceInfo o2) {
+            int compare;
+
+            compare = o1.getCreatedBulkDate().compareTo(o2.getCreatedBulkDate());
+            if (compare != 0) {
+                return -compare;
+            }
+
+            // check jobStatus priority
+            int o1Priority = getPriority(o1);
+            int o2Priority = getPriority(o2);
+            compare = o1Priority - o2Priority;
+            if (compare != 0) {
+                return compare;
+            }
+
+            // check statusModifiedDate
+            return o1.getStatusModifiedDate().compareTo(o2.getStatusModifiedDate());
+        }
+
+        private int getPriority(ServiceInfo o) throws JSONException {
+            Job.JobStatus status = o.getJobStatus();
+            switch (status) {
+                case COMPLETED:
+                case FAILED:
+                    return 1;
+                case IN_PROGRESS:
+                    return 2;
+                case PAUSE:
+                    return 3;
+                case STOPPED:
+                case PENDING:
+                    return 4;
+                default:
+                    return 5;
+            }
+        }
+    }
+
+    @DataProvider
+    public Object[][] pauseAndInstanceParams() {
+        return new Object[][]{
+                {Boolean.TRUE, instanceParamsMapWithoutParams, Collections.EMPTY_LIST},
+                {Boolean.FALSE, instanceParamsMapWithoutParams, Collections.EMPTY_LIST},
+                {Boolean.TRUE, vfModuleInstanceParamsMapWithParamsToRemove, Collections.singletonList(vnfInstanceParamsMapWithParamsToRemove)}
+        };
+    }
+
+    private ServiceInstantiation generateMockServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs) {
+        return generateMockServiceInstantiationPayload(isPause, vnfs, 1, true, PROJECT_NAME, false);
+    }
+
+    @Test
+    public void testUpdateServiceInfo_WithExistingServiceInfo_ServiceInfoIsUpdated() {
+        UUID uuid = createJobAndServiceInfo();
+        final String STEPH_CURRY = "Steph Curry";
+        asyncInstantiationBL.updateServiceInfo(uuid, x -> {
+            x.setServiceInstanceName(STEPH_CURRY);
+            x.setJobStatus(Job.JobStatus.IN_PROGRESS);
+        });
+        Optional<ServiceInfo> optionalServiceInfo = getJobById(uuid);
+        assertThat(optionalServiceInfo.get().getServiceInstanceName(), equalTo(STEPH_CURRY));
+        assertThat(optionalServiceInfo.get().getJobStatus(), equalTo(Job.JobStatus.IN_PROGRESS));
+    }
+
+    private Optional<ServiceInfo> getJobById(UUID jobId) {
+        List<ServiceInfo> serviceInfoList = dataAccessService.getList(ServiceInfo.class, null);
+        return serviceInfoList.stream().filter(x -> jobId.equals(x.getJobId())).findFirst();
+    }
+
+    private UUID createJobAndServiceInfo() {
+        UUID uuid = UUID.randomUUID();
+        addNewJob(uuid);
+        ServiceInfo serviceInfo = new ServiceInfo();
+        serviceInfo.setServiceInstanceName("Lebron James");
+        serviceInfo.setJobId(uuid);
+        serviceInfo.setJobStatus(Job.JobStatus.PENDING);
+        dataAccessService.saveDomainObject(serviceInfo, getPropsMap());
+        return uuid;
+    }
+
+    @Test(expectedExceptions = GenericUncheckedException.class, expectedExceptionsMessageRegExp = UPDATE_SERVICE_INFO_EXCEPTION_MESSAGE)
+    public void testUpdateServiceInfo_WithNonExisting_ThrowException() {
+        asyncInstantiationBL.updateServiceInfo(UUID.randomUUID(), x -> x.setServiceInstanceName("not matter"));
+    }
+
+    @Test(expectedExceptions = GenericUncheckedException.class, expectedExceptionsMessageRegExp = UPDATE_SERVICE_INFO_EXCEPTION_MESSAGE)
+    public void testUpdateServiceInfo_WithDoubleServiceWithSameJobUuid_ThrowException() {
+        UUID uuid = createJobAndServiceInfo();
+        ServiceInfo serviceInfo = new ServiceInfo();
+        serviceInfo.setJobId(uuid);
+        dataAccessService.saveDomainObject(serviceInfo, getPropsMap());
+        asyncInstantiationBL.updateServiceInfo(UUID.randomUUID(), x -> x.setServiceInstanceName("not matter"));
+    }
+
+
+
+    @Test
+    public void testRequestPath_WithPauseFlagTrue_RequestPathIsAsExpected() {
+        ServiceInstantiation serviceInstantiationPauseFlagTrue = generateMockServiceInstantiationPayload(true, createVnfList(instanceParamsMapWithoutParams, Collections.EMPTY_LIST, true));
+        String path = asyncInstantiationBL.getServiceInstantiationPath(serviceInstantiationPauseFlagTrue);
+        Assert.assertEquals(path, SystemProperties.getProperty("mso.restapi.serviceInstanceAssign"));
+    }
+
+    @Test
+    public void testRequestPath_WithPauseFlagFalse_RequestPathIsAsExpected() {
+        ServiceInstantiation serviceInstantiationPauseFlagFalse = generateMockServiceInstantiationPayload(false, createVnfList(instanceParamsMapWithoutParams, Collections.EMPTY_LIST, true));
+        String path = asyncInstantiationBL.getServiceInstantiationPath(serviceInstantiationPauseFlagFalse);
+        Assert.assertEquals(path, SystemProperties.getProperty("mso.restapi.serviceInstanceCreate"));
+    }
+
+    @Test
+    public void createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected() throws IOException {
+        createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(true);
+    }
+
+    @Test
+    public void createServiceInfo_WithUserProvidedNamingFalseAndNoVfmodules_ServiceInfoIsAsExpected() throws IOException {
+        createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(false);
+    }
+
+    private void createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(boolean withVfmodules) throws IOException {
+        ServiceInstantiation serviceInstantiationPayload = generateMockServiceInstantiationPayload(true,
+                createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, Collections.EMPTY_LIST, false),
+                1,
+                false,PROJECT_NAME, true);
+        URL resource;
+        if (withVfmodules) {
+            resource = this.getClass().getResource("/payload_jsons/bulk_service_request_ecomp_naming.json");
+        } else {
+            // remove the vf modules
+            serviceInstantiationPayload.getVnfs().values().forEach(vnf -> vnf.getVfModules().clear());
+            resource = this.getClass().getResource("/payload_jsons/bulk_service_request_no_vfmodule_ecomp_naming.json");
+        }
+
+        RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
+                asyncInstantiationBL.generateServiceInstantiationRequest(null, serviceInstantiationPayload, "az2016");
+
+        String expected = IOUtils.toString(resource, "UTF-8");
+        MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+    }
+
+    @Test
+    public void checkIfNullProjectNameSentToMso(){
+        ServiceInstantiation serviceInstantiationPayload = generateMockServiceInstantiationPayload(true,
+                createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, Collections.EMPTY_LIST, false),
+                1,
+                false,null,false);
+        RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
+                asyncInstantiationBL.generateServiceInstantiationRequest(null, serviceInstantiationPayload, "az2016");
+        JsonNode jsonNode = new ObjectMapper().valueToTree(result.requestDetails);
+        Assert.assertTrue(jsonNode.get("project").isNull());
+        serviceInstantiationPayload = generateMockServiceInstantiationPayload(true,
+                createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, Collections.EMPTY_LIST, false),
+                1,
+                false,"not null",false);
+        result = asyncInstantiationBL.generateServiceInstantiationRequest(null, serviceInstantiationPayload, "az2016");
+        jsonNode = new ObjectMapper().valueToTree(result.requestDetails);
+        Assert.assertTrue(jsonNode.get("project").get("projectName").asText().equalsIgnoreCase("not null"));
+
+
+
+    }
+
+    @Test
+    public void pushBulkJob_verifyCreatedDateBehavior_createdDateIsTheSameForAllServicesInSameBulk() {
+        LocalDateTime startTestDate = LocalDateTime.now().withNano(0);
+        final ServiceInstantiation request = generateMockServiceInstantiationPayload(
+                false,
+                createVnfList(instanceParamsMapWithoutParams, Collections.EMPTY_LIST, true),
+                100, true,PROJECT_NAME, true
+        );
+
+        // in "createJob()" we will probe the service, with the generated names
+        final Job job = mock(Job.class);
+        when(job.getStatus()).thenReturn(PENDING);
+        when(jobAdapter.createJob(any(), any(), any(), any(), any())).thenReturn(job);
+
+        asyncInstantiationBL.pushBulkJob(request, "myUserId");
+        List<ServiceInfo> serviceInfoList = dataAccessService.getList(ServiceInfo.class, getPropsMap());
+
+        List<Date> creationDates = new ArrayList<>();
+        for (ServiceInfo serviceInfo : serviceInfoList) {
+            creationDates.add(serviceInfo.getCreatedBulkDate());
+        }
+        LocalDateTime endTestDate = LocalDateTime.now();
+
+        //creation date of all services is the same
+        Assert.assertTrue(creationDates.stream().distinct().count() <= 1);
+        LocalDateTime creationDate = fromDate(creationDates.get(0));
+        assertFalse(creationDate.isBefore(startTestDate));
+        assertFalse(creationDate.isAfter(endTestDate));
+    }
+
+    @DataProvider
+    public static Object[][] msoToJobStatusDataProvider() {
+        return new Object[][]{
+                {"IN_PROGRESS", JobStatus.IN_PROGRESS},
+                {"INPROGRESS", JobStatus.IN_PROGRESS},
+                {"IN ProGREsS", JobStatus.IN_PROGRESS},
+                {"JAMES_HARDEN", JobStatus.IN_PROGRESS},
+                {"FAILED", JobStatus.FAILED},
+                {"COMpleTE", JobStatus.COMPLETED},
+                {"PENDING", JobStatus.IN_PROGRESS},
+                {"Paused", JobStatus.PAUSE},
+                {"Pause", JobStatus.PAUSE},
+                {"PENDING_MANUAL_TASK", JobStatus.PAUSE},
+                {"UNLOCKED", JobStatus.IN_PROGRESS}
+        };
+    }
+
+    @Test(dataProvider = "msoToJobStatusDataProvider")
+    void whenGetStatusFromMso_calcRightJobStatus(String msoStatus, Job.JobStatus expectedJobStatus) {
+        AsyncRequestStatus asyncRequestStatus = asyncRequestStatusResponse(msoStatus);
+        assertThat(asyncInstantiationBL.calcStatus(asyncRequestStatus), equalTo(expectedJobStatus));
+    }
+
+    private void createNewAuditStatus(JobAuditStatus auditStatus)
+    {
+        Date createdDate= auditStatus.getCreated();
+        dataAccessService.saveDomainObject(auditStatus, getPropsMap());
+        setDateToStatus(auditStatus.getSource(), auditStatus.getJobStatus(), createdDate);
+    }
+
+
+
+    private static final String MSO_ARBITRARY_STATUS = "completed mso status";
+
+    @DataProvider
+    public static Object[][] auditStatuses(Method test) {
+        return new Object[][]{
+                {
+                        SourceStatus.VID,
+                        new String[]{ JobStatus.PENDING.toString(), JobStatus.IN_PROGRESS.toString()}
+                },
+                {       SourceStatus.MSO,
+                        new String[]{ JobStatus.IN_PROGRESS.toString(), MSO_ARBITRARY_STATUS }
+                }
+        };
+
+    }
+
+    private void setDateToStatus(SourceStatus source, String status, Date date) {
+        List<JobAuditStatus> jobAuditStatusList = dataAccessService.getList(JobAuditStatus.class, getPropsMap());
+        DaoUtils.tryWithSessionAndTransaction(sessionFactory, session -> {
+            jobAuditStatusList.stream()
+                    .filter(auditStatus -> source.equals(auditStatus.getSource()) && status.equals(auditStatus.getJobStatus()))
+                    .forEach(auditStatus -> {
+                        auditStatus.setCreated(date);
+                        session.saveOrUpdate(auditStatus);
+                    });
+            return 1;
+        });
+    }
+
+
+    @Test(dataProvider = "auditStatuses")
+    public void givenSomeAuditStatuses_getStatusesOfSpecificSourceAndJobId_getSortedResultsMatchingToParameters(SourceStatus expectedSource, String [] expectedSortedStatuses){
+        UUID jobUuid = UUID.randomUUID();
+        List<JobAuditStatus> auditStatusList = com.google.common.collect.ImmutableList.of(
+                new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.VID, toDate(LocalDateTime.now().minusHours(2))),
+                new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, UUID.randomUUID(),"",toDate(LocalDateTime.now().minusHours(30))),
+                new JobAuditStatus(jobUuid, MSO_ARBITRARY_STATUS, SourceStatus.MSO, UUID.randomUUID(),"",toDate(LocalDateTime.now().minusHours(3))),
+                new JobAuditStatus(jobUuid, PENDING.toString(), SourceStatus.VID, toDate(LocalDateTime.now().minusHours(3))),
+                new JobAuditStatus(UUID.randomUUID(), PENDING.toString(), SourceStatus.VID, toDate(LocalDateTime.now().minusHours(3))));
+        auditStatusList.forEach((auditStatus) -> createNewAuditStatus(auditStatus));
+        List<JobAuditStatus> statuses = asyncInstantiationBL.getAuditStatuses(jobUuid, expectedSource);
+        List<String> statusesList = statuses.stream().map(status -> status.getJobStatus()).collect(Collectors.toList());
+        Assert.assertTrue(statuses.stream().allMatch(status -> (status.getSource().equals(expectedSource)&& status.getJobId().equals(jobUuid))),"Only statuses of " + expectedSource + " for " + jobUuid + " should be returned. Returned statuses: " + String.join(",", statusesList ));
+        assertThat(statusesList, contains(expectedSortedStatuses));
+    }
+
+
+
+    @Test
+    public void addSomeVidStatuses_getThem_verifyGetInsertedWithoutDuplicates(){
+        ImmutableList<JobStatus> statusesToBeInserted = ImmutableList.of(PENDING, IN_PROGRESS, IN_PROGRESS, COMPLETED);
+        UUID jobUuid = UUID.randomUUID();
+        statusesToBeInserted.forEach(status->
+            {
+                asyncInstantiationBL.auditVidStatus(jobUuid, status);
+            });
+        List<String> statusesFromDB = asyncInstantiationBL.getAuditStatuses(jobUuid, SourceStatus.VID).stream().map(auditStatus -> auditStatus.getJobStatus()).collect(Collectors.toList());
+        List<String> statusesWithoutDuplicates = statusesToBeInserted.stream().distinct().map(x -> x.toString()).collect(Collectors.toList());
+        assertThat(statusesFromDB, is(statusesWithoutDuplicates));
+    }
+
+    @DataProvider
+    public static Object[][] msoAuditStatuses(Method test) {
+        UUID jobUuid = UUID.randomUUID();
+        UUID requestId = UUID.randomUUID();
+        return new Object[][]{
+                {
+                        jobUuid,
+                        ImmutableList.of(
+                                new JobAuditStatus(jobUuid, PENDING.toString(), SourceStatus.MSO, null, null),
+                                new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
+                                new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
+                                new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
+                                new JobAuditStatus(jobUuid, COMPLETED.toString(), SourceStatus.MSO, requestId, null)),
+                        ImmutableList.of(PENDING.toString(), IN_PROGRESS.toString(), COMPLETED.toString()),
+                        "All distinct statuses should be without duplicates"
+                },
+                {
+                        jobUuid,
+                        ImmutableList.of(
+                                new JobAuditStatus(jobUuid, PENDING.toString(), SourceStatus.MSO, null, null),
+                                new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
+                                new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, "aa"),
+                                new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, "aa"),
+                                new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, UUID.randomUUID(), "aa"),
+                                new JobAuditStatus(jobUuid, COMPLETED.toString(), SourceStatus.MSO, requestId, null)),
+                        ImmutableList.of(PENDING.toString(), IN_PROGRESS.toString(), IN_PROGRESS.toString(),IN_PROGRESS.toString(), COMPLETED.toString()),
+                        "Statuses should be without duplicates only with same requestId and additionalInfo"
+
+                }
+        };
+    }
+
+    @Test(dataProvider = "msoAuditStatuses")
+    public void addSomeMsoStatuses_getThem_verifyGetInsertedWithoutDuplicates(UUID jobUuid, ImmutableList<JobAuditStatus> msoStatuses, ImmutableList<String> expectedStatuses, String assertionReason) {
+        msoStatuses.forEach(status -> {
+            asyncInstantiationBL.auditMsoStatus(status.getJobId(), status.getJobStatus(), status.getRequestId() != null ? status.getRequestId().toString() : null, status.getAdditionalInfo());
+        });
+        List<String> statusesFromDB = asyncInstantiationBL.getAuditStatuses(jobUuid, SourceStatus.MSO).stream().map(auditStatus -> auditStatus.getJobStatus()).collect(Collectors.toList());
+        assertThat( assertionReason, statusesFromDB, is(expectedStatuses));
+    }
+
+    @Test
+    public void addSameStatusOfVidAndMso_verifyThatBothWereAdded(){
+        UUID jobUuid = UUID.randomUUID();
+        JobStatus sameStatus = IN_PROGRESS;
+        asyncInstantiationBL.auditMsoStatus(jobUuid, sameStatus.toString(),null,null);
+        asyncInstantiationBL.auditVidStatus(jobUuid, sameStatus);
+        List<JobAuditStatus> list = dataAccessService.getList(
+                JobAuditStatus.class,
+                String.format(" where JOB_ID = '%s'", jobUuid),
+                null, null);
+        Assert.assertEquals(list.size(),2);
+        assertThat(list,everyItem(hasProperty("jobStatus", is(sameStatus.toString()))));
+    }
+
+    @Test
+    public void verifyAsyncRequestStatus_canBeReadFromSample() throws IOException {
+        String body = "{" +
+                "  \"request\": {" +
+                "    \"requestId\": \"c0011670-0e1a-4b74-945d-8bf5aede1d9c\"," +
+                "    \"startTime\": \"Mon, 11 Dec 2017 07:27:49 GMT\"," +
+                "    \"requestScope\": \"service\"," +
+                "    \"requestType\": \"createInstance\"," +
+                "    \"instanceReferences\": {" +
+                "      \"serviceInstanceId\": \"f8791436-8d55-4fde-b4d5-72dd2cf13cfb\"," +
+                "      \"serviceInstanceName\": \"asdfasdf234234asdf\"," +
+                "      \"requestorId\": \"il883e\"" +
+                "    }," +
+                "    \"requestStatus\": {" +
+                "      \"requestState\": \"COMPLETE\"," +
+                "      \"statusMessage\": \"Service Instance was created successfully.\"," +
+                "      \"percentProgress\": 100," +
+                "      \"finishTime\": \"Mon, 11 Dec 2017 07:27:53 GMT\"" +
+                "    }" +
+                "  }" +
+                "}";
+        ObjectMapper objectMapper = new ObjectMapper();
+        AsyncRequestStatus asyncRequestStatus = objectMapper.readValue(body, AsyncRequestStatus.class);
+        assertThat(asyncRequestStatus.request.requestStatus.getRequestState(), equalTo("COMPLETE"));
+
+    }
+
+    @Test
+    public void deleteJobInfo_pending_deleted() {
+        doNothing().when(jobsBrokerService).delete(any());
+        UUID uuid = createServicesInfoWithDefaultValues(PENDING);
+        asyncInstantiationBL.deleteJob(uuid);
+        assertNotNull(asyncInstantiationBL.getServiceInfoByJobId(uuid).getDeletedAt(), "service info wasn't deleted");
+    }
+
+    @Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE)
+    public void deleteJobInfo_notAllowdStatus_shouldSendError() {
+        UUID uuid = createServicesInfoWithDefaultValues(COMPLETED);
+        doThrow(new IllegalStateException(DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE)).when(jobsBrokerService).delete(any());
+        try {
+            asyncInstantiationBL.deleteJob(uuid);
+        } catch (Exception e) {
+            assertNull(asyncInstantiationBL.getServiceInfoByJobId(uuid).getDeletedAt(), "service info shouldn't deleted");
+            throw e;
+        }
+    }
+
+    @DataProvider
+    public Object[][] jobStatusesFinal() {
+        return Arrays.stream(Job.JobStatus.values())
+                .filter(t -> ImmutableList.of(COMPLETED, FAILED, STOPPED).contains(t))
+                .map(v -> new Object[]{v}).collect(Collectors.toList()).toArray(new Object[][]{});
+    }
+
+    @Test(dataProvider = "jobStatusesFinal")
+    public void whenHideService_theServiceNotReturnedInServiceList(JobStatus jobStatus) {
+        UUID uuidToHide = createServicesInfoWithDefaultValues(jobStatus);
+        UUID uuidToShown = createServicesInfoWithDefaultValues(jobStatus);
+        List<UUID> serviceInfoList = listServicesUUID();
+        assertThat(serviceInfoList, hasItems(uuidToHide, uuidToShown));
+
+        asyncInstantiationBL.hideServiceInfo(uuidToHide);
+        serviceInfoList = listServicesUUID();
+        assertThat(serviceInfoList, hasItem(uuidToShown));
+        assertThat(serviceInfoList, not(hasItem(uuidToHide)));
+
+    }
+
+    protected List<UUID> listServicesUUID() {
+        return asyncInstantiationBL.getAllServicesInfo().stream().map(ServiceInfo::getJobId).collect(Collectors.toList());
+    }
+
+    @DataProvider
+    public Object[][] jobStatusesNotFinal() {
+        return Arrays.stream(Job.JobStatus.values())
+                .filter(t -> ImmutableList.of(PENDING, IN_PROGRESS, PAUSE).contains(t))
+                .map(v -> new Object[]{v}).collect(Collectors.toList()).toArray(new Object[][]{});
+    }
+
+    @Test(  dataProvider = "jobStatusesNotFinal",
+            expectedExceptions = OperationNotAllowedException.class,
+            expectedExceptionsMessageRegExp = "jobId.*Service status does not allow hide service, status = .*")
+    public void hideServiceInfo_notAllowedStatus_shouldSendError(JobStatus jobStatus) {
+        UUID uuid = createServicesInfoWithDefaultValues(jobStatus);
+        try {
+            asyncInstantiationBL.hideServiceInfo(uuid);
+        } catch (Exception e) {
+            assertFalse(asyncInstantiationBL.getServiceInfoByJobId(uuid).isHidden(), "service info shouldn't be hidden");
+            throw e;
+        }
+    }
+
+    @Test
+    public void whenUseGetCounterInMultiThreads_EachThreadGetDifferentCounter() throws InterruptedException {
+        int SIZE = 200;
+        ExecutorService executor = Executors.newFixedThreadPool(SIZE);
+        List<Callable<Integer>> tasks = IntStream.rangeClosed(1, SIZE)
+                .mapToObj(x-> ((Callable<Integer>)() -> asyncInstantiationBL.getCounterForName("a")))
+                .collect(Collectors.toList());
+        Set<Integer> expectedResults = IntStream.rangeClosed(1, SIZE).boxed().collect(Collectors.toSet());
+        executor.invokeAll(tasks)
+                .forEach(future -> {
+                    try {
+                        assertTrue( expectedResults.remove(future.get()), "got unexpected counter");
+                    }
+                    catch (Exception e) {
+                        throw new RuntimeException(e);
+                    }
+                });
+
+        assertThat(expectedResults.size(), is(0));
+    }
+
+    @Test
+    public void whenUseGetCounterForSameName_numbersReturnedByOrder() {
+
+        String name = UUID.randomUUID().toString();
+        int SIZE=10;
+        for (int i=1; i<=SIZE; i++) {
+            assertThat(asyncInstantiationBL.getCounterForName(name), is(i));
+        }
+    }
+
+    @Test
+    public void whenNamedInUsedInAai_getNextNumber() {
+        String name = someCommonStepsAndGetName();
+        ResourceType type = ResourceType.GENERIC_VNF;
+        when(aaiClient.searchNodeTypeByName(name+"_001", type)).thenReturn(aaiNodeQueryResponseNameUsed(type));
+        when(aaiClient.searchNodeTypeByName(name+"_002", type)).thenReturn(aaiNodeQueryResponseNameFree());
+        assertThat(asyncInstantiationBL.getUniqueName(name, type), equalTo(name+"_002"));
+    }
+
+    private String someCommonStepsAndGetName() {
+        mockAaiClientAaiStatusOK();
+        return UUID.randomUUID().toString();
+    }
+
+    private void mockAaiClientAaiStatusOK() {
+        when(aaiClient.searchNodeTypeByName(eq(AsyncInstantiationBusinessLogicImpl.NAME_FOR_CHECK_AAI_STATUS), any())).thenReturn(aaiNodeQueryResponseNameFree());
+    }
+
+    @Test(expectedExceptions=InvalidAAIResponseException.class)
+    public void whenAaiBadResponseCode_throwInvalidAAIResponseException() {
+        String name = someCommonStepsAndGetName();
+        ResourceType type = ResourceType.SERVICE_INSTANCE;
+        when(aaiClient.searchNodeTypeByName(name+"_001", type)).thenReturn(aaiNodeQueryBadResponse());
+        asyncInstantiationBL.getUniqueName(name, type);
+    }
+
+    @Test(expectedExceptions=MaxRetriesException.class)
+    public void whenAaiAlwaysReturnNameUsed_throwInvalidAAIResponseException() {
+        String name = someCommonStepsAndGetName();
+        ResourceType type = ResourceType.VF_MODULE;
+        when(aaiClient.searchNodeTypeByName(any(), eq(type))).thenReturn(aaiNodeQueryResponseNameUsed(type));
+        asyncInstantiationBL.setMaxRetriesGettingFreeNameFromAai(10);
+        asyncInstantiationBL.getUniqueName(name, type);
+    }
+
+    @Test
+    public void testFormattingOfNameAndCounter() {
+        AsyncInstantiationBusinessLogicImpl bl = (AsyncInstantiationBusinessLogicImpl) asyncInstantiationBL;
+        assertThat(bl.formatNameAndCounter("x", 3), equalTo("x_003"));
+        assertThat(bl.formatNameAndCounter("x", 99), equalTo("x_099"));
+        assertThat(bl.formatNameAndCounter("x", 100), equalTo("x_100"));
+        assertThat(bl.formatNameAndCounter("x", 1234), equalTo("x_1234"));
+    }*/
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/services/CsvServiceTest.java b/onap-enabler-be/src/test/java/org/onap/osam/services/CsvServiceTest.java
new file mode 100644
index 0000000..1847e18
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/services/CsvServiceTest.java
@@ -0,0 +1,102 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+//package org.onap.vid.services;
+//import org.apache.commons.io.IOUtils;
+//import org.onap.vid.services.CsvServiceImpl;
+//import org.skyscreamer.jsonassert.JSONAssert;
+//import org.skyscreamer.jsonassert.JSONCompareMode;
+//import org.testng.Assert;
+//import org.testng.annotations.DataProvider;
+//import org.testng.annotations.Test;
+//import org.json.JSONObject;
+//
+//import javax.ws.rs.BadRequestException;
+//import java.io.IOException;
+//import java.lang.reflect.Method;
+//import java.net.URL;
+//import java.util.List;
+//
+//@Test
+//public class CsvServiceTest {
+//
+//    private CsvServiceImpl csvService = new CsvServiceImpl();
+//    private final static String CSV_FOLDER = "csv_files/{CSV_FILE}";
+//    private final static String VALID_CSV = "csv_to_json.csv";
+//    private final static String ONE_LINE_CSV = "one_line.csv";
+//    private final static String EMPTY_CSV = "empty_file.csv";
+//    private final static String MISSING_CONTENT_CSV = "missing_content.csv";
+//    private final static String MISSING_VALUES_CSV = "missing_values.csv";
+//
+//
+///*
+//    @Test
+//    public void parseValidCsv() throws IllegalAccessException, IOException, InstantiationException {
+//        String expectedJson = getExpectation("vnfConfigUpdatePayload.json");
+//        readAndParse(VALID_CSV,16,expectedJson);
+//
+//    }*/
+//
+//    private String getExpectation(String modelFileName) throws IOException {
+//        // load expected result
+//        final URL resource = this.getClass().getResource("/" + modelFileName);
+//        String expected = IOUtils.toString(resource, "UTF-8");
+//        return expected;
+//    }
+///*
+//    @Test
+//    public void parseOneLineCsv() throws IllegalAccessException, IOException, InstantiationException {
+//        String expectedJson ="{\"payload\":{\"request-parameters\":{\"vnf-name\":\"ibcx0099v\"}}}";
+//        readAndParse(ONE_LINE_CSV,1,expectedJson);
+//    }*/
+//
+//    @DataProvider
+//    public static Object[][] invalidFiles(Method test) {
+//        return new Object[][]{
+//                {MISSING_CONTENT_CSV}, {MISSING_VALUES_CSV}
+//        };
+//    }
+///*
+//    @Test(dataProvider = "invalidFiles", expectedExceptions = {BadRequestException.class}, expectedExceptionsMessageRegExp = "Invalid csv file")
+//    public void parseMissingContentCsv(String invalidFile) throws IllegalAccessException, IOException, InstantiationException {
+//        readAndParse(invalidFile, 2, null);
+//    }
+//
+//
+//    @Test
+//    public void parseEmptyCsv() throws IllegalAccessException, IOException, InstantiationException {
+//        String expectedJson ="{}";
+//        readAndParse(EMPTY_CSV,0,expectedJson);
+//    }
+//
+//    private void readAndParse(String fileName, int expectedNumRows, String expectedJson) throws IllegalAccessException, IOException, InstantiationException {
+//        final URL resource = CsvServiceTest.class.getClassLoader().getResource(CSV_FOLDER.replaceFirst("\\{CSV_FILE\\}", fileName));
+//        Assert.assertNotNull(resource, "The csv file was not found");
+//        List<String[]> content = csvService.readCsv(resource.getPath());
+//        Assert.assertEquals(content.size(), expectedNumRows, "The number of non-empty lines in file is wrong");
+//        JSONObject json = csvService.convertCsvToJson (content);
+//        JSONAssert.assertEquals(expectedJson, json, JSONCompareMode.STRICT);
+//
+//    }*/
+//
+//
+//}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/services/JobsBrokerServiceTest.java b/onap-enabler-be/src/test/java/org/onap/osam/services/JobsBrokerServiceTest.java
new file mode 100644
index 0000000..e9f6f2a
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/services/JobsBrokerServiceTest.java
@@ -0,0 +1,625 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.services;
+
+//
+//import com.google.common.collect.ImmutableList;
+//import com.google.common.collect.ImmutableMap;
+//import org.apache.commons.lang.RandomStringUtils;
+//import org.apache.commons.lang3.RandomUtils;
+//import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+//import org.apache.commons.lang3.builder.ToStringStyle;
+//import org.hibernate.SessionFactory;
+//import org.onap.vid.exceptions.GenericUncheckedException;
+//import org.onap.vid.exceptions.OperationNotAllowedException;
+//import org.onap.vid.job.Job;
+//import org.onap.vid.job.JobAdapter;
+//import org.onap.vid.job.JobType;
+//import org.onap.vid.job.JobsBrokerService;
+//import org.onap.vid.job.impl.JobDaoImpl;
+//import org.onap.vid.job.impl.JobsBrokerServiceInDatabaseImpl;
+//import org.onap.vid.utils.DaoUtils;
+//import org.onap.vid.config.DataSourceConfig;
+//import org.onap.vid.config.JobAdapterConfig;
+//import org.onap.portalsdk.core.domain.support.DomainVo;
+//import org.onap.portalsdk.core.service.DataAccessService;
+//import org.onap.portalsdk.core.util.SystemProperties;
+//import org.springframework.test.context.ContextConfiguration;
+//import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
+//import org.testng.Assert;
+//import org.testng.annotations.AfterMethod;
+//import org.testng.annotations.BeforeMethod;
+//import org.testng.annotations.DataProvider;
+//import org.testng.annotations.Test;
+//
+//import javax.inject.Inject;
+//import java.lang.reflect.Method;
+//import java.time.LocalDateTime;
+//import java.time.ZoneId;
+//import java.util.*;
+//import java.util.concurrent.*;
+//import java.util.stream.Collectors;
+//import java.util.stream.IntStream;
+//import java.util.stream.Stream;
+//
+//import static java.util.concurrent.TimeUnit.MILLISECONDS;
+//import static org.hamcrest.CoreMatchers.equalTo;
+//import static org.hamcrest.CoreMatchers.is;
+//import static org.hamcrest.MatcherAssert.assertThat;
+//import static org.hamcrest.Matchers.both;
+//import static org.hamcrest.Matchers.containsInAnyOrder;
+//import static org.onap.vid.job.Job.JobStatus.*;
+//import static org.onap.vid.utils.Streams.not;
+//import static org.testng.Assert.assertNotNull;
+//import static org.testng.AssertJUnit.assertEquals;
+//
+//@ContextConfiguration(classes = {DataSourceConfig.class, SystemProperties.class, JobAdapterConfig.class})
+//public class JobsBrokerServiceTest extends AbstractTestNGSpringContextTests {
+//
+//    private static final int JOBS_COUNT = 127;
+//    private static final boolean DELETED = true;
+//    private final ExecutorService executor = Executors.newFixedThreadPool(90);
+//
+//    private final Set<Long> threadsIds = new ConcurrentSkipListSet<>();
+//
+//    private final long FEW = 500;
+//
+//    private final String JOBS_SHOULD_MATCH = "the jobs that added and those that pulled must be the same";
+//    private final String JOBS_PEEKED_SHOULD_MATCH = "the jobs that added and those that peeked must be the same";
+//    private static final String DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE = "Service status does not allow deletion from the queue";
+//    private static final String DELETE_SERVICE_NOT_EXIST_EXCEPTION_MESSAGE = "Service does not exist";
+//    private JobsBrokerService broker;
+//
+//    @Inject
+//    JobAdapter jobAdapter;
+//    @Inject
+//    private DataAccessService dataAccessService;
+//    @Inject
+//    private SessionFactory sessionFactory;
+//
+//
+//    private class NoJobException extends RuntimeException {
+//    }
+//
+//    private Future<Job> newJobAsync(JobsBrokerService b) {
+//        return newJobAsync(b, createMockJob("user id"));
+//    }
+//
+//    private Future<Job> newJobAsync(JobsBrokerService b, Job.JobStatus status) {
+//        return newJobAsync(b, createMockJob("user id", status));
+//    }
+//
+//    private Job createMockJob(String userId) {
+//        return jobAdapter.createJob(
+//                JobType.NoOp,
+//                new JobAdapter.AsyncJobRequest() {
+//                    public int nothing = 42;
+//                },
+//                UUID.randomUUID(),
+//                userId,
+//                RandomUtils.nextInt());
+//    }
+//
+//    private Job createMockJob(String userId, Job.JobStatus jobStatus) {
+//        Job job = createMockJob(userId);
+//        job.setStatus(jobStatus);
+//        return job;
+//    }
+//
+//    private Future<Job> newJobAsync(JobsBrokerService b, Job job) {
+//        final Future<Job> jobFuture = executor.submit(() -> {
+//            accountThreadId();
+//
+//            b.add(job);
+//
+//            return job;
+//        });
+//        return jobFuture;
+//    }
+//
+//    private void pushBackJobAsync(JobsBrokerService b, Job job) {
+//        executor.submit(() -> {
+//            accountThreadId();
+//            b.pushBack(job);
+//            return job;
+//        });
+//    }
+//
+//    private Future<Optional<Job>> pullJobAsync(JobsBrokerService broker) {
+//        final Future<Optional<Job>> job = executor.submit(() -> {
+//            accountThreadId();
+//            // Pull only pending jobs, as H2 database does not support our SQL for in-progress jobs
+//            return broker.pull(Job.JobStatus.PENDING, UUID.randomUUID().toString());
+//        });
+//        return job;
+//    }
+//
+//    private Job waitForFutureOptionalJob(Future<Optional<Job>> retrievedOptionalJobFuture) {
+//        try {
+//            return retrievedOptionalJobFuture.get(FEW, MILLISECONDS).orElseThrow(NoJobException::new);
+//        } catch (TimeoutException | InterruptedException | ExecutionException e) {
+//            throw new RuntimeException(e);
+//        }
+//    }
+//
+//    private Job waitForFutureJob(Future<Job> retrievedJobFuture) {
+//        try {
+//            return retrievedJobFuture.get(FEW, MILLISECONDS);
+//        } catch (TimeoutException | InterruptedException | ExecutionException e) {
+//            throw new RuntimeException(e);
+//        }
+//    }
+//
+//    private List<Job> putAndGetALotOfJobs(JobsBrokerService broker) {
+//        final List<Job> originalJobs = putALotOfJobs(broker);
+//        final List<Job> retrievedJobs = getAlotOfJobs(broker);
+//
+//        assertThat(JOBS_SHOULD_MATCH, retrievedJobs, containsInAnyOrder(originalJobs.toArray()));
+//
+//        return retrievedJobs;
+//    }
+//
+//    private List<Job> putALotOfJobs(JobsBrokerService broker) {
+//        int n = JOBS_COUNT;
+//        return IntStream.range(0, n)
+//                .mapToObj(i -> newJobAsync(broker))
+//                .map(this::waitForFutureJob)
+//                .collect(Collectors.toList());
+//    }
+//
+//    private List<Job> getAlotOfJobs(JobsBrokerService broker) {
+//        int n = JOBS_COUNT;
+//        return IntStream.range(0, n)
+//                .mapToObj(i -> pullJobAsync(broker))
+//                .map(this::waitForFutureOptionalJob)
+//                .collect(Collectors.toList());
+//    }
+//
+//    private void pushBackJobs(List<Job> jobs, JobsBrokerService broker) {
+//        jobs.forEach(job -> pushBackJobAsync(broker, job));
+//    }
+//
+//    private void accountThreadId() {
+//        threadsIds.add(Thread.currentThread().getId());
+//    }
+//
+//    @AfterMethod
+//    public void threadsCounter() {
+//        System.out.println("participating threads count: " + threadsIds.size());
+//        threadsIds.clear();
+//    }
+//
+//    @BeforeMethod
+//    public void initializeBroker() {
+//        broker = new JobsBrokerServiceInDatabaseImpl(dataAccessService, sessionFactory, 200, 0);
+//        ((JobsBrokerServiceInDatabaseImpl) broker).deleteAll();
+//    }
+//
+//    @Test
+//    public void givenSingleJob_getIt_verifySameJob() {
+//        final Job originalJob = waitForFutureJob(newJobAsync(broker));
+//
+//        final Job retrievedJob = waitForFutureOptionalJob(pullJobAsync(broker));
+//        assertThat(JOBS_SHOULD_MATCH, retrievedJob, is(originalJob));
+//    }
+//
+//    @Test
+//    public void givenManyJobs_getJobsAndPushThemBack_alwaysSeeAllOfThemWithPeek() throws InterruptedException {
+//        final List<Job> originalJobs = putALotOfJobs(broker);
+//
+//        MILLISECONDS.sleep(FEW);
+//        assertThat(JOBS_PEEKED_SHOULD_MATCH, broker.peek(), containsInAnyOrder(originalJobs.toArray()));
+//
+//        final Job retrievedJob = waitForFutureOptionalJob(pullJobAsync(broker));
+//
+//        MILLISECONDS.sleep(FEW);
+//        assertThat(JOBS_PEEKED_SHOULD_MATCH, broker.peek(), containsInAnyOrder(originalJobs.toArray()));
+//
+//        pushBackJobAsync(broker, retrievedJob);
+//
+//        MILLISECONDS.sleep(FEW);
+//        assertThat(JOBS_PEEKED_SHOULD_MATCH, broker.peek(), containsInAnyOrder(originalJobs.toArray()));
+//    }
+//
+//    @Test
+//    public void givenManyJobs_getThemAll_verifySameJobs() {
+//        putAndGetALotOfJobs(broker);
+//    }
+//
+//    @Test
+//    public void givenManyJobs_getThemAllThenPushBackandGet_verifySameJobs() {
+//        final List<Job> retrievedJobs1 = putAndGetALotOfJobs(broker);
+//
+//        pushBackJobs(retrievedJobs1, broker);
+//        final List<Job> retrievedJobs2 = getAlotOfJobs(broker);
+//
+//        assertThat(JOBS_SHOULD_MATCH, retrievedJobs2, containsInAnyOrder(retrievedJobs1.toArray()));
+//    }
+//
+//    private static Date toDate(LocalDateTime localDateTime) {
+//        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+//    }
+//
+//    private void setModifiedDateToJob(UUID jobUuid, Date date) {
+//        DomainVo job = dataAccessService.getDomainObject(JobDaoImpl.class, jobUuid, DaoUtils.getPropsMap());
+//        job.setModified(date);
+//        DaoUtils.tryWithSessionAndTransaction(sessionFactory, session -> {
+//            session.saveOrUpdate(job);
+//            return 1;
+//        });
+//    }
+//
+//
+//    public static JobDaoImpl createNewJob(Integer indexInBulk, UUID templateId, String userId, Job.JobStatus status, String takenBy, LocalDateTime date) {
+//        return createNewJob(indexInBulk, templateId, userId, status, takenBy, date, false);
+//    }
+//
+//    public static JobDaoImpl createNewJob(Integer indexInBulk, UUID templateId, String userId, Job.JobStatus status, String takenBy, LocalDateTime date, boolean deleted){
+//        JobDaoImpl job = new JobDaoImpl();
+//        job.setTypeAndData(JobType.NoOp, ImmutableMap.of("x", RandomStringUtils.randomAlphanumeric(15)));
+//        job.setIndexInBulk(indexInBulk);
+//        job.setTemplateId(templateId);
+//        job.setType(JobType.NoOp);
+//        job.setStatus(status);
+//        job.setTakenBy(takenBy);
+//        job.setCreated(toDate(date));
+//        job.setModified(toDate(date));
+//        job.setUserId(userId);
+//        if (deleted) {
+//            job.setDeletedAt(new Date());
+//        }
+//        return job;
+//    }
+//
+//    @DataProvider
+//    public static Object[][] jobs(Method test) {
+//        LocalDateTime oldestDate = LocalDateTime.now().minusHours(30);
+//        UUID sameTemplate = UUID.randomUUID();
+//        return new Object[][]{
+//                {ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userId", PENDING, null, oldestDate),
+//                        createNewJob(22, UUID.randomUUID(), "userId", PENDING, null, oldestDate),
+//                        createNewJob(11, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2)),
+//                        createNewJob(44, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(5))),
+//                        4,
+//                        0,
+//                        PENDING,
+//                        "Broker should pull the first pending job by oldest date then by job index"
+//                },
+//                { ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userId", COMPLETED,null, oldestDate),
+//                        createNewJob(11, UUID.randomUUID(), "userId", PENDING,null, oldestDate, DELETED),createNewJob(12, UUID.randomUUID(), "userId", FAILED,null, oldestDate),
+//                        createNewJob(13, UUID.randomUUID(), "userId", IN_PROGRESS,null, oldestDate),
+//                        createNewJob(14, UUID.randomUUID(), "userId", STOPPED,null, oldestDate),
+//                        createNewJob(22, UUID.randomUUID(), "userId", PENDING,null, oldestDate),
+//                        createNewJob(33, UUID.randomUUID(), "userId", PENDING,null, LocalDateTime.now().minusHours(2))),
+//                  6,
+//                  5,
+//                  PENDING,
+//                  "Broker should pull the only pending - first pending job by oldest job - ignore deleted,completed, failed, in-progress and stopped statuses"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+//                        createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+//                        createNewJob(33, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+//                        2,
+//                        -1,
+//                        PENDING,
+//                        "Broker should not pull any job when it exceeded mso limit with count (in-progress) statuses"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+//                        createNewJob(22, UUID.randomUUID(), "userId", PENDING, UUID.randomUUID().toString(), oldestDate),
+//                        createNewJob(33, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+//                        2,
+//                        -1,
+//                        PENDING,
+//                        "Broker should not pull any job when it exceeded mso limit with count(in-progress or pending && taken) statuses"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+//                        createNewJob(22, UUID.randomUUID(), "userId", PENDING, UUID.randomUUID().toString(), oldestDate),
+//                        createNewJob(33, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+//                        3,
+//                        2,
+//                        PENDING,
+//                        "Broker should pull first job when it doesn't exceeded mso limit with count(in-progress or pending && taken) statuses"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, sameTemplate, "userId", PENDING, UUID.randomUUID().toString(), oldestDate),
+//                        createNewJob(22, sameTemplate, "userId", PENDING, null, oldestDate),
+//                        createNewJob(33, sameTemplate, "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+//                        3,
+//                        -1,
+//                        PENDING,
+//                        "Broker should not pull any job when there is another job from this template that was taken"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, sameTemplate, "userId", IN_PROGRESS, null, oldestDate),
+//                        createNewJob(22, sameTemplate, "userId", PENDING, null, oldestDate),
+//                        createNewJob(33, sameTemplate, "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+//                        3,
+//                        -1,
+//                        PENDING,
+//                        "Broker should not pull any job when there is another job from this template that in progress"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, sameTemplate, "userId", FAILED, null, oldestDate),
+//                        createNewJob(22, sameTemplate, "userId", STOPPED, null, oldestDate),
+//                        createNewJob(33, sameTemplate, "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+//                        3,
+//                        -1,
+//                        PENDING,
+//                        "Broker should not pull any job when there is another job from this template that was failed"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, sameTemplate, "userId", FAILED, null, oldestDate, DELETED),
+//                        createNewJob(22, sameTemplate, "userId", STOPPED,null, oldestDate),
+//                        createNewJob(33, sameTemplate, "userId", PENDING,null, LocalDateTime.now().minusHours(2))),
+//                   3,
+//                   2,
+//                   PENDING,
+//                   "Broker should pull pending job when there is another job from this template that was deleted, although failed"
+//                },
+//                { ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userA", IN_PROGRESS, null, oldestDate),
+//                        createNewJob(22, UUID.randomUUID(), "userA", PENDING, null, oldestDate),
+//                        createNewJob(33, UUID.randomUUID(), "userB", PENDING, null, LocalDateTime.now().minusHours(2))),
+//                        3,
+//                        2,
+//                        PENDING,
+//                        "Broker should prioritize jobs of user that has no in-progress jobs"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userA", PENDING, UUID.randomUUID().toString(), oldestDate),
+//                        createNewJob(22, UUID.randomUUID(), "userA", PENDING, null, oldestDate),
+//                        createNewJob(33, UUID.randomUUID(), "userB", PENDING, null, LocalDateTime.now().minusHours(2))),
+//                        3,
+//                        2,
+//                        PENDING,
+//                        "Broker should prioritize jobs of user that has no taken jobs"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userA", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+//                        createNewJob(22, UUID.randomUUID(), "userA", PENDING, null, LocalDateTime.now().minusHours(2)),
+//                        createNewJob(31, UUID.randomUUID(), "userB", IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
+//                        createNewJob(32, UUID.randomUUID(), "userB", IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
+//                        createNewJob(33, UUID.randomUUID(), "userB", PENDING, null, oldestDate)),
+//                        5,
+//                        4,
+//                        PENDING,
+//                        "Broker should take oldest job when there is one in-progress job to each user"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), UUID.randomUUID().toString(), IN_PROGRESS, null, oldestDate),
+//                        createNewJob(22, UUID.randomUUID(), UUID.randomUUID().toString(), IN_PROGRESS, null, oldestDate),
+//                        createNewJob(33, UUID.randomUUID(), UUID.randomUUID().toString(), PENDING, null, LocalDateTime.now().minusHours(2))),
+//                        2,
+//                        -1,
+//                        PENDING,
+//                        "Broker should not pull any job when it exceeded mso limit with count(in-progress or pending && taken) statuses"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+//                        createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS, null, oldestDate),
+//                        createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
+//                        createNewJob(44, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusHours(5))),
+//                        20,
+//                        1,
+//                        IN_PROGRESS,
+//                        "Broker with in progress topic should pull the first in progress and not taken job by oldest date"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userId", COMPLETED, null, oldestDate),
+//                        createNewJob(12, UUID.randomUUID(), "userId", FAILED, null, oldestDate),
+//                        createNewJob(13, UUID.randomUUID(), "userId", PENDING,null, oldestDate),
+//                        createNewJob(14, UUID.randomUUID(), "userId", STOPPED,null, oldestDate),
+//                        createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS,null, oldestDate, DELETED),createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS,null, oldestDate),
+//                        createNewJob(33, UUID.randomUUID(), "userId", IN_PROGRESS,null, LocalDateTime.now().minusHours(2))),
+//                  20,
+//                  5,
+//                  IN_PROGRESS,
+//                  "Broker with in progress topic should pull only in-progress jobs - first in-progress job by oldest date - ignore deleted,completed, failed, pending and stopped statuses"
+//                },
+//                {ImmutableList.of(
+//                        createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now()),
+//                        createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusSeconds(1)),
+//                        createNewJob(33, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusSeconds(2))),
+//                        20,
+//                        -1,
+//                        IN_PROGRESS,
+//                        "Broker with in progress topic should not pull any job if its modified date is smaller than now-interval (20 seconds)"
+//                }
+//
+//        };
+//    }
+//
+//
+//    @Test(dataProvider = "jobs")
+//    public void givenSomeJobs_pullNextJob_returnNextOrNothingAsExpected(List<JobDaoImpl> jobs, int msoLimit, int expectedIndexSelected, Job.JobStatus topic, String assertionReason) {
+//        JobsBrokerServiceInDatabaseImpl broker = new JobsBrokerServiceInDatabaseImpl(dataAccessService, sessionFactory, msoLimit, 20);
+//        for (JobDaoImpl job : jobs) {
+//            Date modifiedDate = job.getModified();
+//            broker.add(job);
+//            setModifiedDateToJob(job.getUuid(), modifiedDate);
+//        }
+//        Optional<Job> nextJob = broker.pull(topic, UUID.randomUUID().toString());
+//        boolean shouldAnyBeSelected = expectedIndexSelected >= 0;
+//        Assert.assertEquals(nextJob.isPresent(), shouldAnyBeSelected, assertionReason);
+//        if (shouldAnyBeSelected) {
+//            Assert.assertEquals(jobs.get(expectedIndexSelected), nextJob.get(), assertionReason);
+//        }
+//    }
+//
+//    @DataProvider
+//    public Object[][] topics() {
+//        return Arrays.stream(Job.JobStatus.values())
+//                .filter(not(t -> ImmutableList.of(PENDING, IN_PROGRESS).contains(t)))
+//                .map(v -> new Object[]{v}).collect(Collectors.toList()).toArray(new Object[][]{});
+//    }
+//
+//    @Test(dataProvider = "topics", expectedExceptions = GenericUncheckedException.class, expectedExceptionsMessageRegExp = "Unsupported topic.*")
+//    public void pullUnexpectedTopic_exceptionIsThrown(Job.JobStatus topic) {
+//        broker.pull(topic, UUID.randomUUID().toString());
+//    }
+//
+//    @Test(expectedExceptions = NoJobException.class)
+//    public void givenNonPendingJobs_getJobAsPendingTopic_verifyNothingRetrieved() {
+//        Stream.of(Job.JobStatus.values())
+//                .filter(not(s -> s.equals(PENDING)))
+//                .map(s -> createMockJob("some user id", s))
+//                .map(job -> newJobAsync(broker, job))
+//                .map(this::waitForFutureJob)
+//                .collect(Collectors.toList());
+//
+//        waitForFutureOptionalJob(pullJobAsync(broker));
+//    }
+//
+//    @Test
+//    public void givenPendingAndNonPendingJobs_getJobAsPendingTopic_verifyAJobRetrieved() {
+//        newJobAsync(broker); // this negated the expected result of the call below
+//        givenNonPendingJobs_getJobAsPendingTopic_verifyNothingRetrieved();
+//    }
+//
+//    @Test(expectedExceptions = NoJobException.class)
+//    public void givenManyJobs_pullThemAllAndAskOneMore_verifyFinallyNothingRetrieved() {
+//        putAndGetALotOfJobs(broker);
+//        waitForFutureOptionalJob(pullJobAsync(broker));
+//    }
+//
+//    @Test(expectedExceptions = NoJobException.class)
+//    public void givenNoJob_requestJob_verifyNothingRetrieved() throws InterruptedException, ExecutionException, TimeoutException {
+//        final Future<Optional<Job>> futureOptionalJob = pullJobAsync(broker);
+//        assertThat("job should not be waiting yet", futureOptionalJob.get(FEW, MILLISECONDS).isPresent(), is(false));
+//        waitForFutureOptionalJob(futureOptionalJob);
+//    }
+//
+//    @Test(expectedExceptions = IllegalStateException.class)
+//    public void givenSinglePulledJob_pushBackDifferentJob_verifyPushingRejected() {
+//        waitForFutureJob(newJobAsync(broker));
+//        waitForFutureJob(newJobAsync(broker));
+//        waitForFutureOptionalJob(pullJobAsync(broker));
+//
+//        Job myJob = createMockJob("user id");
+//        myJob.setUuid(UUID.randomUUID());
+//
+//        broker.pushBack(myJob); //Should fail
+//    }
+//
+//    @Test
+//    public void givenSingleJob_pushBackModifiedJob_verifyPulledIsVeryVeryTheSame() {
+//        final ImmutableMap<String, Object> randomDataForMostRecentJobType =
+//                ImmutableMap.of("42", 42, "complex", ImmutableList.of("a", "b", "c"));
+//
+//        waitForFutureJob(newJobAsync(broker));
+//        final Job job = waitForFutureOptionalJob(pullJobAsync(broker));
+//
+//        job.setStatus(Job.JobStatus.PENDING);
+//        job.setTypeAndData(JobType.NoOp, ImmutableMap.of("good", "morning"));
+//        job.setTypeAndData(JobType.HttpCall, ImmutableMap.of());
+//        job.setTypeAndData(JobType.ServiceInstantiation, randomDataForMostRecentJobType);
+//
+//        broker.pushBack(job);
+//        final Job retrievedJob = waitForFutureOptionalJob(pullJobAsync(broker));
+//
+//        assertThat(JOBS_SHOULD_MATCH, retrievedJob, is(job));
+//        assertThat(JOBS_SHOULD_MATCH, retrievedJob.getData(), both(equalTo(job.getData())).and(equalTo(randomDataForMostRecentJobType)));
+//        assertThat(JOBS_SHOULD_MATCH, jobDataReflected(retrievedJob), is(jobDataReflected(job)));
+//    }
+//
+//    private static String jobDataReflected(Job job) {
+//        return new ReflectionToStringBuilder(job, ToStringStyle.SHORT_PREFIX_STYLE)
+//                .setExcludeFieldNames("created", "modified", "takenBy")
+//                .toString();
+//    }
+//
+//    @Test(expectedExceptions = IllegalStateException.class)
+//    public void givenSingleJob_pushBackTwice_verifyPushingRejected() {
+//        waitForFutureJob(newJobAsync(broker));
+//        final Job job = waitForFutureOptionalJob(pullJobAsync(broker));
+//
+//        broker.pushBack(job);
+//        broker.pushBack(job); //Should fail
+//    }
+//
+//    @Test
+//    public void addJob_PeekItById_verifySameJobWasPeeked() {
+//        String userId = UUID.randomUUID().toString();
+//        Job myJob = createMockJob(userId);
+//        UUID uuid = broker.add(myJob);
+//        Job peekedJob = broker.peek(uuid);
+//        assertEquals("added testId is not the same as peeked TestsId",
+//                userId,
+//                peekedJob.getData().get("userId"));
+//    }
+//
+//    @Test(dataProvider = "jobStatusesForSuccessDelete", expectedExceptions = NoJobException.class)
+//       public void givenOneJob_deleteIt_canPeekOnItButCantPull(Job.JobStatus status) {
+//        final Job job = waitForFutureJob(newJobAsync(broker, status));
+//        broker.delete(job.getUuid());
+//        assertNotNull(((JobDaoImpl) broker.peek(job.getUuid())).getDeletedAt(), "job should be deleted");
+//        waitForFutureOptionalJob(pullJobAsync(broker));
+//    }
+//
+//    @DataProvider
+//    public static Object[][] jobStatusesForSuccessDelete() {
+//        return new Object[][]{
+//                {PENDING},
+//                {STOPPED}
+//        };
+//    }
+//
+//    @Test(
+//            dataProvider = "jobStatusesForFailedDelete",
+//            expectedExceptions = OperationNotAllowedException.class,
+//            expectedExceptionsMessageRegExp=DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE
+//    )
+//    public void deleteJob_notAllowedStatus_exceptionIsThrown(Job.JobStatus status, boolean taken) {
+//        final Job job = waitForFutureJob(newJobAsync(broker, createMockJob("some user id", status)));
+//
+//        if (taken) {
+//            waitForFutureOptionalJob(pullJobAsync(broker));
+//        }
+//
+//
+//        broker.delete(job.getUuid());
+//    }
+//
+//    @DataProvider
+//    public static Object[][] jobStatusesForFailedDelete() {
+//        return new Object[][]{
+//                {PENDING, true},
+//                {IN_PROGRESS, false},
+//                {COMPLETED, false},
+//                {PAUSE, false},
+//                {FAILED, false},
+//        };
+//    }
+//
+//    @Test(expectedExceptions = OperationNotAllowedException.class, expectedExceptionsMessageRegExp = DELETE_SERVICE_NOT_EXIST_EXCEPTION_MESSAGE)
+//    public void deleteJob_notExist_exceptionIsThrown() {
+//        waitForFutureJob(newJobAsync(broker, createMockJob("some user id", PENDING)));
+//        broker.delete(new UUID(111, 111));
+//    }
+//
+//}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/services/PortDetailsTranslatorTest.java b/onap-enabler-be/src/test/java/org/onap/osam/services/PortDetailsTranslatorTest.java
new file mode 100644
index 0000000..f9db3ce
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/services/PortDetailsTranslatorTest.java
@@ -0,0 +1,305 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.services;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableList;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.osam.aai.model.AaiGetPortMirroringSourcePorts;
+import org.onap.osam.aai.model.PortDetailsTranslator;
+import org.onap.osam.aai.model.RelatedTo;
+import org.onap.osam.aai.model.SimpleResult;
+import org.onap.osam.properties.Features;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import org.togglz.core.manager.FeatureManager;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.collection.IsEmptyCollection.empty;
+import static org.mockito.Mockito.when;
+
+public class PortDetailsTranslatorTest {
+
+    private static final ObjectMapper om = new ObjectMapper();
+
+    @InjectMocks
+    private PortDetailsTranslator portDetailsTranslator = new PortDetailsTranslator();
+
+    @Mock
+    private FeatureManager featureManager;
+
+    @BeforeMethod
+    public void initMocks() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        when(featureManager.isActive(Features.FLAG_ADVANCED_PORTS_FILTER)).thenReturn(true);
+    }
+
+    @Test
+    public void extractPortDetailsFromProperties_givenValidAaiResponse() throws IOException {
+
+        final String aaiResponse  = "{\n" +
+                "    \"results\": [\n" +
+                "        {\n" +
+                "            \"id\": \"4876980240\",\n" +
+                "            \"node-type\": \"l-interface\",\n" +
+                "            \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
+                "            \"properties\": {\n" +
+                "                \"interface-name\": \"zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
+                "                \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
+                "                \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
+                "                \"macaddr\": \"02:6d:e7:bf:87:6f\",\n" +
+                "                \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\",\n" +
+                "                \"is-port-mirrored\": false,\n" +
+                "                \"resource-version\": \"1519383879190\",\n" +
+                "                \"in-maint\": false,\n" +
+                "                \"is-ip-unnumbered\": false\n" +
+                "            }\n" +
+                "        }\n" +
+                "    ]\n" +
+                "}";
+
+        AaiGetPortMirroringSourcePorts aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, AaiGetPortMirroringSourcePorts.class);
+
+
+        PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(), aaiResponse);
+
+        assertThat(portDetails, is(instanceOf(PortDetailsTranslator.PortDetailsOk.class)));
+
+        PortDetailsTranslator.PortDetailsOk portDetailsOk = (PortDetailsTranslator.PortDetailsOk) portDetails;
+        assertThat(portDetailsOk.getInterfaceName(), is("zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib"));
+        assertThat(portDetailsOk.getInterfaceId(), is("6de7bf87-6faa-4984-9492-18d1188b3d4a"));
+        assertThat(portDetailsOk.getIsPortMirrored(), is(false));
+    }
+
+    @Test
+    public void extractPortDetailsFromProperties_givenAaiResponseWithInstanceNameNull_yieldException() throws IOException {
+        final String aaiResponse  = "{\n" +
+                "    \"results\": [\n" +
+                "        {\n" +
+                "            \"id\": \"4876980240\",\n" +
+                "            \"node-type\": \"l-interface\",\n" +
+                "            \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
+                "            \"properties\": {\n" +
+                "                \"interface-name\": null,\n" +
+                "                \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
+                "                \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
+                "                \"macaddr\": \"02:6d:e7:bf:87:6f\",\n" +
+                "                \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\",\n" +
+                "                \"is-port-mirrored\": false,\n" +
+                "                \"resource-version\": \"1519383879190\",\n" +
+                "                \"in-maint\": false,\n" +
+                "                \"is-ip-unnumbered\": false\n" +
+                "            }\n" +
+                "        }\n" +
+                "    ]\n" +
+                "}";
+
+        AaiGetPortMirroringSourcePorts aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, AaiGetPortMirroringSourcePorts.class);
+        PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(),aaiResponse);
+
+        assertThat(portDetails, is(instanceOf(PortDetailsTranslator.PortDetailsError.class)));
+
+        PortDetailsTranslator.PortDetailsError portDetailsError = (PortDetailsTranslator.PortDetailsError) portDetails;
+        assertThat(portDetailsError.getErrorDescription(), is("Value of 'interface-name' is missing."));
+        assertThat(portDetailsError.getRawAaiResponse(), is(aaiResponse));
+    }
+
+    @Test
+    public void extractPortDetailsFromProperties_givenAaiResponseWithInstanceIdNull_yieldException() throws IOException {
+        final String aaiResponse  = "{\n" +
+                "    \"results\": [\n" +
+                "        {\n" +
+                "            \"id\": \"4876980240\",\n" +
+                "            \"node-type\": \"l-interface\",\n" +
+                "            \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
+                "            \"properties\": {\n" +
+                "                \"interface-name\": \"zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
+                "                \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
+                "                \"interface-id\": null,\n" +
+                "                \"macaddr\": \"02:6d:e7:bf:87:6f\",\n" +
+                "                \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\",\n" +
+                "                \"is-port-mirrored\": false,\n" +
+                "                \"resource-version\": \"1519383879190\",\n" +
+                "                \"in-maint\": false,\n" +
+                "                \"is-ip-unnumbered\": false\n" +
+                "            }\n" +
+                "        }\n" +
+                "    ]\n" +
+                "}";
+
+        AaiGetPortMirroringSourcePorts aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, AaiGetPortMirroringSourcePorts.class);
+        PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(),aaiResponse);
+
+        assertThat(portDetails, is(instanceOf(PortDetailsTranslator.PortDetailsError.class)));
+
+        PortDetailsTranslator.PortDetailsError portDetailsError = (PortDetailsTranslator.PortDetailsError) portDetails;
+        assertThat(portDetailsError.getErrorDescription(), is("Value of 'interface-id' is missing."));
+        assertThat(portDetailsError.getRawAaiResponse(), is(aaiResponse));
+    }
+
+    @Test
+    public void extractPortDetailsFromProperties_givenAaiResponseWithEmptyInstanceId_yieldException() throws IOException {
+        final String aaiResponse  = "{\n" +
+                "    \"results\": [\n" +
+                "        {\n" +
+                "            \"id\": \"4876980240\",\n" +
+                "            \"node-type\": \"l-interface\",\n" +
+                "            \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
+                "            \"properties\": {\n" +
+                "                \"interface-name\": \"\",\n" +
+                "                \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
+                "                \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
+                "                \"macaddr\": \"02:6d:e7:bf:87:6f\",\n" +
+                "                \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\",\n" +
+                "                \"is-port-mirrored\": false,\n" +
+                "                \"resource-version\": \"1519383879190\",\n" +
+                "                \"in-maint\": false,\n" +
+                "                \"is-ip-unnumbered\": false\n" +
+                "            }\n" +
+                "        }\n" +
+                "    ]\n" +
+                "}";
+
+        AaiGetPortMirroringSourcePorts aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, AaiGetPortMirroringSourcePorts.class);
+        PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(),aaiResponse);
+
+        assertThat(portDetails, is(instanceOf(PortDetailsTranslator.PortDetailsError.class)));
+
+        PortDetailsTranslator.PortDetailsError portDetailsError = (PortDetailsTranslator.PortDetailsError) portDetails;
+        assertThat(portDetailsError.getErrorDescription(), is("Value of 'interface-name' is empty."));
+        assertThat(portDetailsError.getRawAaiResponse(), is(aaiResponse));
+    }
+
+    @Test
+    public void extractPortDetailsFromProperties_givenAaiResponseWithIsPortMirroredNull_yieldException() throws IOException {
+        final String aaiResponse  = "{\n" +
+                "    \"results\": [\n" +
+                "        {\n" +
+                "            \"id\": \"4876980240\",\n" +
+                "            \"node-type\": \"l-interface\",\n" +
+                "            \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
+                "            \"properties\": {\n" +
+                "                \"interface-name\": \"zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
+                "                \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
+                "                \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
+                "                \"macaddr\": \"02:6d:e7:bf:87:6f\",\n" +
+                "                \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\",\n" +
+                "                \"is-port-mirrored\": null,\n" +
+                "                \"resource-version\": \"1519383879190\",\n" +
+                "                \"in-maint\": false,\n" +
+                "                \"is-ip-unnumbered\": false\n" +
+                "            }\n" +
+                "        }\n" +
+                "    ]\n" +
+                "}";
+
+        AaiGetPortMirroringSourcePorts aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, AaiGetPortMirroringSourcePorts.class);
+        PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(),aaiResponse);
+
+        assertThat(portDetails, is(instanceOf(PortDetailsTranslator.PortDetailsError.class)));
+
+        PortDetailsTranslator.PortDetailsError portDetailsError = (PortDetailsTranslator.PortDetailsError) portDetails;
+        assertThat(portDetailsError.getErrorDescription(), is("Value of 'is-port-mirrored' is missing."));
+        assertThat(portDetailsError.getRawAaiResponse(), is(aaiResponse));
+    }
+
+    @Test
+    public void getFilteredPortList_givenEmptyList_ReturnEmptyList() {
+
+        final ImmutableList<SimpleResult> input = ImmutableList.of();
+
+        List<SimpleResult> result = portDetailsTranslator.getFilteredPortList(input);
+        assertThat("List size if different than expected", result, is(empty()));
+    }
+
+    @DataProvider
+    public static Object[][] trueAndFalse() {
+        return new Object[][]{
+                { Boolean.TRUE }, { Boolean.FALSE }
+        };
+    }
+
+    @Test(dataProvider = "trueAndFalse")
+    public void getFilteredPortList_givenFeatureFlagIsOff_returnAllLInterfaces(Boolean advancedPortsFilterFlag) throws IOException {
+        when(featureManager.isActive(Features.FLAG_ADVANCED_PORTS_FILTER)).thenReturn(advancedPortsFilterFlag);
+
+        final String relationshipLabelSource = "org.onap.relationships.inventory.Source";
+        final String nodeTypeLInterface = "l-interface";
+
+        SimpleResult lInterfaceWithSource =
+                buildSimpleResult(nodeTypeLInterface, relationshipLabelSource);
+        SimpleResult lInterfaceWithTwoSources =
+                buildSimpleResult(nodeTypeLInterface, relationshipLabelSource, relationshipLabelSource);
+        SimpleResult lInterfaceWithSourceAndMore =
+                buildSimpleResult(nodeTypeLInterface, relationshipLabelSource, "not a source");
+        SimpleResult lInterfaceWithoutSource =
+                buildSimpleResult(nodeTypeLInterface, "not a source");
+        SimpleResult lInterfaceWithoutRelations =
+                buildSimpleResult(nodeTypeLInterface);
+        SimpleResult fooTypeWithSource =
+                buildSimpleResult("not an l-interface", relationshipLabelSource);
+        SimpleResult fooTypeWithoutSource =
+                buildSimpleResult("not an l-interface", "not a source");
+
+        final ImmutableList<SimpleResult> input = ImmutableList.of(
+                fooTypeWithSource, fooTypeWithoutSource,
+                lInterfaceWithTwoSources, lInterfaceWithSourceAndMore,
+                lInterfaceWithoutSource, lInterfaceWithSource,
+                lInterfaceWithoutRelations);
+
+        List<SimpleResult> result = portDetailsTranslator.getFilteredPortList(input);
+
+        if (advancedPortsFilterFlag) {
+            assertThat("List should contain all l-interfaces with a related source", result, containsInAnyOrder(
+                    lInterfaceWithSource, lInterfaceWithSourceAndMore,
+                    lInterfaceWithTwoSources));
+        } else {
+            assertThat("List should contain all l-interfaces", result, containsInAnyOrder(
+                    lInterfaceWithSource, lInterfaceWithoutSource,
+                    lInterfaceWithoutRelations, lInterfaceWithSourceAndMore,
+                    lInterfaceWithTwoSources));
+        }
+    }
+
+    private SimpleResult buildSimpleResult(String nodeType, String... relationshipLabels) {
+        SimpleResult simpleResult = new SimpleResult();
+        simpleResult.setNodeType(nodeType);
+        simpleResult.setRelatedTo(Stream.of(relationshipLabels).map(label ->
+                new RelatedTo("my foo id", label, "logical-link", "foo url"))
+                .collect(Collectors.toList())
+        );
+        return simpleResult;
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/services/RoleGenaratorServiceImplTest.java b/onap-enabler-be/src/test/java/org/onap/osam/services/RoleGenaratorServiceImplTest.java
new file mode 100644
index 0000000..8e3f5b0
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/services/RoleGenaratorServiceImplTest.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.services;
+
+import org.junit.Test;
+
+public class RoleGenaratorServiceImplTest {
+
+    private RoleGenaratorServiceImpl createTestSubject() {
+        return new RoleGenaratorServiceImpl();
+    }
+
+    @Test
+    public void testGenerateRoleScript() throws Exception {
+        RoleGenaratorServiceImpl testSubject;
+        Boolean firstRun = null;
+        String result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.generateRoleScript(firstRun);
+    }
+
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/services/WorkflowServiceImplTest.java b/onap-enabler-be/src/test/java/org/onap/osam/services/WorkflowServiceImplTest.java
new file mode 100644
index 0000000..83e3652
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/services/WorkflowServiceImplTest.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.services;
+
+import java.util.*;
+
+import org.junit.Test;
+
+public class WorkflowServiceImplTest {
+
+    private WorkflowServiceImpl createTestSubject() {
+        return new WorkflowServiceImpl();
+    }
+
+    @Test
+    public void testGetWorkflowsForVNFs() throws Exception {
+        WorkflowServiceImpl testSubject;
+        Collection<String> vnfNames = new ArrayList<String>();
+        Collection<String> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getWorkflowsForVNFs(vnfNames);
+    }
+
+    @Test
+    public void testGetAllWorkflows() throws Exception {
+        WorkflowServiceImpl testSubject;
+        Collection<String> result;
+
+        // default test
+        testSubject = createTestSubject();
+        result = testSubject.getAllWorkflows();
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/testUtils/IntersectionTest.java b/onap-enabler-be/src/test/java/org/onap/osam/testUtils/IntersectionTest.java
new file mode 100644
index 0000000..a4d4f22
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/testUtils/IntersectionTest.java
@@ -0,0 +1,120 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.testUtils;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.osam.utils.Intersection;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class IntersectionTest {
+
+    @Test
+    public void testFourArrays(){
+        List<String> l1 = new ArrayList<String>();
+        l1.add("1");
+        l1.add("2");
+
+        List<String> l2 = new ArrayList<String>();
+        l2.add("2");
+        l2.add("3");
+
+        List<String> l3 = new ArrayList<String>();
+        l3.add("2");
+        l3.add("4");
+
+        List<String> l4 = new ArrayList<String>();
+        l4.add("2");
+        l4.add("5");
+
+        List<List<String>> all = new ArrayList<>();
+        all.add(l1);
+        all.add(l2);
+        all.add(l3);
+        all.add(l4);
+        Intersection<String> m = new Intersection<>();
+        List<String> ans = m.intersectMultipileArray(all);
+        Assert.assertEquals(1,ans.size());
+        Assert.assertEquals(ans.get(0),"2");
+
+    }
+
+
+
+    @Test
+    public void testTwoArrays(){
+        List<String> l1 = new ArrayList<String>();
+        l1.add("1");
+        l1.add("2");
+
+        List<String> l2 = new ArrayList<String>();
+        l2.add("2");
+        l2.add("3");
+
+        List<List<String>> all = new ArrayList<>();
+        all.add(l1);
+        all.add(l2);
+        Intersection<String> m = new Intersection<>();
+        List<String> l3 = m.intersectMultipileArray(all);
+        Assert.assertEquals(l3.size(),1);
+        Assert.assertEquals(l3.get(0),"2");
+
+    }
+
+
+    @Test
+    public void testNoIntersection(){
+        List<String> l1 = new ArrayList<String>();
+        l1.add("1");
+        l1.add("2");
+
+        List<String> l2 = new ArrayList<String>();
+        l2.add("3");
+        l2.add("4");
+
+        List<List<String>> all = new ArrayList<>();
+        all.add(l1);
+        all.add(l2);
+        Intersection<String> m = new Intersection<>();
+        List<String> l3 = m.intersectMultipileArray(all);
+        Assert.assertEquals(l3.size(),0);
+
+    }
+
+    @Test
+    public void testOneArrays(){
+        List<String> l1 = new ArrayList<String>();
+        l1.add("1");
+        l1.add("2");
+        List<List<String>> all = new ArrayList<>();
+        all.add(l1);
+        Intersection<String> m = new Intersection<>();
+        List<String> l3 = m.intersectMultipileArray(all);
+        Assert.assertEquals(l3.size(),2);
+        Assert.assertEquals(l3.get(0),"1");
+        Assert.assertEquals(l3.get(1),"2");
+
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/testUtils/RegExMatcher.java b/onap-enabler-be/src/test/java/org/onap/osam/testUtils/RegExMatcher.java
new file mode 100644
index 0000000..be5702e
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/testUtils/RegExMatcher.java
@@ -0,0 +1,51 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.testUtils;
+
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
+
+public class RegExMatcher extends TypeSafeMatcher<String> {
+
+    private final String regEx;
+
+    public RegExMatcher(String regEx) {
+        this.regEx = regEx;
+    }
+
+
+    @Override
+    public void describeTo(Description description) {
+        description.appendText("matches regEx="+regEx);
+    }
+
+
+    @Override
+    protected boolean matchesSafely(String item) {
+        return item.matches(regEx);
+    }
+
+    public static RegExMatcher matchesRegEx(final String regEx) {
+        return new RegExMatcher(regEx);
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/testUtils/StubServerUtil.java b/onap-enabler-be/src/test/java/org/onap/osam/testUtils/StubServerUtil.java
new file mode 100644
index 0000000..ea2f896
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/testUtils/StubServerUtil.java
@@ -0,0 +1,108 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.testUtils;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.xebialabs.restito.semantics.Action;
+import com.xebialabs.restito.semantics.Call;
+import com.xebialabs.restito.semantics.Condition;
+import com.xebialabs.restito.server.StubServer;
+
+import java.util.List;
+
+import static com.xebialabs.restito.builder.stub.StubHttp.whenHttp;
+import static com.xebialabs.restito.semantics.Action.contentType;
+import static com.xebialabs.restito.semantics.Action.stringContent;
+
+public class StubServerUtil {
+
+    private static final String APPLICATION_JSON = "application/json";
+    private ObjectMapper objectMapper;
+
+
+    private StubServer stubServer;
+
+    public StubServerUtil() {
+        this.objectMapper = new ObjectMapper();
+        this.stubServer = new StubServer();
+    }
+
+
+    public void runServer() {
+        stubServer.run();
+    }
+
+    public void runSecuredServer(){
+        stubServer.secured().run();
+    }
+
+    public void stopServer() {
+        stubServer.stop();
+    }
+
+
+    public String constructTargetUrl(String protocol, String relativePath) {
+        return String.format("%s://localhost:%s/%s", protocol, stubServer.getPort(), relativePath);
+    }
+
+    public void prepareGetCall(String path, Action actionToReturn,Object returnObj, Action expectedAction, String contentType) throws JsonProcessingException {
+        whenHttp(stubServer)
+                .match(Condition.get(path))
+                .then(expectedAction, actionToReturn, contentType(contentType));
+    }
+
+
+    public void prepareGetCall(String path, Object returnObj, Action expectedAction) throws JsonProcessingException {
+        prepareGetCall(path, jsonContent(returnObj),returnObj, expectedAction, APPLICATION_JSON);
+    }
+
+    public void prepareDeleteCall(String path, Object returnObj, Action expectedAction) throws JsonProcessingException {
+        whenHttp(stubServer)
+                .match(Condition.delete(path))
+                .then(expectedAction, jsonContent(returnObj), contentType(APPLICATION_JSON));
+    }
+
+    public void preparePostCall(String path, Object returnObj, Action expectedAction) throws JsonProcessingException {
+        whenHttp(stubServer)
+                .match(Condition.post(path),
+                        Condition.withPostBodyContaining(objectMapper.writeValueAsString(returnObj)))
+                .then(expectedAction, jsonContent(returnObj), contentType(APPLICATION_JSON));
+    }
+
+    public void preparePutCall(String path, Object returnObj, Action expectedStatus) throws JsonProcessingException {
+        whenHttp(stubServer)
+                .match(Condition.put(path),
+                        Condition.withPostBodyContaining(objectMapper.writeValueAsString(returnObj)))
+                .then(expectedStatus, jsonContent(returnObj), contentType(APPLICATION_JSON));
+    }
+
+    public List<Call> getServerCalls() {
+        return stubServer.getCalls();
+    }
+
+    private Action jsonContent(Object returnObj) throws JsonProcessingException {
+        return stringContent(objectMapper.writeValueAsString(returnObj));
+    }
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/testUtils/TestUtils.java b/onap-enabler-be/src/test/java/org/onap/osam/testUtils/TestUtils.java
new file mode 100644
index 0000000..64c985b
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/testUtils/TestUtils.java
@@ -0,0 +1,171 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.testUtils;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableList;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.Assert;
+import org.mockito.MockSettings;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import static fj.parser.Parser.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.*;
+
+public class TestUtils {
+
+    public static void assertJsonStringEqualsIgnoreNulls(String expected, String actual) {
+        if (expected == null || expected == JSONObject.NULL) {return;}
+
+        JSONObject expectedJSON = new JSONObject(expected);
+        JSONObject actualJSON = new JSONObject(actual);
+        Iterator<?> keys = expectedJSON.keys();
+
+        while( keys.hasNext() ) {
+            String key = (String)keys.next();
+            Object expectedValue = expectedJSON.get(key);
+            if (expectedValue == JSONObject.NULL){
+                continue;
+            }
+
+            Object actualValue = actualJSON.get(key);
+
+            if (expectedValue instanceof JSONObject) {
+                String expectedVal = expectedValue.toString();
+                String actualVal = actualValue.toString();
+                assertJsonStringEqualsIgnoreNulls(expectedVal, actualVal);
+            }
+            else if (expectedValue instanceof JSONArray) {
+                if (actualValue instanceof JSONArray) {
+                    JSONArray expectedJSONArray = (JSONArray)expectedValue;
+                    JSONArray actualJSONArray = (JSONArray)actualValue;
+                    for (int i = 0; i < expectedJSONArray.length(); i++) {
+                        String expectedItem = expectedJSONArray.get(i).toString();
+                        String actualItem = actualJSONArray.get(i).toString();
+                        if (expectedValue instanceof JSONObject)
+                            assertJsonStringEqualsIgnoreNulls(expectedItem, actualItem);
+                    }
+                }
+                else {
+                    fail("expected: " + expectedValue + " got:" + actualValue);
+                }
+            }
+            else {
+                Assert.assertEquals(expectedValue, actualValue);
+            }
+        }
+    }
+
+    public static <T> T readJsonResourceFileAsObject(String pathInResource, Class<T> valueType) throws IOException {
+        return readJsonResourceFileAsObject(pathInResource, valueType, false);
+    }
+
+    public static <T> T readJsonResourceFileAsObject(String pathInResource, Class<T> valueType, boolean ignoreUnknownProperties)
+            throws IOException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, ignoreUnknownProperties);
+        return objectMapper.readValue(
+                TestUtils.class.getResource(pathInResource),
+                valueType);
+    }
+
+
+    public static class JavaxRsClientMocks {
+        private final javax.ws.rs.client.Client fakeClient;
+        private final javax.ws.rs.client.Invocation.Builder fakeBuilder;
+        private final Response fakeResponse;
+
+        public javax.ws.rs.client.Client getFakeClient() {
+            return fakeClient;
+        }
+
+        public javax.ws.rs.client.Invocation.Builder getFakeBuilder() {
+            return fakeBuilder;
+        }
+
+        public Response getFakeResponse() {
+            return fakeResponse;
+        }
+
+        public JavaxRsClientMocks() {
+            final MockSettings mockSettings = withSettings().defaultAnswer(new TriesToReturnMockByType());
+
+            fakeClient = mock(javax.ws.rs.client.Client.class, mockSettings);
+            fakeBuilder = mock(javax.ws.rs.client.Invocation.Builder.class, mockSettings);
+            fakeResponse = mock(Response.class, mockSettings);
+            final javax.ws.rs.client.WebTarget fakeWebTarget = mock(javax.ws.rs.client.WebTarget.class, mockSettings);
+
+            TriesToReturnMockByType.setAvailableMocks(
+                    fakeClient,
+                    fakeWebTarget,
+                    fakeBuilder,
+                    fakeResponse
+            );
+
+            Mockito.when(fakeBuilder.get(any(Class.class))).thenReturn(null);
+            Mockito.when(fakeBuilder.get(eq(InputStream.class))).thenReturn(new ByteArrayInputStream(new byte[]{}));
+            Mockito.when(fakeBuilder.get(any(GenericType.class))).thenReturn(null);
+
+            Mockito.when(fakeResponse.getStatus()).thenReturn(200);
+            Mockito.when(fakeResponse.getStatusInfo()).thenReturn(Response.Status.OK);
+        }
+    }
+
+    /*
+       inspired out from newer Mockito version
+        returns a mock from given list if it's a matching return-type
+    */
+    private static class TriesToReturnMockByType implements Answer<Object>, Serializable {
+        private final Answer<Object> defaultReturn = RETURNS_DEFAULTS;
+        private static List<Object> availableMocks = ImmutableList.of();
+
+        static void setAvailableMocks(Object... mocks) {
+            availableMocks = ImmutableList.copyOf(mocks);
+        }
+
+        public Object answer(InvocationOnMock invocation) throws Throwable {
+            Class<?> methodReturnType = invocation.getMethod().getReturnType();
+
+            return availableMocks.stream()
+                    .filter(mock -> methodReturnType.isAssignableFrom(mock.getClass()))
+                    //.peek(m -> System.out.println("found a mock: " + m.getClass().getName()))
+                    .findFirst()
+                    .orElse(defaultReturn.answer(invocation));
+        }
+    }
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/utils/LoggingTest.java b/onap-enabler-be/src/test/java/org/onap/osam/utils/LoggingTest.java
new file mode 100644
index 0000000..252a638
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/utils/LoggingTest.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.utils;
+
+import org.junit.Test;
+
+import com.att.eelf.configuration.EELFLogger;
+
+public class LoggingTest {
+
+    private Logging createTestSubject() {
+        return new Logging();
+    }
+
+    @Test
+    public void testGetMethodName() throws Exception {
+        String result;
+
+        // default test
+        result = Logging.getMethodName();
+    }
+
+    @Test
+    public void testGetMethodCallerName() throws Exception {
+        String result;
+
+        // default test
+        result = Logging.getMethodCallerName();
+    }
+
+    @Test
+    public void testGetRequestsLogger() throws Exception {
+        String serverName = "";
+        EELFLogger result;
+
+        // default test
+        result = Logging.getRequestsLogger(serverName);
+    }
+
+
+}
diff --git a/onap-enabler-be/src/test/java/org/onap/osam/utils/LoggingUtilsTest.java b/onap-enabler-be/src/test/java/org/onap/osam/utils/LoggingUtilsTest.java
new file mode 100644
index 0000000..6187cad
--- /dev/null
+++ b/onap-enabler-be/src/test/java/org/onap/osam/utils/LoggingUtilsTest.java
@@ -0,0 +1,111 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.utils;
+
+import com.fasterxml.jackson.core.JsonLocation;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import org.onap.osam.exceptions.GenericUncheckedException;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import sun.security.provider.certpath.SunCertPathBuilderException;
+import sun.security.validator.ValidatorException;
+
+import javax.crypto.BadPaddingException;
+import javax.net.ssl.SSLHandshakeException;
+import javax.ws.rs.ProcessingException;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.onap.osam.testUtils.RegExMatcher.matchesRegEx;
+
+public class LoggingUtilsTest {
+
+    @DataProvider
+    public static Object[][] exceptions() {
+        Exception e0 = new CertificateException("No X509TrustManager implementation available");
+        Exception noTrustMngrImplException = new SSLHandshakeException(e0.toString());
+        noTrustMngrImplException.initCause(e0);
+
+        Exception e1 = new BadPaddingException("Given final block not properly padded");
+        Exception incorrectPasswordException = new IOException("keystore password was incorrect",
+                new UnrecoverableKeyException("failed to decrypt safe contents entry: " + e1));
+        String incorrectPasswordExceptionDescription = "" +
+                "java.io.IOException: keystore password was incorrect: " +
+                "java.security.UnrecoverableKeyException: failed to decrypt safe contents entry: " +
+                "javax.crypto.BadPaddingException: Given final block not properly padded";
+
+        Exception e2 = new SunCertPathBuilderException("unable to find valid certification path to requested target");
+        Exception noValidCert = new ProcessingException(new ValidatorException("PKIX path building failed: " + e2.toString(), e2));
+        String noValidCertDescription = "" +
+                "javax.ws.rs.ProcessingException: " +
+                "sun.security.validator.ValidatorException: PKIX path building failed: " +
+                "sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target";
+
+        RuntimeException fasterxmlMappingException = new RuntimeException(new JsonMappingException("Can not deserialize instance of java.lang.String out of START_ARRAY token",
+                new com.fasterxml.jackson.core.JsonLocation("{ example json }", 15, 1, 20)));
+        String fasterxmlMappingDescription = "" +
+                "com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token\n" +
+                " at [Source: { example json }; line: 1, column: 20]";
+
+        return new Object[][]{
+                {"javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No X509TrustManager implementation available",
+                        noTrustMngrImplException},
+                {"java.lang.StringIndexOutOfBoundsException: String index out of range: 4",
+                        new StringIndexOutOfBoundsException(4)},
+                {"java.io.FileNotFoundException: osam/WEB-INF/cert/aai-client-cert.p12",
+                        new FileNotFoundException("osam/WEB-INF/cert/aai-client-cert.p12")},
+                {"NullPointerException at LoggingUtilsTest.java:[0-9]+",
+                        new NullPointerException("null")},
+                {incorrectPasswordExceptionDescription,
+                        incorrectPasswordException},
+                {incorrectPasswordExceptionDescription,
+                        new GenericUncheckedException(incorrectPasswordException)},
+                {"javax.ws.rs.ProcessingException: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_expired",
+                        new ProcessingException(new SSLHandshakeException("Received fatal alert: certificate_expired"))},
+                {noValidCertDescription,
+                        noValidCert},
+                {escapeBrackets(fasterxmlMappingDescription),
+                        fasterxmlMappingException},
+                {"org.onap.osam.exceptions.GenericUncheckedException: top message: org.onap.osam.exceptions.GenericUncheckedException: root message",
+                        new GenericUncheckedException("top message", new IOException("sandwich message", new GenericUncheckedException("root message")))},
+                {"org.onap.osam.exceptions.GenericUncheckedException: basa",
+                        new GenericUncheckedException("basa")}
+        };
+
+    }
+
+    @Test(dataProvider = "exceptions")
+    public void testExceptionToDescription(String expectedDescription, Exception exceptionToDescribe) {
+        String expectedButDotsEscaped = expectedDescription.replace(".", "\\.");
+
+        assertThat(Logging.exceptionToDescription(exceptionToDescribe), matchesRegEx(expectedButDotsEscaped));
+    }
+
+    private static String escapeBrackets(String in) {
+        return in.replaceAll("[\\(\\[\\{\\)]", "\\\\$0");
+    }
+}
diff --git a/onap-enabler-be/src/test/resources/WEB-INF/conf/asdc.properties b/onap-enabler-be/src/test/resources/WEB-INF/conf/asdc.properties
new file mode 100644
index 0000000..970730b
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/WEB-INF/conf/asdc.properties
@@ -0,0 +1,17 @@
+asdc.client.type=REST
+#
+#asdc.client.rest.protocol=http
+#asdc.client.rest.host=135.21.125.36
+#asdc.client.rest.port=8080
+#asdc.client.rest.auth=Basic VklEOnZpbjNSaXBlbmVkSnVtYjBKZXRTcHJpbmtsZXM=
+#
+#dev
+#asdc.client.rest.protocol=http
+#asdc.client.rest.host=135.21.125.105
+#asdc.client.rest.port=8080
+#asdc.client.rest.auth=Basic VGVzdDoxMjM0NTY=
+#IST
+asdc.client.rest.protocol=https
+asdc.client.rest.host=asdcbe.mtsnjpw1.aic.cip.att.com
+asdc.client.rest.port=8443
+asdc.client.rest.auth=Basic dmlkOnZpZGlzdA==
diff --git a/onap-enabler-be/src/test/resources/WEB-INF/conf/quartz.properties b/onap-enabler-be/src/test/resources/WEB-INF/conf/quartz.properties
new file mode 100644
index 0000000..92ab425
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/WEB-INF/conf/quartz.properties
@@ -0,0 +1,36 @@
+#################################################################################
+# Quartz configurations for Quantum Work Flow									#
+#################################################################################
+
+org.quartz.scheduler.instanceId = AUTO
+
+#################################################################################
+# Main configurations
+org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
+org.quartz.threadPool.threadCount = 30
+
+============================================================================
+# Configure JobStore  
+#============================================================================
+
+org.quartz.jobStore.misfireThreshold = 60000
+
+org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
+org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+org.quartz.jobStore.useProperties = false
+#org.quartz.jobStore.dataSource = myDS
+org.quartz.jobStore.tablePrefix = FN_QZ_
+
+org.quartz.jobStore.isClustered = true
+org.quartz.jobStore.clusterCheckinInterval = 20000
+
+#============================================================================
+# Configure Datasources  
+#============================================================================
+
+org.quartz.dataSource.myDS.driver = org.mariadb.jdbc.Driver
+org.quartz.dataSource.myDS.URL = jdbc:mariadb://localhost:3306/vid_openecomp_epsdk
+org.quartz.dataSource.myDS.user = euser
+org.quartz.dataSource.myDS.password = euser
+org.quartz.dataSource.myDS.maxConnections = 5
+org.quartz.dataSource.myDS.validationQuery=select 0 from dual
diff --git a/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor.properties b/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor.properties
new file mode 100644
index 0000000..d0d01fd
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor.properties
@@ -0,0 +1,168 @@
+##C## Mention the name of the framework. At present RAPTOR supports FUSION
+system=fusion
+##C## Determines the priority for the debug message.
+debug_level=5
+##C## Determines the number of records can be downloaded in excel when you select "download all" option.
+download_limit=65000
+csv_download_limit=10
+##C## Determines the number of records to be displayed in a single page.
+default_page_size=50
+##C## Determines the list size in the form field.
+form_fields_list_size=99000
+##C## Determines the scheduler interval
+#scheduler_interval=0 => disabled
+scheduler_interval=0
+##C## System Name
+system_name=RAPTOR
+##C## This is used for Bread crumbs.
+base_title=ANALYSIS
+##C## whether to allow SQL-based report definition (security risk); super users are always allowed to create SQL-based reports
+allow_sql_based_reports=yes
+##C## Determines whether to include disclaimer page at the bottom of each screen
+show_disclaimer=yes
+disclaimer_positioned_top_in_csvexcel=yes
+##C## Determines whether to display the form page as a separate page before running the report
+display_form_before_run=yes
+##C## Determines whether to include the form page on the report data page
+include_form_with_data=yes
+##C## Determines whether to cache chart data in the session => faster re-display if the data volume does not get too large
+cache_chart_data=yes
+##C## Determines whether to cache report data for the currently displayed page in the session => faster re-display
+	##C## if the data volume does not get too large
+cache_cur_page_data=yes
+##C## Determines Chart width
+default_chart_width=700
+##C## Determines Chart height
+default_chart_height=420
+##C## Determines whether to permit report deletion only by report owner or by everyone with "write" access
+delete_only_by_owner=no
+##C## Determines whether to log each report execution and update time and user ID
+enable_report_log=yes
+##C## Determines whether to cache user roles info in memory (saves many DB reads, but does not account for roles
+	##C## assigned after the cache was loaded)
+cache_user_roles=yes
+##C## Determines whether to convert month formats (e.g. MM/YYYY) to the last day of the month (true) or
+        ##C## first day (false) - like 12/2003 is converted to either 12/31/2003 or 12/01/2003
+month_format_use_last_day=no
+##C## Determines whether to print the report title in the download files
+print_title_in_download=yes
+##C## Determines whether to show report description when the report is run and in the quick links
+show_descr_at_runtime=no
+##C## Determines whether to skip labels on the Line chart axis when they overlap
+#DEPRECATED skip_chart_labels_to_fit=no
+##C## Determines whether to show chart types that are purpose and/or data specific
+show_nonstandard_charts=yes
+##C## Determines whether to allow the user to change the chart type at runtime
+allow_runtime_chart_sel=yes
+##C## Determines whether to display the report title as chart title as well
+display_chart_title=yes
+##C## Determines whether to merge/blank multi-level row headings in cross-tab report
+merge_crosstab_row_headings=yes
+##C## Determines whether to display chart when displaying the report at first or just a "Show Chart" button
+display_chart_by_default=yes
+##C## Determines whether to print the form field values in the download files
+print_params_in_download=yes
+##C## Determines the limitation to the characters in chart label.
+skip_chart_labels_limit=30
+##C## Determines whether to users with read-only rights for a report can copy it
+can_copy_on_read_only=yes
+##C## Determines the no of decimals to be displayed in Totals column
+#max_decimals_on_totals=-1 => don't truncate, display all decimal digits
+max_decimals_on_totals=2
+##C## Determines which JFreeChart to use.
+jfree_version=latest
+#jfree_version=0.9.11
+# Added this restriction so that heavily used system which contain
+# more than 1000 users can enable this feature not to display whole
+# users in the drop down menu
+display_all_users=yes
+##Sheet name
+sheet_name=raptor
+#shell_script_name=/home/sundar/test.sh
+#download_query_folder=/titan/PROJECT3/RAPTOR/raptor/dwnld/query/
+## this directory is mentioned if the flat file is downloaded using shell script
+shell_script_dir=/titan/PROJECT3/RAPTOR/raptor/dwnld/
+flat_file_lower_limit=1
+flat_file_upper_limit=200000
+## whatever request mentioned here would be parsed in sql and request parameter would be filled
+request_get_params=isEmbedded
+print_footer_in_download=yes
+## footer mentioned here appears in downloaded excel
+footer_first_line=AT&T Proprietary
+footer_second_line=Use Pursuant to Company Instructions
+## to run report in popup window
+report_in_popup_window=yes
+## to run each report in new popup window if the above is selected
+popup_in_new_window=yes
+## "Yes" allows the request param to be passed to the drill down report
+pass_request_param_in_drilldown=yes
+## Show PDF download icon
+show_pdf_download=yes
+# Show Folder Tree
+show_folder_tree=no
+#Show folder tree only for Admin Users
+show_folder_tree_only_to_admin_users=no
+#folder tree should be minimized
+folder_tree_minimized=yes
+## whatever session mentioned here would be parsed in sql and session parameter would be filled
+session_params=login_id
+display_formfield_info=yes
+customize_formfield_info=yes
+#schedule limit for end users
+schedule_limit=10
+# customized query if you need any restrictions for schedule and security tab for fusion
+#schedule_custom_query_for_users=getAllUsersByCustomer
+#schedule_custom_query_for_roles=getAllRolesByCustomer
+# customized query if you need any restrictions for schedule and security tab for prisms example
+#schedule_custom_query_for_users=SELECT au.user_id, au.first_name||' '||au.last_name user_name FROM app_user au order by 2
+schedule_custom_query_for_users=SELECT au.user_id id, au.first_name||' '||au.last_name name FROM app_user au where user_id = 1 order by 2
+#schedule_custom_query_for_roles=SELECT ar.role_id, ar.descr role_name FROM app_role ar order by 2
+schedule_date_pattern=MM/dd/yyyy hh:mm:ss a
+## This is used to display in right format in chart timestamp axis as we give in the sql
+#chart_yearly_format=yyyy
+#chart_monthly_format=MMM-yyyy
+chart_daily_format=MM/dd/yyyy
+chart_hourly_format=MM/dd HH
+#chart_minute_format=HH:mm
+chart_minute_format=MM-dd-yyyy-HH:mm
+#chart_second_format=HH:mm:ss
+chart_second_format=MM-dd-yyyy
+#chart_millisecond_format=HH:mm:ss.S
+schedule_help_text=This form is used to schedule a specific Reporting Platform report to be delivered to one or more email addresses associated with your Company's Business Direct user logins.  Note that report output delivered via email does not include the capability to drill down/back up to additional data levels.  So, select the appropriate data level report for the scheduled report.  View the status of scheduled report requests in the My Schedules menu item.
+use_loginid_in_schedYN=Y
+session_params_for_scheduling=login_id
+session_date_formfield_auto_incr=yes
+display_session_param_pdfexcel=login_id;Login Id
+session_params_for_displaying_in_scheduling=login_id;Login Id
+application_server=tomcat
+#gmap properties
+gmap_key=ABQIAAAAToJSSetKBMjBJx8MiRw4ghQiU0SbbKnm8C5eu25cpyLwgkLzyRShrQTbgZtqnKAqZU9JwcSq1bKwiA
+PROJECT-FOLDER=/Users/sundar/git/st_quantum/quantum/target/quantum-1.0
+# 
+MARKET-SHAPEFILE-FOLDER=resources/files
+# output folder for files generated on server side
+OUTPUT-FOLDER=resources/temp
+# tile size in pixel
+TILE-SIZE=256
+#check if map is disabled or not
+map_allowed=Y
+max_drilldown_level=2
+admin_role_equiv_to_super_role=N
+show_loading_during_formfield_chain=Y
+show_print_icon=N
+globally_nowrap=N
+calendar_output_date_format=MM/dd/yyyy
+memory_threshold_percentage=99
+print_params_in_csv_download=yes
+notitle_in_dashboard=yes
+generate_store_sched_reports=yes
+show_excel_2007_download=yes
+print_excel_in_landscape=yes
+show_animated_chart_option=yes
+show_animated_chart_only=no
+adjust_content_based_on_height=yes
+custom_submit_button_text=Run Button
+customize_formfield_layout=yes
+#db_type=postgresql
+#db_type=oracle
+db_type=mysql
diff --git a/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor_app_fusion.properties b/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor_app_fusion.properties
new file mode 100644
index 0000000..2c65ad8
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor_app_fusion.properties
@@ -0,0 +1,20 @@
+temp_folder_path=/demeter/WebApps/dev/ECOMP_PORTAL/temp/
+upload_folder_path=/demeter/WebApps/dev/ECOMP_PORTAL/files/
+excel_template_path=/demeter/WebApps/dev/ECOMP_PORTAL/files/raptor_template/
+temp_folder_url=temp/
+upload_folder_url=upload/
+smtp_server=zeus.homer.att.com
+default_email_sender=dev-local@homer.att.com
+error_page=error_page.jsp
+jsp_context_path=raptor/
+img_folder_url=static/fusion/raptor/images/
+base_folder_url=static/fusion/raptor/
+direct_access_url=http://localhost:8080/quantum/raptor_email_attachment.htm?action=raptor&source_page=report_run&display_content=y
+#base_action_url=report.htm#/report_run/
+drill_action_url=report.htm#/report_run/c_master=
+base_action_url=report_wizard.htm?action=
+base_action_url_ng=report#/
+base_action_param=c_master=
+super_role_id=1
+admin_role_ids=1
+quick_links_menu_ids=HOME,CUSTOMER,REPORTS
diff --git a/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor_db_fusion.properties b/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor_db_fusion.properties
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor_db_fusion.properties
diff --git a/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor_pdf.properties b/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor_pdf.properties
new file mode 100644
index 0000000..ffb42a7
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/WEB-INF/conf/raptor_pdf.properties
@@ -0,0 +1,30 @@
+## pdf file specific properties
+pdf_data_font_size=9
+pdf_data_font_family=Arial
+#reduce the font size from html config
+pdf_data_font_size_offset=2
+pdf_data_alternate_color=true
+#data row background(white), alternate(light light blue/gray)
+pdf_data_background_alternate_hex_code=#EDEDED
+pdf_data_default_background_hex_code=#FFFFFF
+#header font (white)  background (gray)
+pdf_data_table_header_font_hex_code=#FFFFFF
+pdf_data_table_header_background_hex_code=#8A9BB3
+#footer header
+pdf_footer_font_size=9
+pdf_footer_font_family=Arial
+pdf_att_proprietary=AT&T Proprietary\nUse Pursuant to Company Instructions
+pdf_att_proprierary_font_size=7
+pdf_date_timezone=GMT
+pdf_date_pattern=MM/dd/yyyy hh:mm:ss a
+##page number position at 1 - footer middle, 0 -- header right, 2 - both
+pdf_page_number_position=1
+pdf_word_before_page_number=Page
+pdf_word_after_page_number=
+pdf_coverpage_firstcolumn_size=0.3
+pdf_image_auto_rotate=false
+display_create_owner_info=true
+#session_info=customer,customerId
+display_loginid_for_downloaded_by=false
+# please use false if you want landscape to be default.
+is_default_orientation_portrait=true
diff --git a/onap-enabler-be/src/test/resources/WEB-INF/conf/sql.properties b/onap-enabler-be/src/test/resources/WEB-INF/conf/sql.properties
new file mode 100644
index 0000000..e0f89f0
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/WEB-INF/conf/sql.properties
@@ -0,0 +1,303 @@
+#SQL Statements for PostgreSQL
+
+#ReportLoader.java
+
+load.custom.report.xml = SELECT cr.report_xml FROM cr_report cr WHERE rep_id=?
+
+# need to copy to oracle
+load.remoteDB.schema = SELECT 'local' SCHEMA_ID, 'local' SCHEMA_DESC, null DATASOURCE_TYPE  FROM dual union SELECT a.SCHEMA_ID, a.SCHEMA_DESC, DATASOURCE_TYPE  FROM SCHEMA_INFO a  where schema_id <> 'local' order by schema_id
+load.remoteDB.schema.where = SELECT a.SCHEMA_ID, a.SCHEMA_DESC, DATASOURCE_TYPE  FROM SCHEMA_INFO a where schema_id = '[schema_id]'
+#formfield rendering
+
+formfield.id.name.sql.prefix=SELECT id, name FROM (
+formfield.id.name.sql=SELECT id, name
+
+formfield.id.name.sql.suffix=
+
+report.security.create= SELECT coalesce(cr.owner_id, cr.create_id) AS owner_id, cr.create_id,  DATE_FORMAT(cr.create_date, '%m/%d/%Y') create_date, maint_id,  DATE_FORMAT(cr.maint_date, '%m/%d/%Y')  update_date, cr.public_yn FROM cr_report cr WHERE cr.rep_id = [rw.getReportID()]
+
+db.update.report.xml = SELECT cr.rep_id, cr.report_xml FROM cr_report cr WHERE rep_id=? FOR UPDATE
+
+update.custom.report.rec = UPDATE cr_report SET title='[Utils.oracleSafe(rw.getReportName())]', descr='[Utils.oracleSafe(rw.getReportDescr())]', public_yn='[(rw.isPublic()]', menu_id='[rw.getMenuID()]', menu_approved_yn='[(rw.isMenuApproved()]', owner_id=[rw.getOwnerID()], maint_id=[rw.getUpdateID()], maint_date=STR_TO_DATE('[rw.getUpdateDate()]', '[Globals.getOracleTimeFormat()]'), dashboard_type_yn='[(rw.isDashboardType()]', dashboard_yn= '[(rw.getReportType().equals(AppConstants.RT_DASHBOARD)]' WHERE rep_id = [rw.getReportID()]
+
+is.report.already.scheduled = select rep_id from cr_report_schedule where rep_id = ?
+
+create.custom.report.rec = INSERT INTO cr_report(rep_id, title, descr, public_yn, menu_id, menu_approved_yn, report_xml, owner_id, create_id, create_date, maint_id, maint_date, dashboard_type_yn, dashboard_yn, folder_id) VALUES([rw.getReportID()], '[Utils.oracleSafe(rw.getReportName())]', '[Utils.oracleSafe(rw.getReportDescr())]', '[rw.isPublic()]', '[rw.getMenuID()]', '[rw.isMenuApproved()]', '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>', [rw.getOwnerID()], [rw.getCreateID()], STR_TO_DATE('[rw.getCreateDate()]', '[Globals.getOracleTimeFormat()]'), [rw.getUpdateID()], STR_TO_DATE('[rw.getUpdateDate()]', '[Globals.getOracleTimeFormat()]'), '[rw.isDashboardType()]', '[rw.getReportType().equals(AppConstants.RT_DASHBOARD)]',[rw.getFolderId()]) 
+
+get.user.report.names = SELECT cr.rep_id, cr.title FROM cr_report cr WHERE coalesce(cr.owner_id, cr.create_id) = [userID]							
+								
+get.report.owner.id = SELECT coalesce(cr.owner_id, cr.create_id) AS owner FROM cr_report cr WHERE rep_id = ?						
+
+delete.report.record.log = DELETE FROM cr_report_log WHERE rep_id = [reportID]
+
+delete.report.record.users = DELETE FROM cr_report_schedule_users WHERE rep_id = [reportID]
+
+delete.report.record.schedule = DELETE FROM cr_report_schedule WHERE rep_id = [reportID]
+
+delete.report.record.access = DELETE FROM cr_report_access WHERE rep_id = [reportID]
+
+delete.report.record.email = DELETE FROM cr_report_email_sent_log WHERE rep_id = [reportID]
+
+delete.report.record.favorite = DELETE FROM cr_favorite_reports WHERE rep_id = [reportID]
+
+delete.report.record.report = DELETE FROM cr_report WHERE rep_id = [reportID]
+																						
+load.quick.links =  select finalcr.rep_id, finalcr.title, finalcr.descr from (SELECT cr.rep_id, cr.title, cr.descr FROM (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra LEFT JOIN cr_report cr ON cr.rep_id = ra.rep_id WHERE cr.menu_id LIKE '%[nvls(menuId)]%' AND cr.menu_approved_yn = 'Y' AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL) UNION SELECT cr.rep_id, cr.title, cr.descr FROM cr_report cr WHERE cr.menu_id LIKE '%[nvls(menuId)]%' AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' or EXISTS (select * from fn_user_role where user_id=[userID] and role_id in (1)))) finalcr ORDER BY finalcr.title
+
+load.folder.reports = SELECT cr.rep_id, cr.rep_id report_id, concat([rep_title_sql] , (CASE WHEN cr.public_yn = 'Y' THEN '' ELSE '[PRIVATE_ICON]' END),cr.title,'</a>') title, cr.descr, concat(au.first_name,' ',au.last_name) owner_name, DATE_FORMAT(cr.create_date, '%m/%d/%Y') create_date, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'N' ELSE coalesce(ra.read_only_yn, 'Y') END read_only_yn, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'Y' ELSE 'N' END user_is_owner_yn FROM cr_report cr JOIN app_user au ON coalesce(cr.owner_id, cr.create_id) = au.user_id AND cr.folder_id= '[folderId]' LEFT JOIN (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL(SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON cr.rep_id = ra.rep_id
+#If roleList.toString() is '' PostgreSQL returns an error - needs to be null instead of empty
+
+load.folder.reports.user = AND coalesce(cr.owner_id, cr.create_id) = [userID]	
+
+load.folder.reports.publicsql = AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL)
+
+load.quick.download.links = SELECT a.file_name, b.title,DATE_FORMAT(a.dwnld_start_time, '%W %d-%m-%Y %H:%i:%s') as time, a.dwnld_start_time FROM cr_report_dwnld_log a, cr_report b where a.user_id = [userID] and a.rep_id = b.rep_id and (a.dwnld_start_time) >= STR_TO_DATE(DATE_FORMAT(now() -  INTERVAL 1 DAY, '%m/%d/%Y'), '%m/%d/%Y') and a.record_ready_time is not null order by a.dwnld_start_time
+
+load.reports.to.schedule = SELECT cr.rep_id, Initcap(cr.title), cr.descr FROM cr_report cr LEFT OUTER JOIN (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON cr.rep_id = ra.rep_id AND (cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL or cr.owner_id = [userID] )ORDER BY Initcap(cr.title)
+		
+load.reports.to.add.in.dashboard = SELECT cr.rep_id, cr.title, cr.descr FROM cr_report cr LEFT OUTER JOIN (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON cr.rep_id = ra.rep_id AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL) AND (cr.dashboard_yn = 'N' or cr.dashboard_yn is null) ORDER BY cr.title
+
+load.my.recent.links = select rep_id, title, descr, form_fields from ( select rep_id, title, descr, form_fields from  (select cr.rep_id, cr.title, a.form_fields,  cr.descr, a.log_time, a.user_id, a.action, a.action_value from cr_report_log a, cr_report cr where user_id = [userID] AND action = 'Report Execution Time' and a.rep_id = cr.rep_id order by log_time desc) AS x) AS y where LIMIT 1, 6
+
+create.report.log.entry = INSERT INTO cr_report_log (rep_id, log_time, user_id, action, action_value, form_fields) VALUES([reportID], now(), [userID], '[action]' , '[executionTime]', '[form_fields]')
+
+create.report.log.entry.exec.time = INSERT INTO cr_report_log (rep_id, log_time, user_id, action, action_value, form_fields) VALUES([reportID], NOW() + INTERVAL 1 SECOND, [userID], '[action]' , '[executionTime]', '[formFields]')
+
+clear.report.log.entries = DELETE FROM cr_report_log WHERE rep_id = ? and user_id = ?
+
+load.report.log.entries = SELECT x.log_time, x.user_id, (CASE WHEN x.action = 'Report Execution Time' THEN  concat('<a href=\"[AppUtils.getRaptorActionURL()]report.run.container&c_master=',x.rep_id,'&',x.form_fields,'&fromReportLog=Y&display_content=Y&noFormFields=Y&refresh=Y\">',x.action,'</a>') ELSE x.action END) action, (CASE WHEN x.action = 'Report Execution Time' THEN  action_value  ELSE 'N/A' END) time_taken, (CASE WHEN x.action = 'Report Execution Time' THEN concat('<a href=\"[AppUtils.getRaptorActionURL()]report.run.container&c_master=',x.rep_id,'&',x.form_fields,'&fromReportLog=Y&display_content=Y&noFormFields=Y&refresh=Y\"><img src=\"[AppUtils.getImgFolderURL()]test_run.gif" width=\"12\" height=\"12\" border=0 alt=\"Run report\"/></a>') ELSE 'N/A' END) run_image, x.name FROM  (SELECT rl.rep_id, DATE_FORMAT(rl.log_time, '%m/%d/%Y %h:%i:%s %p') log_time, rl.action_value, concat(fuser.last_name ,', ',fuser.first_name) name, rl.user_id, rl.action, rl.form_fields FROM cr_report_log rl, fn_user fuser WHERE rl.rep_id = [nvls(reportId)] and rl.action != 'Report Run' and fuser.user_id = rl.user_id ORDER BY rl.log_time DESC) x  LIMIT 100
+
+does.user.can.schedule.report = select crs.sched_user_id, count(*) from cr_report_schedule crs where sched_user_id = [userId] group by crs.sched_user_id having count(*) >= [Globals.getScheduleLimit()]
+
+does.user.can.schedule = select crs.schedule_id from cr_report_schedule crs where schedule_id = [scheduleId]
+
+get.system.date.time = select DATE_FORMAT(now(),'%m/%d/%Y %H:%i:%s')
+
+get.next.day.date.time = select DATE_FORMAT(NOW() + INTERVAL 1 DAY,'%m/%d/%Y %H:%i:%s')
+
+get.next.fifteen.minutes.date.time = select DATE_FORMAT(NOW() + INTERVAL 15 MINUTES,'%m/%d/%Y %H:%i:%s')
+
+get.next.thirty.minutes.date.time = select DATE_FORMAT(NOW() + INTERVAL 30 MINUTES,'%m/%d/%Y %H:%i:%s')
+
+get.template.file = select template_file from cr_report_template_map where report_id = [reportId]
+
+load.pdf.img.lookup = select image_id, image_loc from cr_raptor_pdf_img
+
+load.action.img.lookup = select image_id, image_loc from cr_raptor_action_img
+
+
+#ActionHandler.java
+
+report.values.map.def.a = SELECT x FROM (SELECT DISTINCT 
+
+report.values.map.def.b = TO_CHAR([colName], '[nvl(displayFormat, AppConstants.DEFAULT_DATE_FORMAT)]')
+
+report.values.map.def.c = [colName] 
+
+report.values.map.def.d =  x FROM [rdef.getTableById(tableId).getTableName()] WHERE [colName] IS NOT NULL ORDER BY 1) xx LIMIT <= [Globals.getDefaultPageSize()]
+
+test.sched.cond.popup = SELECT 1 WHERE EXISTS ([sql])
+
+download.all.email.sent = Select user_id, rep_id from CR_REPORT_EMAIL_SENT_LOG where gen_key='[pdfAttachmentKey.trim()]' and log_id =[report_email_sent_log_id.trim()] and (now() - sent_date) < '1 day' limit 1
+
+download.all.gen.key = select schedule_id from cr_report_email_sent_log u where U.GEN_KEY = '[pdfAttachmentKey]'
+
+download.all.retrieve = SELECT au.user_id FROM (SELECT rs.schedule_id, rs.rep_id FROM cr_report_schedule rs WHERE rs.enabled_yn='Y' AND rs.run_date IS NOT NULL  AND rs.schedule_id = [scheduleId]) x, cr_report r, app_user au WHERE x.rep_id = r.rep_id  AND au.user_id IN (SELECT rsu.user_id FROM cr_report_schedule_users rsu WHERE rsu.schedule_id = x.schedule_id and rsu.schedule_id = [scheduleId]  UNION SELECT ur.user_id FROM fn_user_role ur WHERE ur.role_id IN (SELECT rsu2.role_id FROM cr_report_schedule_users rsu2 WHERE rsu2.schedule_id = x.schedule_id and  rsu2.schedule_id = [scheduleId]))
+
+download.all.insert = insert into cr_report_dwnld_log (user_id,rep_id,file_name,dwnld_start_time,filter_params) values (?,?,?,?,?)
+
+#ReportWrapper.java
+
+report.wrapper.format = SELECT coalesce(cr.owner_id, cr.create_id) owner_id, cr.create_id, DATE_FORMAT(cr.create_date, '[Globals.getOracleTimeFormat()]') create_date, maint_id, DATE_FORMAT(cr.maint_date, '[Globals.getOracleTimeFormat()]') update_date, cr.menu_id, cr.menu_approved_yn FROM cr_report cr WHERE cr.rep_id= [reportID]
+
+generate.subset.sql = SELECT [colNames.toString()] FROM (SELECT  [colNames.toString()] FROM ([reportSQL]) AS x ) AS y 
+
+report.sql.only.first.part = SELECT [colNames.toString()] FROM (SELECT [colNames.toString()] FROM (
+
+report.sql.only.second.part.a = [startRow] 
+
+report.sql.only.second.part.b = [pageSize]
+#MYSQL: LIMIT [startRow], [pageSize]
+#ORacle: rownum >= [startRow] and rownum <= ([startRow]+[pageSize])
+#Postgre: limit [pageSize] offset [startRow] 
+
+report.sql.only.second.part.b.noorderby =  LIMIT [startRow]
+
+generate.sql.visual.select = SELECT
+
+generate.sql.visual.count = COUNT(*) cnt
+
+generate.sql.visual.dual = 
+#No DUAL table in PostgreSQL so this is blank
+
+#ReportRuntime.java
+
+load.crosstab.report.data = SELECT  [colNames.toString()] FROM ( [reportSQL] 
+
+#RaptorRunHandler.java
+
+generate.sql.handler = SELECT  x.* from ([sql]) AS x LIMIT 2
+
+generate.sql.select = SELECT [colNames.toString()] FROM (SELECT  [colNames.toString()] FROM ([sql]) AS y) AS x 
+			
+#ReportSchedule.java
+
+load.schedule.data = SELECT rs.enabled_yn, DATE_FORMAT(rs.start_date, '%m/%d/%Y') start_date, DATE_FORMAT(rs.end_date, '%m/%d/%Y') end_date, DATE_FORMAT(rs.run_date, '%m/%d/%Y') run_date, coalesce(DATE_FORMAT(rs.run_date, '%h'), '12') run_hour, coalesce(DATE_FORMAT(rs.run_date, '%i'), '00') run_min, coalesce(DATE_FORMAT(rs.run_date, '%p'), 'AM') run_ampm, rs.recurrence, rs.conditional_yn, rs.notify_type, rs.max_row, rs.initial_formfields, rs.schedule_id, coalesce(DATE_FORMAT(rs.end_date, '%h'), '11') end_hour, coalesce(DATE_FORMAT(rs.end_date, '%i'), '45') end_min, coalesce(DATE_FORMAT(rs.end_date, '%p'), 'PM') end_ampm, encrypt_yn, attachment_yn FROM cr_report_schedule rs WHERE rs.rep_id = [reportID]
+
+load.schedule.getid = SELECT rsu.user_id, concat(fuser.last_name,', ',fuser.first_name), fuser.login_id FROM cr_report_schedule_users rsu, fn_user fuser WHERE rsu.rep_id = [reportID]  AND rsu.schedule_id = [getScheduleID()] and rsu.user_id IS NOT NULL and rsu.user_id = fuser.user_id
+
+load.schedule.users = SELECT rsu.role_id FROM cr_report_schedule_users rsu WHERE rsu.rep_id = [reportID] AND rsu.schedule_id = [getScheduleID()] AND rsu.role_id IS NOT NULL
+
+new.schedule.data = select coalesce(max(schedule_id),0)+1  AS sequence from cr_report_schedule
+
+new.report.data = select coalesce(max(rep_id),0)+1  AS rep_id from cr_report
+
+execute.update = DELETE FROM cr_report_schedule_users WHERE rep_id = [reportID] and schedule_id = [getScheduleID()]
+
+execute.update.users = INSERT INTO cr_report_schedule_users (schedule_id, rep_id, user_id, role_id, order_no) VALUES([getScheduleID()], [reportID], [emailToUsers.get(i)).getId()], NULL, [(i + 1)])
+
+execute.update.roles = INSERT INTO cr_report_schedule_users (schedule_id, rep_id, user_id, role_id, order_no) VALUES([getScheduleID()], [reportID], NULL, [emailToRoles.get(i)).getId()], [((emailToUsers.size() + i + 1)])
+
+execute.update.activity = INSERT into cr_schedule_activity_log (schedule_id, notes, run_time) values ([getScheduleID()],'Submitted:Schedule',TO_DATE('[getRunDate()] [getRunHour()]:[getRunMin()] [getRunAMPM()]', 'MM/DD/YYYY HH:MI AM'))
+ 
+delete.schedule.data = SELECT 1 FROM cr_report_schedule WHERE rep_id = [reportID] and sched_user_id = [getScheduleUserID()] and schedule_id = [getScheduleID()]
+ 
+delete.schedule.data.users = DELETE FROM cr_report_schedule_users WHERE rep_id = [reportID]  and schedule_id = [getScheduleID()]
+ 
+delete.schedule.data.id = DELETE FROM cr_report_schedule where rep_id = [reportID] and sched_user_id = [getScheduleUserID()] and schedule_id = [getScheduleID()]
+
+load.cond.sql = SELECT condition_large_sql FROM cr_report_schedule WHERE schedule_id=?
+
+load.cond.sql.select = SELECT condition_sql FROM cr_report_schedule WHERE schedule_id = [scheduleId]
+
+persist.cond.sql.update = update cr_report_schedule set condition_large_sql = '' where  schedule_id = [scheduleId]
+#EMPTY CLOB() changed to ''
+
+persist.cond.sql.large = SELECT condition_large_sql FROM cr_report_schedule cr WHERE schedule_id=? FOR UPDATE
+
+persist.cond.sql.set = update cr_report_schedule set condition_sql = ? where schedule_id = [scheduleId]
+
+#DataCache.java
+
+get.data.view.actions = SELECT ts.web_view_action FROM cr_table_source ts WHERE ts.web_view_action IS NOT NULL
+
+get.public.report.id.names = SELECT rep_id, title FROM cr_report WHERE public_yn = 'Y' ORDER BY title
+
+get.private.accessible.names.a = SELECT cr.rep_id, cr.title FROM cr_report cr WHERE cr.rep_id not in (select rep_id from cr_report_access cra where user_id =  '[user_id]' 
+
+get.private.accessible.names.if =  OR role_id in (
+
+get.private.accessible.names.b =  ) AND public_yn = 'N' and cr.owner_id = '[user_id]' order by 2 
+
+get.group.accessible.names.a = SELECT cr.rep_id, cr.title FROM cr_report cr  WHERE cr.rep_id  in (select rep_id from cr_report_access cra where user_id =  '[user_id]'
+
+get.group.accessible.names.b =  )  AND public_yn = 'N' order by 2 
+
+get.report.table.sources.a = SELECT table_name, display_name, pk_fields, web_view_action, large_data_source_yn, filter_sql FROM cr_table_source 
+
+get.report.table.sources.where =  where SOURCE_DB= '[dBInfo]'
+
+get.report.table.sources.if =  where SOURCE_DB is null or SOURCE_DB = '[AppConstants.DB_LOCAL]'
+
+get.report.table.sources.else =  ORDER BY table_name
+
+grab.report.table.a = SELECT ts.table_name, ts.display_name, ts.pk_fields, ts.web_view_action, ts.large_data_source_yn, ts.filter_sql FROM cr_table_source ts  WHERE 
+
+grab.report.table.if = ts.SOURCE_DB= '[dBInfo]'
+
+grab.report.table.else = (ts.SOURCE_DB is null or ts.SOURCE_DB = '[AppConstants.DB_LOCAL]')
+
+grab.report.table.b =  except SELECT ts.table_name, ts.display_name, ts.pk_fields,  ts.web_view_action,  ts.large_data_source_yn, ts.filter_sql from cr_table_source ts where table_name in (select table_name from  cr_table_role where role_id not IN [sb.toString()]) and 
+
+grab.report.table.c =  ORDER BY 1 
+
+get.report.table.crjoin = SELECT src_table_name, dest_table_name, join_expr FROM cr_table_join
+
+get.report.table.joins = SELECT tj.src_table_name, tj.dest_table_name, tj.join_expr FROM cr_table_join tj WHERE ((EXISTS (SELECT 1 FROM cr_table_role trs WHERE trs.table_name=tj.src_table_name AND trs.role_id IN [sb.toString()])) OR (NOT EXISTS (SELECT 1 FROM cr_table_role trs WHERE trs.table_name=tj.src_table_name))) AND ((EXISTS (SELECT 1 FROM cr_table_role trd WHERE trd.table_name=tj.dest_table_name AND trd.role_id IN [sb.toString()])) OR (NOT EXISTS (SELECT 1 FROM cr_table_role trd WHERE trd.table_name=tj.dest_table_name)))
+
+generate.report.table.col = SELECT a.table_name, a.column_name, a.data_type, a.label FROM user_column_def a WHERE a.table_name = '[tableName.toUpperCase()]' ORDER BY a.column_id
+
+generate.db.user.sql.a = SELECT utc.table_name, utc.column_name, utc.data_type, 
+
+generate.db.user.sql.if = utc.column_name FROM user_tab_columns utc 
+
+generate.db.user.sql.else = coalesce(x.label, utc.column_name) FROM user_tab_columns utc 
+
+generate.db.user.sql.b = WHERE utc.table_name = '[tableName.toUpperCase()]' 
+
+generate.db.user.sql.c = AND utc.table_name = x.table_name AND utc.column_name = x.column_name 
+
+generate.db.user.sql.d = ORDER BY utc.column_id 
+
+#SearchHandler.java
+
+load.report.search.result = SELECT cr.rep_id, cr.rep_id report_id, [rep_title_sql] title, cr.descr, concat(au.first_name,' ',au.last_name) owner_name, DATE_FORMAT(cr.create_date, '%m/%d/%Y') create_date, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'N' ELSE coalesce(ra.read_only_yn, 'Y') END read_only_yn, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'Y' ELSE 'N' END user_is_owner_yn, case when report_xml like '%<allowSchedule>N</allowSchedule>%' then 'N' when report_xml like '%<allowSchedule>Y</allowSchedule>%' or 1 = (select distinct 1 from cr_report_schedule where rep_id = cr.rep_id) then 'Y' else 'N' end FROM cr_report cr JOIN fn_user au ON coalesce (cr.owner_id, cr.create_id) = au.user_id [fReportID] [fReportName] LEFT JOIN(SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON ra.rep_id = cr.rep_id
+
+load.report.search.instr = WHERE cr.menu_id LIKE '%[menuId]%'
+
+load.report.search.result.user = WHERE coalesce(cr.owner_id, cr.create_id) = [userID]
+
+load.report.search.result.public = WHERE (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL)
+
+load.report.search.result.fav =  WHERE cr.rep_id in (select rep_id from cr_favorite_reports where user_id = [userID]
+
+load.report.search.result.sort = ORDER BY CASE coalesce(cr.owner_id, cr.create_id) WHEN [userID] THEN ' ' WHEN 'upper(concat(au.first_name,' ',au.last_name))' ELSE 'upper(cr.title)' END
+
+load.folder.report.result = SELECT cr.rep_id, cr.rep_id report_id, concat([rep_title_sql] , (CASE WHEN cr.public_yn = 'Y' THEN '' ELSE '[PRIVATE_ICON]' END),cr.title,'</a>') title, cr.descr, concat(au.first_name,' ',au.last_name) owner_name, TO_CHAR(cr.create_date, 'MM/DD/YYYY') create_date, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'N' ELSE coalesce(ra.read_only_yn, 'Y') END read_only_yn, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'Y' ELSE 'N' END user_is_owner_yn FROM cr_report cr JOIN fn_user au ON coalesce (cr.owner_id, cr.create_id) = au.user_id AND TO_CHAR(cr.rep_id, 'FM99999999') like coalesce('%[fReportID]%', TO_CHAR(cr.rep_id, 'FM99999999')) AND UPPER(cr.title) LIKE UPPER('%[fReportName]%') LEFT JOIN(SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON ra.rep_id = cr.rep_id
+
+load.folder.report.result.sort =  ORDER BY CASE coalesce(cr.owner_id, cr.create_id) WHEN [userID] THEN ' ' WHEN '(concat(au.first_name,' ',au.last_name))' ELSE 'cr.title' END
+
+#WizardProcessor.java
+
+process.filter.add.edit = '[argValue]'
+
+#ReportDefinition.java
+
+persist.report.adhoc = SELECT nextval('[Globals.getAdhocReportSequence()]') AS sequence
+
+#Globals.java
+
+initialize.roles = SELECT 1 WHERE EXISTS (SELECT 1 FROM cr_table_role)
+
+initialize.version = SELECT cr_raptor.get_version
+
+# scheduler
+
+
+scheduler.available.schedules = SELECT x.rep_id, x.schedule_id, x.conditional_yn, x.condition_large_sql, x.notify_type, x.max_row, x.initial_formfields, x.processed_formfields, r.title, x.user_id FROM ( SELECT rs.rep_id, rs.schedule_id, rs.sched_user_id user_id, rs.conditional_yn, rs.condition_large_sql, rs.notify_type, rs.max_row, rs.initial_formfields, rs.processed_formfields  FROM cr_report_schedule rs  WHERE rs.enabled_yn='Y'  AND rs.start_date <= [currentDate]  AND  (rs.end_date >= [currentDate] or rs.end_date is null )  AND rs.run_date IS NOT NULL  ) x, cr_report r  WHERE x.rep_id = r.rep_id
+
+random.string = select ( concat('Z' , round(random() * 1000000000000) ) )
+
+
+scheduler.user.emails = SELECT au.user_id FROM (SELECT rs.schedule_id, rs.rep_id FROM cr_report_schedule rs WHERE rs.enabled_yn='Y' AND rs.start_date <= now() AND rs.end_date  >= now() AND rs.run_date IS NOT NULL AND rs.schedule_id = [p_schedule_id] ) x, cr_report r, fn_user au WHERE x.rep_id = r.rep_id AND au.user_id IN (SELECT rsu.user_id FROM cr_report_schedule_users rsu WHERE rsu.schedule_id = x.schedule_id and rsu.schedule_id = [p_schedule_id] UNION SELECT ur.user_id FROM fn_user_role ur WHERE ur.role_id IN (SELECT rsu2.role_id FROM cr_report_schedule_users rsu2 WHERE rsu2.schedule_id = x.schedule_id and rsu2.schedule_id = [p_schedule_id]))  
+
+
+# my logins
+
+app.query = SELECT APP_ID, ML_APP_NAME, MOTS_ID from fn_app
+
+user.log.query = SELECT DISTINCT  IFNULL(SBCID, '') CUID, '' AWID, CONCAT('"',IFNULL(SBCID, ''),'"') APPLICATIONUSERID,  CONCAT('"',IFNULL(FIRST_NAME, ''),'"') FIRST_NAME, CONCAT('"',substr(IFNULL(MIDDLE_NAME, ''), 0, 1),'"') MIDDLE_INITIAL, CONCAT('"',IFNULL(LAST_NAME, ''),'"') LAST_NAME, IFNULL(DATE_FORMAT(LAST_LOGIN_DATE, '%Y/%m/%d'), '') LAST_LOGON_DATE, DATE_FORMAT(CREATED_DATE, '%Y/%m/%d') ACCOUNT_ACTIVATION_DATE, IFNULL(DATE_FORMAT(MODIFIED_DATE, '%Y/%m/%d'), '') LAST_DATE_ACCOUNT_MODIFIED,  '' LAST_PASSWORD_CHANGE_DATE, CONCAT('"',IFNULL(FIRST_NAME, ''),' ',IFNULL(MIDDLE_NAME, ''),' ',IFNULL(LAST_NAME, ''),'"')  FULL_USER_NAME, '' NT_ID, IFNULL(EMAIL, '') EMAIL   FROM FN_USER FU, FN_USER_ROLE FUR WHERE FU.USER_ID \= FUR.USER_ID and FUR.app_id \= ? and ACTIVE_YN \= 'Y' and sbcid is not null order by 1
+
+profile.log.query = SELECT DISTINCT CONCAT('"' , ROLE_NAME , '"') PROFILE_NAME, '""' SECURITY_SETTINGS FROM FN_ROLE FR, FN_USER_ROLE FUR WHERE FUR.ROLE_ID \= FR.ROLE_ID and FR.ACTIVE_YN \= 'Y' and ((FUR.APP_ID \= 1 and FR.ROLE_NAME <> 'Standard User') or (FUR.APP_ID \= ? and FUR.APP_ID <> 1))  ORDER BY 1
+
+user.profile.log.query = SELECT DISTINCT IFNULL(SBCID, '') CUID, '' AWID, CONCAT('"' , IFNULL(SBCID, '') , '"') APPLICATIONUSERID , CONCAT('"' , ROLE_NAME , '"')  PROFILE_NAME  FROM FN_USER A, FN_USER_ROLE B, FN_ROLE C WHERE A.USER_ID \= B.USER_ID AND B.ROLE_ID \= C.ROLE_ID AND A.ACTIVE_YN \= 'Y' AND C.ACTIVE_YN \= 'Y' AND a.sbcid is not null  AND ((B.APP_ID \= 1 and C.ROLE_NAME <> 'Standard User') or (B.APP_ID \= ? and B.APP_ID <> 1)) ORDER BY 1
+
+all.accounts.log.query = SELECT DISTINCT IFNULL(SBCID, '') CUID, (case when A.ACTIVE_YN\='Y' then 'ACTIVE' else 'INACTIVE' end) ACTIVE_YN, CONCAT('"' , IFNULL(SBCID, '') , '"') APPLICATIONUSERID , IFNULL(DATE_FORMAT(LAST_LOGIN_DATE, '%Y/%m/%d'), '') LAST_LOGON_DATE, '' LAST_PASSWORD_CHANGE_DATE, CONCAT('"' , ROLE_NAME , '"')  PROFILE_NAME  FROM FN_USER A, FN_USER_ROLE B, FN_ROLE C WHERE A.USER_ID \= B.USER_ID AND B.ROLE_ID \= C.ROLE_ID AND a.sbcid is not null  AND ((B.APP_ID \= 1 and C.ROLE_NAME <> 'Standard User') or (B.APP_ID \= ? and B.APP_ID <> 1)) ORDER BY 1
+
+# basic sql
+
+seq.next.val = SELECT nextval('[sequenceName]') AS id
+
+current.date = now()
+
+nvl = IFNULL
+
+# report security
+report.user.access = SELECT ra.role_id, ra.user_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.rep_id = [reportID]
+add.user.access = INSERT INTO cr_report_access (rep_id, order_no, role_id, user_id, read_only_yn) VALUES([reportID], IFNULL((select order_no from (SELECT MAX(order_no) AS order_no FROM cr_report_access WHERE rep_id=[reportID]) AS temp), 0)+1, NULL, [userID], '[readOnlyAccess]')
+update.user.access = UPDATE cr_report_access SET read_only_yn='[readOnlyAccess]' WHERE rep_id=[reportID] AND user_id=[userID]
+remove.user.access = DELETE FROM cr_report_access WHERE rep_id=[reportID] AND user_id=[userID]
+add.role.access = INSERT INTO cr_report_access (rep_id, order_no, role_id, user_id, read_only_yn) VALUES([reportID], IFNULL((select order_no from (SELECT MAX(order_no) AS order_no FROM cr_report_access WHERE rep_id=[reportID]) AS temp), 0)+1, [roleID], NULL, '[readOnlyAccess]')
+update.role.access = UPDATE cr_report_access SET read_only_yn='[readOnlyAccess]' WHERE rep_id=[reportID] AND role_id=[roleID]
+remove.role.access = DELETE FROM cr_report_access WHERE rep_id=[reportID] AND role_id=[roleID]
+
diff --git a/onap-enabler-be/src/test/resources/WEB-INF/conf/system.properties b/onap-enabler-be/src/test/resources/WEB-INF/conf/system.properties
new file mode 100644
index 0000000..20ddc0f
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/WEB-INF/conf/system.properties
@@ -0,0 +1,190 @@
+# Properties read by ECOMP Core library, epsdk-core.jar
+
+##########################################################################
+# The following properties should NOT be changed by partner applications.
+##########################################################################
+
+application_user_id           = 30000
+post_default_role_id          = 16
+clustered                     = true
+
+#Enable Fusion Mobile capabilities for the application
+mobile_enable			  	  = false
+
+# Cache config file is needed on the classpath
+cache_config_file_path        = /WEB-INF/classes/cache.ccf
+cache_switch                  = 199
+cache_load_on_startup         = false
+
+user_name					  = fullName
+decryption_key				  = AGLDdG4D04BKm2IxIWEr8o==
+#db.userName=XXXX
+#db.password=XXXX
+#db.connectionURL=jdbc:oracle:thin:@XXXX/XX
+#db.hib.dialect=org.hibernate.dialect.Oracle10gDialect
+#db.driver=oracle.jdbc.driver.OracleDriver
+#Hibernate 
+#hb.dialect=org.hibernate.dialect.Oracle10gDialect
+#hb.show_sql=true
+
+#Postgre
+#db.userName=XXXX
+#db.password=XXXX
+#db.connectionURL=jdbc:postgresql://XXXX/XX
+#db.hib.dialect=org.hibernate.dialect.PostgreSQLDialect
+#db.driver=org.postgresql.Driver
+#hb.dialect=org.hibernate.dialect.PostgreSQLDialect
+#hb.show_sql=true
+
+#Mysql
+db.driver = com.mysql.jdbc.Driver
+#db.connectionURL = jdbc:mysql://demeter.homer.att.com:3306/ecomp_sdk_1707_att
+db.connectionURL = jdbc:mysql://localhost:3306/vid_portal
+db.userName = euser
+db.password = euser
+db.hib.dialect = org.hibernate.dialect.MySQLDialect
+db.min_pool_size = 5
+db.max_pool_size = 10
+hb.dialect = org.hibernate.dialect.MySQLDialect
+# SQL statements are logged to stdout
+hb.show_sql = true
+hb.idle_connection_test_period = 3600
+app_display_name					  = VID
+files_path = /opt/app/vid/license
+
+# menu settings
+#menu_query_name                      = menuData
+#menu_properties_file_location        = /WEB-INF/fusion/menu/
+#application_menu_set_name            = APP
+#application_menu_attribute_name      = applicationMenuData
+#application_menu_properties_name     = menu.properties
+#business_direct_menu_set_name        = BD
+#business_direct_menu_properties_name = bd.menu.properties
+#business_direct_menu_attribute_name  = businessDirectMenuData
+
+application_name              = Virtual Infrastructure Deployment
+
+
+#element map files
+#element_map_file_path = /tmp
+#element_map_icon_path = app/vid/icons/
+element_map_file_path = app/fusionapp/files/
+element_map_icon_path = app/fusionapp/icons/
+
+#aai related properties
+#dev server
+#aai.server.url.base=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/
+#aai.server.url=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/v10/
+#aai.oldserver.url.base=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/servers/
+#aai.oldserver.url=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/servers/v3/
+#ist servers
+aai.server.url.base=https://aai-ext1.test.att.com:8443/aai/
+#aai.server.url=https://aai-ext1.test.att.com:8443/aai/v12/
+aai.server.url=http://localhost:8080/vidSimulator/aai/v12/
+#aai.server.url=http://localhost:1080/aai
+#aai.server.url=https://aai-int2.test.att.com:8443/aai/v12/
+aai.vid.username=VID
+aai.vid.passwd.x=OBF:1jm91i0v1jl9
+
+
+
+
+
+
+
+
+aai.oldserver.url.base=https://aai-ext1.test.att.com:8443/aai/servers/
+aai.oldserver.url=https://aai-ext1.test.att.com:8443/aai/servers/v3/
+aai.truststore.filename=tomcat_keystore
+aai.truststore.passwd.x=OBF:1i9a1u2a1unz1lr61wn51wn11lss1unz1u301i6o
+aai.keystore.filename=aai-client-cert.p12
+aai.keystore.passwd.x=OBF:1i9a1u2a1unz1lr61wn51wn11lss1unz1u301i6o
+aai.use.client.cert=false
+aai.vnf.provstatus=PREPROV,NVTPROV,PROV,CAPPED
+
+#Cron Schedules have 6 required fields and 1 optional field:
+# Seconds Minutes Hours Day-of-Month Month Day-of-Week Year
+log_cron                      = 0 0/1 * * * ?;
+mylogins_feed_cron            = 0 0/60 * * * ?;
+#sessiontimeout_feed_cron	  = 0 * * * * ? *
+my_login_feed_output_dir      = /tmp/MyLogins
+
+# ECOMP Portal Shared Context REST API URL
+ecomp_shared_context_rest_url= https://www.ecomp.att.com:8080/ecompportal/context
+
+# Link shown in Help menu
+contact_us_link = https://wiki.web.att.com/display/EcompPortal/ECOMP+Portal+Home
+
+# Camunda cockpit link
+camunda_cockpit_link = https://cloopwf.client.research.att.com:8443/camunda/app/cockpit/default/#/dashboard
+# An Unique 128-bit value defined to identify a specific version
+# of an application deployed on a specific virtual machine.
+# This value must be generated and updated by the application 
+# which is using the ECOMP SDK at the time of its deployment.
+# Online Unique UUID generator - https://www.uuidgenerator.net/
+instance_uuid=8da691c9-987d-43ed-a358-00ac2f35685d
+
+#  R Cloud feature
+guard_notebook_url=https://rcloud.research.att.com/mini.html?notebook=a06a9cf14211012e221bf842c168849d&
+
+#ECOMP redirect url
+#ecomp_redirect_url = https://webtest.csp.att.com/ecomp_portal_dev_n1/ecompui/process_csp
+#ecomp_rest_url = https://webtest.csp.att.com/ecomp_portal_dev_n1/ecompui/auxapi
+# Replace these default values with the ones for your specific App.  Ecomp Portal admin obtains from EP website.
+#ueb_app_mailbox_name = ECOMP-PORTAL-OUTBOX-90
+#ueb_app_key = sYH0NJnsKmJC1B2A
+#ueb_app_secret = YOtknsT2wVFz9WISlSPDaAtd
+
+#MSO related properties
+#simulator
+#mso.server.url=http://localhost:8089
+#mso.server.url=https://msoapih-app.mtsnj.aic.cip.att.com:8443/ecomp/mso/infra
+#dev2dev
+#good
+#dev
+#mso.server.url=http://mtanjv9moah10-eth0.aic.cip.att.com:8080/ecomp/mso/infra
+#istScrum-Master
+mso.client.type=LOCAL
+mso.server.url=http://vm1.mso.simpledemo.openecomp.org:8080
+mso.polling.interval.msecs=10000
+mso.max.polls=10
+mso.user.name=infraportal
+mso.password.x=OBF:1ghz1kfx1j1w1m7w1i271e8q1eas1hzj1m4i1iyy1kch1gdz
+mso.restapi.svc.instance=/serviceInstances/v5
+mso.restapi.vnf.instance=/serviceInstances/v5/<service_instance_id>/vnfs
+mso.restapi.vnf.changemanagement.instance=/serviceInstances/v5/<service_instance_id>/vnfs/<vnf_instance_id>/<request_type>
+mso.restapi.network.instance=/serviceInstances/v5/<service_instance_id>/networks
+mso.restapi.vf.module.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules
+mso.restapi.vf.module.scaleout=/serviceInstantiation/v7/serviceInstances/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules/scaleOut
+mso.restapi.volume.group.instance=/serviceInstances/v5/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups
+mso.restapi.get.orc.req=/orchestrationRequests/v5
+mso.restapi.get.orc.reqs=/orchestrationRequests/v5?
+mso.restapi.get.man.tasks=/tasks/v1
+mso.restapi.configurations=/serviceInstances/v6/<service_instance_id>/configurations
+mso.restapi.configuration.instance=${mso.restapi.configurations}<configuration_id>
+
+vid.truststore.filename=/opt/app/vid/etc/vid_keystore.jks
+mso.dme2.client.timeout=30000
+mso.dme2.client.read.timeout=120000
+
+scheduler.server.url=http://mtanjv9sdlg10.aic.cip.att.com:8989/scheduler
+scheduler.create.new.vnf.change.instance=/v1/ChangeManagement/schedules/
+scheduler.get.time.slots=/v1/ChangeManagement/schedules/
+scheduler.get.schedules=/v1/ChangeManagement/schedules/scheduleDetails/
+
+
+#vid.truststore.filename=/Users/Oren/Downloads/vid_keystore2.jks
+
+vid.truststore.passwd.x=OBF:1wgg1wfq1uus1uui1x131x0r1x1v1x1j1uvo1uve1wg81wfi
+#mso.dme2.server.url=http://mso-api-handler-anap-v1.mso.ecomp.att.com/services/ecomp/mso?
+mso.dme2.server.url=http://mso-api-handler-anap-v1.mso.ecomp.att.com/services/ecomp/mso?version=1607&envContext=TEST&routeOffer=st_mtsnj
+#mso.dme2.server.url=https://ActiveAndAvailableInventory-CloudNetwork-v1.aai.att.com/aai?version=1&envContext=DEV&routeOffer=devINT1
+mso.dme2.enabled=false
+asdc.model.namespace=org.openecomp.
+sdc.svc.api.path=sdc/v1/catalog/services
+sdc.resource.api.path=sdc/v1/catalog/resource
+
+# Application base URL has the host and app context only; a proper prefix of the on-boarded URL.
+# Only required for applications using WebJunction or FE/BE separation.  For example:
+# app_base_url = https://www.e-access.att.com/app_junction/app_context/
+
diff --git a/onap-enabler-be/src/test/resources/WEB-INF/conf/system.properties.cml b/onap-enabler-be/src/test/resources/WEB-INF/conf/system.properties.cml
new file mode 100644
index 0000000..51e788e
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/WEB-INF/conf/system.properties.cml
@@ -0,0 +1,93 @@
+# Properties read by ECOMP Core library, epsdk-core.jar
+
+##########################################################################
+# The following properties should NOT be changed by partner applications.
+##########################################################################
+
+application_user_id           = 30000
+post_default_role_id          = 16
+clustered                     = true
+
+#Enable Fusion Mobile capabilities for the application
+mobile_enable			  	  = false
+
+# Cache config file is needed on the classpath
+cache_config_file_path        = /WEB-INF/classes/cache.ccf
+cache_switch                  = 199
+cache_load_on_startup         = false
+
+user_name					  = fullName
+decryption_key				  = AGLDdG4D04BKm2IxIWEr8o==
+
+##########################################################################
+# The following properties REQUIRE changes by partner applications.
+##########################################################################
+
+#Oracle
+#db.userName=quantumbd
+#db.password=c1syn2yhmr
+#db.connectionURL=jdbc:oracle:thin:@dbhost.yourcompany.com:1527:mod112a
+#db.hib.dialect=org.hibernate.dialect.Oracle10gDialect
+#db.driver=oracle.jdbc.driver.OracleDriver
+#Hibernate 
+#hb.dialect=org.hibernate.dialect.Oracle10gDialect
+#hb.show_sql=true
+
+#Postgres
+#db.userName=quantumbd
+#db.password=c1syn2yhmr
+#db.connectionURL=jdbc:postgresql://dbhost.yourcompany.com:61382/quantum
+#db.hib.dialect=org.hibernate.dialect.PostgreSQLDialect
+#db.driver=org.postgresql.Driver
+#hb.dialect=org.hibernate.dialect.PostgreSQLDialect
+#hb.show_sql=true
+
+
+
+#Mysql
+db.driver = org.mariadb.jdbc.Driver
+#db.connectionURL = jdbc:mariadb://localhost:3306/vid_openecomp_epsdk
+#db.userName = ecomp_sdk_user
+#db.password = ecomp_sdk_pass
+db.hib.dialect = org.hibernate.dialect.MySQLDialect
+db.min_pool_size = 5
+db.max_pool_size = 10
+hb.dialect = org.hibernate.dialect.MySQLDialect
+# SQL statements are logged to stdout
+hb.show_sql = true
+hb.idle_connection_test_period = 3600
+
+app_display_name = EPSDK App ATT
+# license file area
+files_path = /tmp
+
+#element map files
+element_map_file_path = app/fusionapp/files/
+element_map_icon_path = app/fusionapp/icons/
+
+#Cron Schedules have 6 required fields and 1 optional field:
+# Seconds Minutes Hours Day-of-Month Month Day-of-Week Year
+log_cron                      = 0 0/1 * * * ?;
+
+# ECOMP Portal Shared Context REST API URL
+ecomp_shared_context_rest_url= https://www.ecomp.att.com:8080/ecompportal/context
+
+# Link shown in Help menu
+contact_us_link = https://wiki.web.att.com/display/EcompPortal/ECOMP+Portal+Home
+
+# Camunda cockpit link
+camunda_cockpit_link = https://cloopwf.client.research.att.com:8443/camunda/app/cockpit/default/#/dashboard
+
+# An Unique 128-bit value defined to identify a specific version
+# of an application deployed on a specific virtual machine.
+# This value must be generated and updated by the application 
+# which is using the ECOMP SDK at the time of its deployment.
+# Online Unique UUID generator - https://www.uuidgenerator.net/
+instance_uuid=8da691c9-987d-43ed-a358-00ac2f35685d
+
+#  R Cloud feature
+guard_notebook_url=https://rcloud.research.att.com/mini.html?notebook=a06a9cf14211012e221bf842c168849d&
+
+# Application base URL has the host and app context only; a proper prefix of the on-boarded URL.
+# Only required for applications using WebJunction or FE/BE separation.  For example:
+# app_base_url = https://www.e-access.att.com/app_junction/app_context/
diff --git a/onap-enabler-be/src/test/resources/WEB-INF/fusion/conf/fusion.properties b/onap-enabler-be/src/test/resources/WEB-INF/fusion/conf/fusion.properties
new file mode 100644
index 0000000..b482c21
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/WEB-INF/fusion/conf/fusion.properties
@@ -0,0 +1,69 @@
+# domain settings
+#domain_class_location = com.att.fusion.domain.
+
+# validator settings
+#default_error_message = Default error message
+
+# login settings
+login_method_csp            = csp
+login_method_web_junction   = web_junction
+login_method_backdoor       = backdoor
+login_method_attribute_name = login_method
+
+#login message
+login.error.hrid.empty = Login failed, please contact system administrator. 
+login.error.hrid.not-found = User not found, please contact system administrator.
+login.error.user.inactive = Account is disabled, please contact system administrator.
+
+# CSP settings
+csp_cookie_name          = attESSec
+csp_gate_keeper_data_key = MgmtSysCtr
+csp_gate_keeper_prod_key = PROD
+csp_login_url            = https://www.e-access.att.com/empsvcs/hrpinmgt/pagLogin/?sysName=MgmtSysCtr&retURL=
+csp_logout_url           = https://www.e-access.att.com/empsvcs/hrpinmgt/pagLogout/?retURL=
+
+authentication_mechanism = BOTH
+
+#csp_gate_keeper_prod_key = DEVL
+user_attribute_name      = user
+#csp_login_url = https://www.e-access.att.com/empsvcs/hrpinmgt/pagLogin/?sysName=MgmtSysCtr&retURL=
+#csp_logout_url = https://webtest.csp.att.com/empsvcs/hrpinmgt/pagLogout/?retURL=
+
+# Web Junction settings
+#web_junction_user_id_header_name = iv-user
+
+# User Session settings
+#user_attribute_name           = user
+roles_attribute_name          = roles
+role_functions_attribute_name = role_functions
+role_function_list            = role_function_list
+#client_device_attribute_name  = client_device
+#client_device_emulation       = false
+#client_device_type_to_emulate = com.att.fusion.web.clientdevice.mobile.IPhoneDevice
+
+# POST settings
+post_initial_context_factory = com.sun.jndi.ldap.LdapCtxFactory
+post_provider_url            = ldap://ldap.webphone.att.com:389
+post_security_principal      = ou=people,o=att,c=us
+post_max_result_size         = 499
+
+# menu settings
+menu_query_name                      = menuData
+#menu_properties_file_location        = /WEB-INF/fusion/menu/
+application_menu_set_name            = APP
+application_menu_attribute_name      = applicationMenuData
+#application_menu_properties_name     = menu.properties
+business_direct_menu_set_name        = BD
+#business_direct_menu_properties_name = bd.menu.properties
+business_direct_menu_attribute_name  = businessDirectMenuData
+
+# RAPTOR config settings
+#raptor_config_file_path = /WEB-INF/conf/
+
+# Role settings
+sys_admin_role_id = 1
+#sys_admin_role_function_delete_from_ui = true
+
+# Profile Search settings
+#profile_search_report_id=181
+#callable_profile_search_report_id=386
diff --git a/onap-enabler-be/src/test/resources/asdc.properties b/onap-enabler-be/src/test/resources/asdc.properties
new file mode 100644
index 0000000..bbe736d
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/asdc.properties
@@ -0,0 +1,6 @@
+asdc.client.type=LOCAL
+
+asdc.client.rest.protocol=http
+asdc.client.rest.host=c2.vm1.sdc.simpledemo.openecomp.org
+asdc.client.rest.port=8080
+asdc.client.rest.auth=Basic dmlkOktwOGJKNFNYc3pNMFdYbGhhazNlSGxjc2UyZ0F3ODR2YW9HR21KdlV5MlU=
diff --git a/onap-enabler-be/src/test/resources/cr-csar.JSON b/onap-enabler-be/src/test/resources/cr-csar.JSON
new file mode 100644
index 0000000..326ec16
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/cr-csar.JSON
@@ -0,0 +1,77 @@
+{
+  "service": {
+    "uuid": "76f27dfe-33e5-472f-8e0b-acf524adc4f0",
+    "invariantUuid": "c3618e16-bb5b-433a-a6e0-565ca79d8b65",
+    "name": "MSO_Example_Service",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Network L4+",
+    "serviceType": "",
+    "serviceRole": "",
+    "description": "MSO_Example_Service",
+    "serviceEcompNaming": "true",
+    "instantiationType": "ClientConfig",
+    "inputs": {
+
+    }
+  },
+  "vnfs": {
+
+  },
+  "networks": {
+
+  },
+  "collectionResource": {
+    "MSO_Example 0": {
+      "uuid": "4f8068d9-fb13-49fc-9e39-634d2094b659",
+      "invariantUuid": "2fc1b3b8-b8ed-413e-add8-3d903cf2b458",
+      "description": "MSO_Example",
+      "name": "MSO_Example",
+      "version": "0.2",
+      "customizationUuid": "fffc356d-9e95-4d9c-aa64-7273f33aae84",
+      "inputs": null,
+      "commands": {
+
+      },
+      "properties": {
+        "MSO_Example..NetworkCollection..0_network_collection_function": "fffff",
+        "MSO_Example..NetworkCollection..0_network_collection_description": "ddd",
+        "MSO_Example..Fixed..0_quantity": "89"
+      },
+      "type": "CR",
+      "category": "Network L2-3",
+      "subcategory": "Infrastructure",
+      "resourceVendor": "cisco",
+      "customizationUUID": "fffc356d-9e95-4d9c-aa64-7273f33aae84",
+      "resourceVendorRelease": "1.0",
+      "resourceVendorModelNumber": "",
+      "networksCollection": {
+        "MSO_Example..NetworkCollection..0": {
+          "uuid": "f4cb3cb6-a45d-474d-9af8-f4ae2e733ef7",
+          "invariantUuid": "f3cf3727-f779-4721-b989-851722c64ca4",
+          "name": "MSO_Example..NetworkCollection..0",
+          "version": "1",
+          "networkCollectionProperties": {
+            "networkCollectionFunction": "fffff",
+            "networkCollectionDescription": "ddd"
+          }
+        }
+      }
+    }
+  },
+  "configurations": {
+
+  },
+  "serviceProxies": {
+
+  },
+  "vfModules": {
+
+  },
+  "volumeGroups": {
+
+  },
+  "pnfs": {
+
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/csv_files/csv_to_json.csv b/onap-enabler-be/src/test/resources/csv_files/csv_to_json.csv
new file mode 100644
index 0000000..2e0f41d
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/csv_files/csv_to_json.csv
@@ -0,0 +1,99 @@
+﻿payload,request-parameters,,,vnf-name,ibcx0099v
+payload,request-parameters,[vm],,vm-name,ibcx0001vm001
+payload,request-parameters,[vm],[vnfc],vnfc-name,ibcx0001vm001dbg001
+payload,request-parameters,[vm],[vnfc],vnfc-function-code,dbg
+payload,request-parameters,[vm],[vnfc],vnfc-type,DBE-VM #1
+payload,request-parameters,[vm],[vnfc],group-notation,ibcx0001vm001dbg001pair
+payload,request-parameters,[vm],[vnfc],ipaddress-v4-oam-vip,135.21.166.39
+payload,request-parameters,[vm],,vm-name,ibcx0001vm002
+payload,request-parameters,[vm],[vnfc],vnfc-name,ibcx0001vm002dbg001
+payload,request-parameters,[vm],[vnfc],vnfc-function-code,dbg
+payload,request-parameters,[vm],[vnfc],vnfc-type,DBE-VM #1
+payload,request-parameters,[vm],[vnfc],group-notation,ibcx0001vm001dbg001pair
+,,,,,
+payload,request-parameters,,,template-name,vdbe_template1
+payload,configuration,,,configuration-string,"   <configuration xmlns=""http://xml.juniper.net/xnm/1.1/xnm"" 
+    xmlns:a=""http://xml.juniper.net/junos/15.1X49/junos"" >
+            <version>15.1X49-D50.3</version>
+            <groups>
+                <name>node0</name>
+                <system>
+                    <host-name>$node0_hostname</host-name>
+                    <backup-router>
+                        <address>$node0_backup_router_address</address>
+                        <destination>0.0.0.0/0</destination>
+             </backup-router>
+                </system>
+     </groups>
+    </configuration>"
+payload,configuration,,,configuration-json,"{
+   ""version"": ""15.1X49-D50.3"",
+   ""groups"": {
+      ""name"": ""node0"",
+      ""system"": {
+         ""host-name"": ""$node0_hostname"",
+         ""backup-router"": {
+            ""address"": ""$node0_backup_router_address"",
+            ""destination"": ""0.0.0.0/0""
+         }
+      }
+   }
+}"
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+payload,configuration-parameters,nat_source_sp_v6rogerssnat_address1,2001:1890:fc45:f025:135:25:246:c806/128
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
diff --git a/onap-enabler-be/src/test/resources/csv_files/empty_file.csv b/onap-enabler-be/src/test/resources/csv_files/empty_file.csv
new file mode 100644
index 0000000..e7bc056
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/csv_files/empty_file.csv
@@ -0,0 +1,18 @@
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
+,,,,,
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/csv_files/missing_content.csv b/onap-enabler-be/src/test/resources/csv_files/missing_content.csv
new file mode 100644
index 0000000..0c02fc8
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/csv_files/missing_content.csv
@@ -0,0 +1,2 @@
+payload,request-parameters,,,ibcx0099v
+payload,request-parameters,,aa,vv
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/csv_files/missing_values.csv b/onap-enabler-be/src/test/resources/csv_files/missing_values.csv
new file mode 100644
index 0000000..9a2a8d6
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/csv_files/missing_values.csv
@@ -0,0 +1,2 @@
+payload,,,,,
+payload,request-parameters,,aa,vv
diff --git a/onap-enabler-be/src/test/resources/csv_files/one_line.csv b/onap-enabler-be/src/test/resources/csv_files/one_line.csv
new file mode 100644
index 0000000..315e939
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/csv_files/one_line.csv
@@ -0,0 +1 @@
+payload,request-parameters,,,vnf-name,ibcx0099v
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/git.properties b/onap-enabler-be/src/test/resources/git.properties
new file mode 100644
index 0000000..ada0a47
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/git.properties
@@ -0,0 +1,3 @@
+git.commit.id=123987
+git.commit.message.short=Test short commit message
+git.commit.time=1999-09-12T13\:48\:55+0200
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/mso.properties b/onap-enabler-be/src/test/resources/mso.properties
new file mode 100644
index 0000000..b58ba56
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/mso.properties
@@ -0,0 +1,17 @@
+mso.server.url=http://mtanjv9moah01-eth0.aic.cip.att.com:8080/ecomp/mso/infra
+mso.polling.interval.msecs=2000
+mso.max.polls=3
+mso.user.name=infraportal
+mso.password.x=OBF:1ghz1kfx1j1w1m7w1i271e8q1eas1hzj1m4i1iyy1kch1gdz
+mso.restapi.svc.instance=/serviceInstances/v3
+mso.restapi.vnf.instance=/serviceInstances/v3/<service_instance_id>/vnfs
+mso.restapi.network.instance=/serviceInstances/v3/<service_instance_id>/networks
+mso.restapi.vf.module.instance=/serviceInstantiation/v7/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules/scaleOut
+mso.restapi.volume.group.instance=/serviceInstances/v3/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups
+mso.restapi.configurations=/serviceInstances/v6/<service_instance_id>/configurations
+mso.restapi.get.orc.req=/orchestrationRequests/v3
+mso.restapi.get.orc.reqs=/orchestrationRequests/v3?
+mso.restapi.get.man.tasks=/tasks/v1
+mso.dme2.client.timeout=30000
+mso.dme2.client.read.timeout=120000
+mso.dme2.server.url=http://mso-api-handler-anap-v1.mso.ecomp.att.com/services/ecomp/mso?version=1607&envContext=TEST&routeOffer=st_mtsnj
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/msoRequest.json b/onap-enabler-be/src/test/resources/msoRequest.json
new file mode 100644
index 0000000..f7f0a82
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/msoRequest.json
@@ -0,0 +1,25 @@
+{
+  "requestDetails": {
+    "requestInfo": {
+      "instanceName": "KLKLKL",
+      "source": "VID",
+      "suppressRollback": false,
+      "requestorId": "1"
+    },
+    "modelInfo": {
+      "modelType": "service",
+      "modelInvariantId": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+      "modelVersionId": "1de57bcf-365a-4ba7-8a51-7377b7144586",
+      "modelName": "1707vidnf",
+      "modelVersion": "2.0"
+    },
+    "requestParameters": {
+      "userParams": [],
+      "subscriptionServiceType": "HNGATEWAY",
+      "aLaCarte": true
+    },
+    "subscriberInfo": {
+      "globalSubscriberId": "21014aa2-9e71128cae7-jl319x"
+    }
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/objectconfig.properties b/onap-enabler-be/src/test/resources/objectconfig.properties
new file mode 100644
index 0000000..0093129
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/objectconfig.properties
@@ -0,0 +1,18 @@
+baseURL=http://vid.onap.org:9080/vid/login_external.htm
+
+
+
+login=//input[@class='fn-ebz-text ng-pristine ng-valid']
+pwd=//input[@class='span3 ng-pristine ng-valid']
+loginButton=loginBtn
+
+
+profilelink=html/body/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div/accordion/div/div[5]/a/span
+refreshButtonSubscriberName=//img[@src='static/fusion/images/refresh.jpg']
+
+subscriberNameDropDown=.//*[@id='mContent']/div/div/table/tbody/tr[1]/td[2]/div/select
+serviceTypeDropDown=.//*[@id='mContent']/div/div/table/tbody/tr[2]/td[2]/div/select
+submitButton=.//*[@id='mContent']/div/div/table/tbody/tr[3]/td/div/button
+
+test.loginId=2222
+test.loginPassword=2222
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/activateOperationalEnvironmentsPayloadToMso.json b/onap-enabler-be/src/test/resources/payload_jsons/activateOperationalEnvironmentsPayloadToMso.json
new file mode 100644
index 0000000..c6a8cf7
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/activateOperationalEnvironmentsPayloadToMso.json
@@ -0,0 +1,23 @@
+{
+  "requestDetails": {
+    "requestInfo": {
+      "resourceType": "operationalEnvironment",
+      "source": "VID",
+      "requestorId": "<userId>"
+    },
+    "relatedInstanceList": [
+      {
+        "relatedInstance": {
+          "resourceType": "operationalEnvironment",
+          "instanceId": "<relatedInstanceId>",
+          "instanceName": "<relatedInstanceName>"
+        }
+      }
+    ],
+    "requestParameters": {
+      "operationalEnvironmentType": "VNF",
+      "workloadContext": "<workloadContext>",
+      "manifest": <manifest>
+    }
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request.json b/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request.json
new file mode 100644
index 0000000..e57c5a9
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request.json
@@ -0,0 +1,95 @@
+{
+	"requestDetails": {
+		"modelInfo": {
+			"modelType": "service",
+			"modelInvariantId": "5d48acb5-097d-4982-aeb2-f4a3bd87d31b",
+			"modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a",
+			"modelName": "MOW AVPN vMX BV vPE 1 Service",
+			"modelVersion": "10.0"
+		},
+		"owningEntity": {
+			"owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
+			"owningEntityName": "PACKET CORE"
+		},
+		"project": {
+			"projectName": "{some project name}"
+		},
+		"subscriberInfo": {
+			"globalSubscriberId": "{some subscriber id}"
+		},
+		"requestInfo": {
+			"instanceName": "vPE_Service",
+			"productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+			"source": "VID",
+			"suppressRollback": true,
+			"requestorId": "az2016"
+		},
+		"requestParameters": {
+			"subscriptionServiceType": "VMX",
+			"aLaCarte": false,
+			"userParams": [{
+				"service": {
+					"modelInfo": {
+						"modelType": "service",
+						"modelName": "MOW AVPN vMX BV vPE 1 Service",
+						"modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a"
+					},
+					"instanceName": "vPE_Service",
+					"instanceParams": [{
+						"instanceParams_test1": "some text",
+						"instanceParams_test2": "another text"
+					}],
+					"resources": {
+						"vnfs": [{
+							"modelInfo": {
+								"modelType": "vnf",
+								"modelName": "2016-73_MOW-AVPN-vPE-BV-L",
+								"modelVersionId": "7f40c192-f63c-463e-ba94-286933b895f8",
+								"modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L 0",
+								"modelCustomizationId": "ab153b6e-c364-44c0-bef6-1f2982117f04"
+							},
+							"cloudConfiguration": {
+								"lcpCloudRegionId": "mdt1",
+								"tenantId": "88a6ca3ee0394ade9403f075db23167e"
+							},
+							"platform": {
+								"platformName": "platformName"
+							},
+							"lineOfBusiness": {
+								"lineOfBusinessName": "lineOfBusinessName"
+							},
+							"productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+							"instanceName": "vmxnjr001",
+							"instanceParams": [],
+							"vfModules": [{
+                              "modelInfo": {
+                                "modelType": "vfModule",
+                                "modelName": "201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0",
+                                "modelVersionId": "4c75f813-fa91-45a4-89d0-790ff5f1ae79",
+                                "modelCustomizationId": "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"
+                              },
+                              "instanceName": "vmxnjr001_AVPN_base_vPE_BV_base_001",
+                              "instanceParams": [{
+                                "vmx_int_net_len": "24"
+                              }]
+                            },
+                              {
+                                "modelInfo": {
+                                  "modelType": "vfModule",
+                                  "modelName": "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
+                                  "modelVersionId": "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
+                                  "modelCustomizationId": "72d9d1cd-f46d-447a-abdb-451d6fb05fa8"
+                                },
+                                "instanceName": "vmxnjr001_AVPN_base_vRE_BV_expansion_001",
+                                "instanceParams": [{
+                                  "availability_zone_0": "mtpocdv-kvm-az01",
+                                  "vre_a_volume_size_0": "100"
+                                }]
+                              }]
+						}]
+					}
+				}
+			}]
+		}
+	}
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request_ecomp_naming.json b/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request_ecomp_naming.json
new file mode 100644
index 0000000..52e9b54
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request_ecomp_naming.json
@@ -0,0 +1,90 @@
+{
+	"requestDetails": {
+		"modelInfo": {
+			"modelType": "service",
+			"modelInvariantId": "5d48acb5-097d-4982-aeb2-f4a3bd87d31b",
+			"modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a",
+			"modelName": "MOW AVPN vMX BV vPE 1 Service",
+			"modelVersion": "10.0"
+		},
+		"owningEntity": {
+			"owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
+			"owningEntityName": "PACKET CORE"
+		},
+		"project": {
+			"projectName": "{some project name}"
+		},
+		"subscriberInfo": {
+			"globalSubscriberId": "{some subscriber id}"
+		},
+		"requestInfo": {
+			"productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+			"source": "VID",
+			"suppressRollback": false,
+			"requestorId": "az2016"
+		},
+		"requestParameters": {
+			"subscriptionServiceType": "VMX",
+			"aLaCarte": false,
+			"userParams": [{
+				"service": {
+					"modelInfo": {
+						"modelType": "service",
+						"modelName": "MOW AVPN vMX BV vPE 1 Service",
+						"modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a"
+					},
+					"instanceParams": [{
+						"instanceParams_test1": "some text",
+						"instanceParams_test2": "another text"
+					}],
+					"resources": {
+						"vnfs": [{
+							"modelInfo": {
+								"modelType": "vnf",
+								"modelName": "2016-73_MOW-AVPN-vPE-BV-L",
+								"modelVersionId": "7f40c192-f63c-463e-ba94-286933b895f8",
+								"modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L 0",
+								"modelCustomizationId": "ab153b6e-c364-44c0-bef6-1f2982117f04"
+							},
+							"cloudConfiguration": {
+								"lcpCloudRegionId": "mdt1",
+								"tenantId": "88a6ca3ee0394ade9403f075db23167e"
+							},
+							"platform": {
+								"platformName": "platformName"
+							},
+							"lineOfBusiness": {
+								"lineOfBusinessName": "lineOfBusinessName"
+							},
+							"productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+							"instanceParams": [],
+							"vfModules": [{
+                              "modelInfo": {
+                                "modelType": "vfModule",
+                                "modelName": "201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0",
+                                "modelVersionId": "4c75f813-fa91-45a4-89d0-790ff5f1ae79",
+                                "modelCustomizationId": "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"
+                              },
+                              "instanceParams": [{
+                                "vmx_int_net_len": "24"
+                              }]
+                            },
+                              {
+                                "modelInfo": {
+                                  "modelType": "vfModule",
+                                  "modelName": "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
+                                  "modelVersionId": "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
+                                  "modelCustomizationId": "72d9d1cd-f46d-447a-abdb-451d6fb05fa8"
+                                },
+                                "instanceParams": [{
+                                  "availability_zone_0": "mtpocdv-kvm-az01",
+                                  "vre_a_volume_size_0": "100"
+                                }]
+                              }]
+						}]
+					}
+				}
+			}]
+		}
+	}
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request_no_vfmodule_ecomp_naming.json b/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request_no_vfmodule_ecomp_naming.json
new file mode 100644
index 0000000..3640593
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request_no_vfmodule_ecomp_naming.json
@@ -0,0 +1,67 @@
+{
+	"requestDetails": {
+		"modelInfo": {
+			"modelType": "service",
+			"modelInvariantId": "5d48acb5-097d-4982-aeb2-f4a3bd87d31b",
+			"modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a",
+			"modelName": "MOW AVPN vMX BV vPE 1 Service",
+			"modelVersion": "10.0"
+		},
+		"owningEntity": {
+			"owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
+			"owningEntityName": "PACKET CORE"
+		},
+		"project": {
+			"projectName": "{some project name}"
+		},
+		"subscriberInfo": {
+			"globalSubscriberId": "{some subscriber id}"
+		},
+		"requestInfo": {
+			"productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+			"source": "VID",
+			"suppressRollback": false,
+			"requestorId": "az2016"
+		},
+		"requestParameters": {
+			"subscriptionServiceType": "VMX",
+			"aLaCarte": false,
+			"userParams": [{
+				"service": {
+					"modelInfo": {
+						"modelType": "service",
+						"modelName": "MOW AVPN vMX BV vPE 1 Service",
+						"modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a"
+					},
+					"instanceParams": [{
+						"instanceParams_test1": "some text",
+						"instanceParams_test2": "another text"
+					}],
+					"resources": {
+						"vnfs": [{
+							"modelInfo": {
+								"modelType": "vnf",
+								"modelName": "2016-73_MOW-AVPN-vPE-BV-L",
+								"modelVersionId": "7f40c192-f63c-463e-ba94-286933b895f8",
+								"modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L 0",
+								"modelCustomizationId": "ab153b6e-c364-44c0-bef6-1f2982117f04"
+							},
+							"cloudConfiguration": {
+								"lcpCloudRegionId": "mdt1",
+								"tenantId": "88a6ca3ee0394ade9403f075db23167e"
+							},
+							"platform": {
+								"platformName": "platformName"
+							},
+							"lineOfBusiness": {
+								"lineOfBusinessName": "lineOfBusinessName"
+							},
+							"productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+							"instanceParams": []
+						}]
+					}
+				}
+			}]
+		}
+	}
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request_unique_names.json b/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request_unique_names.json
new file mode 100644
index 0000000..e6c58b9
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/bulk_service_request_unique_names.json
@@ -0,0 +1,96 @@
+{
+	"requestDetails": {
+		"modelInfo": {
+			"modelType": "service",
+			"modelInvariantId": "5d48acb5-097d-4982-aeb2-f4a3bd87d31b",
+			"modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a",
+			"modelName": "MOW AVPN vMX BV vPE 1 Service",
+			"modelVersion": "10.0"
+		},
+		"owningEntity": {
+			"owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
+			"owningEntityName": "PACKET CORE"
+		},
+		"project": {
+			"projectName": "{some project name}"
+		},
+		"subscriberInfo": {
+			"globalSubscriberId": "{some subscriber id}"
+		},
+		"requestInfo": {
+			"instanceName": "vPE_Service_{SERVICE_UNIQENESS}",
+			"productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+			"source": "VID",
+			"suppressRollback": true,
+			"requestorId": "az2016"
+		},
+		"requestParameters": {
+			"subscriptionServiceType": "VMX",
+			"aLaCarte": false,
+			"userParams": [{
+				"service": {
+					"modelInfo": {
+						"modelType": "service",
+						"modelName": "MOW AVPN vMX BV vPE 1 Service",
+						"modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a"
+					},
+					"instanceName": "vPE_Service_{SERVICE_UNIQENESS}",
+					"instanceParams": [{
+						"instanceParams_test1": "some text",
+						"instanceParams_test2": "another text"
+					}],
+					"resources": {
+						"vnfs": [{
+							"modelInfo": {
+								"modelType": "vnf",
+								"modelName": "2016-73_MOW-AVPN-vPE-BV-L",
+								"modelVersionId": "7f40c192-f63c-463e-ba94-286933b895f8",
+								"modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L 0",
+								"modelCustomizationId": "ab153b6e-c364-44c0-bef6-1f2982117f04"
+							},
+							"cloudConfiguration": {
+								"lcpCloudRegionId": "mdt1",
+								"tenantId": "88a6ca3ee0394ade9403f075db23167e"
+							},
+							"platform": {
+								"platformName": "platformName"
+							},
+							"lineOfBusiness": {
+								"lineOfBusinessName": "lineOfBusinessName"
+							},
+							"productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+							"instanceName": "vmxnjr001_{VNF_UNIQENESS}",
+							"instanceParams": [],
+							"vfModules": [{
+                              "modelInfo": {
+                                "modelType": "vfModule",
+                                "modelName": "201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0",
+                                "modelVersionId": "4c75f813-fa91-45a4-89d0-790ff5f1ae79",
+                                "modelCustomizationId": "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"
+                              },
+                              "instanceName": "vmxnjr001_AVPN_base_vPE_BV_base_{VF_MODULE_UNIQENESS}",
+                              "instanceParams": [{
+                                "vmx_int_net_len": "24"
+                              }]
+                            },
+                              {
+                                "modelInfo": {
+                                  "modelType": "vfModule",
+                                  "modelName": "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
+                                  "modelVersionId": "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
+                                  "modelCustomizationId": "72d9d1cd-f46d-447a-abdb-451d6fb05fa8"
+                                },
+                                "instanceName": "vmxnjr001_AVPN_base_vRE_BV_expansion_{VF_MODULE_2_UNIQENESS}",
+                                "volumeGroupInstanceName" : "myVgName_{VG_UNIQUENESS}",
+                                "instanceParams": [{
+                                  "availability_zone_0": "mtpocdv-kvm-az01",
+                                  "vre_a_volume_size_0": "100"
+                                }]
+                              }]
+						}]
+					}
+				}
+			}]
+		}
+	}
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/createOperationalEnvironmentsPayloadToMso.json b/onap-enabler-be/src/test/resources/payload_jsons/createOperationalEnvironmentsPayloadToMso.json
new file mode 100644
index 0000000..3a96bb9
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/createOperationalEnvironmentsPayloadToMso.json
@@ -0,0 +1,24 @@
+{
+  "requestDetails": {
+    "requestInfo": {
+      "resourceType": "operationalEnvironment",
+      "instanceName": "<instanceName>",
+      "source": "VID",
+      "requestorId": "<userId>"
+    },
+    "relatedInstanceList": [
+      {
+        "relatedInstance": {
+          "resourceType": "operationalEnvironment",
+          "instanceId": "<ecompInstanceId>",
+          "instanceName": "<ecompInstanceName>"
+        }
+      }
+    ],
+    "requestParameters": {
+      "operationalEnvironmentType": "<operationalEnvType>",
+      "tenantContext": "<tenantContext>",
+      "workloadContext": "<workloadContext>"
+    }
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/deactivateOperationalEnvironmentsPayloadToMso.json b/onap-enabler-be/src/test/resources/payload_jsons/deactivateOperationalEnvironmentsPayloadToMso.json
new file mode 100644
index 0000000..38c2224
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/deactivateOperationalEnvironmentsPayloadToMso.json
@@ -0,0 +1,12 @@
+{
+  "requestDetails": {
+    "requestInfo": {
+      "resourceType": "operationalEnvironment",
+      "source": "VID",
+      "requestorId": "<userId>"
+    },
+    "requestParameters": {
+      "operationalEnvironmentType": "VNF"
+    }
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/mso_request_create_configuration.json b/onap-enabler-be/src/test/resources/payload_jsons/mso_request_create_configuration.json
new file mode 100644
index 0000000..5502e8f
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/mso_request_create_configuration.json
@@ -0,0 +1,62 @@
+
+{
+  "requestDetails": {
+    "modelInfo": {
+      "modelType": "configuration",
+      "modelInvariantId": "c30a024e-a6c6-4670-b73c-3df64eb57ff6",
+      "modelVersionId": "f58d039d-4cfc-40ec-bd75-1f05f0458a6c",
+      "modelName": "Port Mirroring Configuration By Policy",
+      "modelVersion": "1.0",
+      "modelCustomizationId": "4b7ebace-bad6-4526-9be6-bf248e20fc5f",
+      "modelCustomizationName": "Port Mirroring Configuration By Policy 1"
+    },
+    "cloudConfiguration": {
+      "lcpCloudRegionId": "AAIAIC25"
+    },
+    "requestInfo": {
+      "instanceName":"test_sssdad",
+      "source": "VID",
+      "requestorId": "1"
+    },
+    "relatedInstanceList": [
+      {
+        "relatedInstance": {
+          "instanceId": "c187e9fe-40c3-4862-b73e-84ff056205f6 ",
+          "modelInfo": {
+            "modelType": "service",
+            "modelInvariantId": "b7d923c9-6175-41f1-91ba-4565c4953408",
+            "modelVersionId": "ee6d61be-4841-4f98-8f23-5de9da846ca7",
+            "modelName": "ServiceContainerMultiplepProbes",
+            "modelVersion": "1.0"
+          }
+        }
+      },
+      {
+        "relatedInstance": {
+          "instanceId": "9be14a4f-7367-4cf9-96a1-f08f10f485a7",
+          "instanceDirection": "source",
+          "modelInfo": {
+            "modelType": "vnf",
+            "modelInvariantId": "a7eac2b3-8444-40ee-92e3-b3359b32445c",
+            "modelVersionId": "2a2ea15f-07c6-4b89-bfca-e8aba39a34d6",
+            "modelName": "vmmeService2",
+            "modelVersion": "1.0",
+            "modelCustomizationId": "060be63d-5f9c-4fd0-8ef7-830d5e8eca17"
+          }
+        }
+      },
+      {
+        "relatedInstance": {
+          "instanceId": "AS-pnf2-10219--as988q",
+          "instanceDirection": "destination",
+          "modelInfo": {
+            "modelType": "pnf"
+          }
+        }
+      }
+    ],
+    "requestParameters": {
+      "userParams": []
+    }
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/mso_service_instantiation.json b/onap-enabler-be/src/test/resources/payload_jsons/mso_service_instantiation.json
new file mode 100644
index 0000000..115a715
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/mso_service_instantiation.json
@@ -0,0 +1,95 @@
+{
+  "requestDetails": {
+    "modelInfo": {
+      "modelType": "service",
+      "modelInvariantId": "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+      "modelVersionId": "fe6985cd-ea33-3346-ac12-ab121484a3fe",
+      "modelName": "Test",
+      "modelVersion": "1.0"
+    },
+    "cloudConfiguration": {
+      "lcpCloudRegionId": "mdt1",
+      "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+    },
+    "owningEntity": {
+      "owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
+      "owningEntityName": "PACKET CORE"
+    },
+    "project": {
+      "projectName": "TODO"
+    },
+    "subscriberInfo": {
+      "globalSubscriberId": "TODO",
+      "subscriberName": "TODO"
+    },
+    "requestInfo": {
+      "productFamilyId":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+      "source": "VID",
+      "suppressRollback": true,
+      "requestorId": "az2016"
+    },
+    "requestParameters": {
+      "subscriptionServiceType":"MOG",
+      "aLaCarte": false,
+      "userParams": [{
+        "name": "TODO",
+        "value": "TODO"
+      }
+      ]
+    }
+  }
+}
+/*
+{
+  "modelInfo":{
+    "modelType":"service",
+    "modelInvariantId":"5d48acb5-097d-4982-aeb2-f4a3bd87d31b",
+    "modelVersionId":"3c40d244-808e-42ca-b09a-256d83d19d0a",
+    "modelName":"MOW AVPN vMX BV vPE 1 Service",
+    "modelVersion":"10.0"
+  },
+  "owningEntityId":"038d99af-0427-42c2-9d15-971b99b9b489",
+  "owningEntityName":"PACKET CORE",
+  "projectName":"{some project name}",
+  "globalSubscriberId":"{some subscriber id}",
+  "productFamilyId":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+  "instanceName":"vPE_Service",
+  "subscriptionServiceType":"VMX",
+  "lcpCloudRegionId":"mdt1",
+  "tenantId":"88a6ca3ee0394ade9403f075db23167e",
+  "vnfs":[
+    {
+      "modelInfo":{
+        "modelName":"2016-73_MOW-AVPN-vPE-BV-L",
+        "modelVersionId":"7f40c192-f63c-463e-ba94-286933b895f8",
+        "modelCustomizationName":"2016-73_MOW-AVPN-vPE-BV-L 0",
+        "modelCustomizationId":"ab153b6e-c364-44c0-bef6-1f2982117f04"
+      },
+      "lcpCloudRegionId":"mdt1",
+      "tenantId":"88a6ca3ee0394ade9403f075db23167e",
+      "platformName":"test",
+      "productFamilyId":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+      "instanceName":"vmxnjr001",
+      "instanceParams":[
+
+      ],
+      "vfModules":[
+        {
+          "modelInfo":{
+            "modelType":"vfModule",
+            "modelName":"201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0",
+            "modelVersionId":"4c75f813-fa91-45a4-89d0-790ff5f1ae79",
+            "modelCustomizationId":"a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"
+          },
+          "instanceName":"vmxnjr001_AVPN_base_vPE_BV_base_001",
+          "instanceParams":[
+            {
+              "vmx_int_net_len":"24"
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
+*/
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/scaleOutVfModulePayload.json b/onap-enabler-be/src/test/resources/payload_jsons/scaleOutVfModulePayload.json
new file mode 100644
index 0000000..5fde429
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/scaleOutVfModulePayload.json
@@ -0,0 +1,67 @@
+{
+    "vnfName":"test",
+    "vnfInstanceId":"123",
+    "relatedInstanceList": [
+      {
+        "relatedInstance": {
+          "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+          "modelInfo": {
+            "modelType": "service",
+            "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b",
+            "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+            "modelName": "ws-service",
+            "modelVersion": "1.0",
+            "additionalProperties": {}
+          }
+        }
+      },
+      {
+        "relatedInstance": {
+          "instanceId": "980fe98e-47f8-4164-862d-4ebb026cec75",
+          "modelInfo": {
+            "modelType": "vnf",
+            "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687",
+            "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+            "modelName": "ws-sp",
+            "modelVersion": "1.0",
+            "modelCustomizationName": "ws-sp 0",
+            "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986",
+            "additionalProperties": {}
+          }
+        }
+      }
+    ],
+    "cloudConfiguration": {
+      "lcpCloudRegionId": "RegionOne",
+      "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e",
+      "additionalProperties": {}
+    },
+    "modelInfo": {
+      "modelCustomizationName": "WsSp..base_ws..module-0",
+      "modelCustomizationId": "bfcc8f57-7b56-4be8-a8f1-e44262c83318",
+      "modelInvariantId": "763b1172-b5f5-4062-9d79-2459710fa0bc",
+      "modelVersionId": "53f52586-236b-4d52-a94c-990883e054f0",
+      "modelName": "WsSp..base_ws..module-0",
+      "modelNameVersionId": null,
+      "modelType": "vfModule",
+      "modelVersion": "1",
+      "additionalProperties": {}
+    },
+    "requestInfo": {
+      "instanceName": "ws-test-0310-8_NaN",
+      "source": "VID",
+      "suppressRollback": false,
+      "requestorId": "demo",
+      "additionalProperties": {}
+    },
+    "requestParameters": {
+      "additionalProperties": {}
+    },
+    "configurationParameters": [
+      {
+        "availability-zone": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]",
+        "xtz-123": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]"
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json b/onap-enabler-be/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json
new file mode 100644
index 0000000..5409f89
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json
@@ -0,0 +1,66 @@
+{
+  "requestDetails": {
+    "relatedInstanceList": [
+      {
+        "relatedInstance": {
+          "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+          "modelInfo": {
+            "modelType": "service",
+            "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b",
+            "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+            "modelName": "ws-service",
+            "modelVersion": "1.0",
+            "additionalProperties": {}
+          }
+        }
+      },
+      {
+        "relatedInstance": {
+          "instanceId": "980fe98e-47f8-4164-862d-4ebb026cec75",
+          "modelInfo": {
+            "modelType": "vnf",
+            "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687",
+            "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+            "modelName": "ws-sp",
+            "modelVersion": "1.0",
+            "modelCustomizationName": "ws-sp 0",
+            "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986",
+            "additionalProperties": {}
+          }
+        }
+      }
+    ],
+    "cloudConfiguration": {
+      "lcpCloudRegionId": "RegionOne",
+      "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e",
+      "additionalProperties": {}
+    },
+    "modelInfo": {
+      "modelCustomizationName": "WsSp..base_ws..module-0",
+      "modelCustomizationId": "bfcc8f57-7b56-4be8-a8f1-e44262c83318",
+      "modelInvariantId": "763b1172-b5f5-4062-9d79-2459710fa0bc",
+      "modelVersionId": "53f52586-236b-4d52-a94c-990883e054f0",
+      "modelName": "WsSp..base_ws..module-0",
+      "modelNameVersionId": null,
+      "modelType": "vfModule",
+      "modelVersion": "1",
+      "additionalProperties": {}
+    },
+    "requestInfo": {
+      "instanceName": "ws-test-0310-8_NaN",
+      "source": "VID",
+      "suppressRollback": false,
+      "requestorId": "demo",
+      "additionalProperties": {}
+    },
+    "requestParameters": {
+      "additionalProperties": {}
+    },
+    "configurationParameters": [
+      {
+        "availability-zone": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]",
+        "xtz-123": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]"
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/pnf.csar b/onap-enabler-be/src/test/resources/pnf.csar
new file mode 100644
index 0000000..eb42484
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/pnf.csar
Binary files differ
diff --git a/onap-enabler-be/src/test/resources/policy-configuration-by-policy-false.JSON b/onap-enabler-be/src/test/resources/policy-configuration-by-policy-false.JSON
new file mode 100644
index 0000000..648ff70
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/policy-configuration-by-policy-false.JSON
@@ -0,0 +1,166 @@
+{
+  "service": {
+    "uuid": "ee6d61be-4841-4f98-8f23-5de9da845544",
+    "invariantUuid": "b7d923c9-6175-41f1-91ba-4565c4955555",
+    "name": "ServiceContainerMultiplepProbes2",
+    "version": "2.0",
+    "toscaModelURL": null,
+    "category": "Network L1-3",
+    "serviceType": "portMirroring",
+    "serviceRole": "pProbe",
+    "description": "sdfsdfsdf",
+    "serviceEcompNaming": "true",
+    "inputs": {}
+  },
+  "vnfs": {},
+  "networks": {},
+  "configurations": {
+    "Port Mirroring Configuration By Policy 1": {
+      "uuid": "f58d039d-4cfc-40ec-bd75-1f05f0434567",
+      "invariantUuid": "c30a024e-a6c6-4670-b73c-3df64eb57ff6",
+      "description": "A port mirroring configuration by policy object",
+      "name": "Port Mirroring Configuration By Policy",
+      "version": "1.0",
+      "customizationUuid": "4b7ebace-bad6-4526-9be6-bf248e20fc5f",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "collector_node": "pprobeservice_proxy 5",
+        "policy_name": "policy2",
+        "equip_vendor": "Cisco",
+        "equip_model": "Nexus 3048-TP"
+      },
+      "type": "Configuration",
+      "modelCustomizationName": "Port Mirroring Configuration By Policy 1",
+      "sourceNodes": [
+        "vmmeservice2_proxy 2",
+        "vmmeservice2_proxy 3"
+      ],
+      "collectorNodes": [
+        "pprobeservice_proxy 5"
+      ],
+      "configurationByPolicy": false
+    },
+    "Port Mirroring Configuration By Policy 0": {
+      "uuid": "f58d039d-4cfc-40ec-bd75-1f05f0458a6c",
+      "invariantUuid": "c30a024e-a6c6-4670-b73c-3df64eb57ff6",
+      "description": "A port mirroring configuration by policy object",
+      "name": "Port Mirroring Configuration By Policy",
+      "version": "1.0",
+      "customizationUuid": "08a181aa-72eb-435f-9593-e88a3ad0a86b",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "collector_node": "pprobeservice_proxy 4",
+        "policy_name": "policy1",
+        "equip_vendor": "Cisco",
+        "equip_model": "Nexus 3048-TP"
+      },
+      "type": "Configuration",
+      "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+      "sourceNodes": [
+        "vmmeservice2_proxy 2",
+        "vmmeservice_proxy 1",
+        "vmmeservice_proxy 0"
+      ],
+      "collectorNodes": [
+      ],
+      "configurationByPolicy": true
+    }
+  },
+  "serviceProxies": {
+    "vmmeservice_proxy 0": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService",
+      "name": "vmmeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "d7cfe338-eeda-4217-ba13-f24b0811fb17",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "c3e6c9bd-b24d-458e-aa99-e0cadf70c5e5",
+      "sourceModelInvariant": "dd8a805d-3946-4f11-9831-e26cd6aec9a3",
+      "sourceModelName": "vmmeService"
+    },
+    "vmmeservice_proxy 1": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService",
+      "name": "vmmeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "7a69f133-564c-4eb6-b93e-0a8281967efb",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "c3e6c9bd-b24d-458e-aa99-e0cadf70c5e5",
+      "sourceModelInvariant": "dd8a805d-3946-4f11-9831-e26cd6aec9a3",
+      "sourceModelName": "vmmeService"
+    },
+    "vmmeservice2_proxy 3": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService2",
+      "name": "vmmeService2 Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "9d81c21f-e29c-44f6-b5f6-caa974ee078a",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "2a2ea15f-07c6-4b89-bfca-e8aba39a34d6",
+      "sourceModelInvariant": "a7eac2b3-8444-40ee-92e3-b3359b32445c",
+      "sourceModelName": "vmmeService2"
+    },
+    "pprobeservice_proxy 4": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service pProbeService",
+      "name": "pProbeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "271efa3b-276e-4536-976a-cc9c9c014f1e",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "8a84e59b-45fe-4851-8ff1-34225a0b32c3",
+      "sourceModelInvariant": "83b458fd-5dd3-419b-a9e3-7335814a0911",
+      "sourceModelName": "pProbeService"
+    },
+    "pprobeservice_proxy 5": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service pProbeService",
+      "name": "pProbeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "d64623ae-5935-4afd-803e-c86e94d8e740",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "8a84e59b-45fe-4851-8ff1-34225a0b32c3",
+      "sourceModelInvariant": "83b458fd-5dd3-419b-a9e3-7335814a0911",
+      "sourceModelName": "pProbeService"
+    },
+    "vmmeservice2_proxy 2": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService2",
+      "name": "vmmeService2 Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "060be63d-5f9c-4fd0-8ef7-830d5e8eca17",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "2a2ea15f-07c6-4b89-bfca-e8aba39a34d6",
+      "sourceModelInvariant": "a7eac2b3-8444-40ee-92e3-b3359b32445c",
+      "sourceModelName": "vmmeService2"
+    }
+  },
+  "vfModules": {},
+  "volumeGroups": {},
+  "pnfs": {}
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/policy-configuration-csar.JSON b/onap-enabler-be/src/test/resources/policy-configuration-csar.JSON
new file mode 100644
index 0000000..77f2685
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/policy-configuration-csar.JSON
@@ -0,0 +1,168 @@
+{
+  "service": {
+    "uuid": "ee6d61be-4841-4f98-8f23-5de9da846ca7",
+    "invariantUuid": "b7d923c9-6175-41f1-91ba-4565c4953408",
+    "name": "ServiceContainerMultiplepProbes",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Network L1-3",
+    "serviceType": "portMirroring",
+    "serviceRole": "pProbe",
+    "description": "sdfsdfsdf",
+    "serviceEcompNaming": "true",
+    "inputs": {}
+  },
+  "vnfs": {},
+  "networks": {},
+  "configurations": {
+    "Port Mirroring Configuration By Policy 1": {
+      "uuid": "f58d039d-4cfc-40ec-bd75-1f05f0458a6c",
+      "invariantUuid": "c30a024e-a6c6-4670-b73c-3df64eb57ff6",
+      "description": "A port mirroring configuration by policy object",
+      "name": "Port Mirroring Configuration By Policy",
+      "version": "1.0",
+      "customizationUuid": "4b7ebace-bad6-4526-9be6-bf248e20fc5f",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "collector_node": "pprobeservice_proxy 5",
+        "policy_name": "policy2",
+        "equip_vendor": "Cisco",
+        "equip_model": "Nexus 3048-TP"
+      },
+      "type": "Configuration",
+      "modelCustomizationName": "Port Mirroring Configuration By Policy 1",
+      "sourceNodes": [
+        "vmmeservice2_proxy 2",
+        "vmmeservice2_proxy 3",
+        "vmmeservice_proxy 1"
+      ],
+      "collectorNodes": [
+        "pprobeservice_proxy 5"
+      ],
+      "configurationByPolicy": true
+    },
+    "Port Mirroring Configuration By Policy 0": {
+      "uuid": "f58d039d-4cfc-40ec-bd75-1f05f0458a6c",
+      "invariantUuid": "c30a024e-a6c6-4670-b73c-3df64eb57ff6",
+      "description": "A port mirroring configuration by policy object",
+      "name": "Port Mirroring Configuration By Policy",
+      "version": "1.0",
+      "customizationUuid": "08a181aa-72eb-435f-9593-e88a3ad0a86b",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "collector_node": "pprobeservice_proxy 4",
+        "policy_name": "policy1",
+        "equip_vendor": "Cisco",
+        "equip_model": "Nexus 3048-TP"
+      },
+      "type": "Configuration",
+      "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+      "sourceNodes": [
+        "vmmeservice2_proxy 2",
+        "vmmeservice_proxy 1",
+        "vmmeservice_proxy 0"
+      ],
+      "collectorNodes": [
+        "pprobeservice_proxy 4"
+      ],
+      "configurationByPolicy": true
+    }
+  },
+  "serviceProxies": {
+    "vmmeservice_proxy 0": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService",
+      "name": "vmmeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "d7cfe338-eeda-4217-ba13-f24b0811fb17",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "c3e6c9bd-b24d-458e-aa99-e0cadf70c5e5",
+      "sourceModelInvariant": "dd8a805d-3946-4f11-9831-e26cd6aec9a3",
+      "sourceModelName": "vmmeService"
+    },
+    "vmmeservice_proxy 1": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService",
+      "name": "vmmeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "7a69f133-564c-4eb6-b93e-0a8281967efb",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "c3e6c9bd-b24d-458e-aa99-e0cadf70c5e5",
+      "sourceModelInvariant": "dd8a805d-3946-4f11-9831-e26cd6aec9a3",
+      "sourceModelName": "vmmeService"
+    },
+    "vmmeservice2_proxy 3": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService2",
+      "name": "vmmeService2 Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "9d81c21f-e29c-44f6-b5f6-caa974ee078a",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "2a2ea15f-07c6-4b89-bfca-e8aba39a34d6",
+      "sourceModelInvariant": "a7eac2b3-8444-40ee-92e3-b3359b32445c",
+      "sourceModelName": "vmmeService2"
+    },
+    "pprobeservice_proxy 4": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service pProbeService",
+      "name": "pProbeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "271efa3b-276e-4536-976a-cc9c9c014f1e",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "8a84e59b-45fe-4851-8ff1-34225a0b32c3",
+      "sourceModelInvariant": "83b458fd-5dd3-419b-a9e3-7335814a0911",
+      "sourceModelName": "pProbeService"
+    },
+    "pprobeservice_proxy 5": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service pProbeService",
+      "name": "pProbeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "d64623ae-5935-4afd-803e-c86e94d8e740",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "8a84e59b-45fe-4851-8ff1-34225a0b32c3",
+      "sourceModelInvariant": "83b458fd-5dd3-419b-a9e3-7335814a0911",
+      "sourceModelName": "pProbeService"
+    },
+    "vmmeservice2_proxy 2": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService2",
+      "name": "vmmeService2 Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "060be63d-5f9c-4fd0-8ef7-830d5e8eca17",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "2a2ea15f-07c6-4b89-bfca-e8aba39a34d6",
+      "sourceModelInvariant": "a7eac2b3-8444-40ee-92e3-b3359b32445c",
+      "sourceModelName": "vmmeService2"
+    }
+  },
+  "vfModules": {},
+  "volumeGroups": {},
+  "pnfs": {}
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/roles.json b/onap-enabler-be/src/test/resources/roles.json
new file mode 100644
index 0000000..db32392
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/roles.json
@@ -0,0 +1,8 @@
+{
+  "roles": [
+    "VID_Subscriber_serviceType1_Tenant1",
+    "VID_Subscriber_serviceType1_Tenant2",
+    "read_motorola_epost_tow",
+    "read_motorola_epost"
+  ]
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/sampleTosca.csar b/onap-enabler-be/src/test/resources/sampleTosca.csar
new file mode 100644
index 0000000..d9c469a
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/sampleTosca.csar
Binary files differ
diff --git a/onap-enabler-be/src/test/resources/services/change_management_software_update_expected_mso_request.json b/onap-enabler-be/src/test/resources/services/change_management_software_update_expected_mso_request.json
new file mode 100644
index 0000000..5bdc9ea
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/services/change_management_software_update_expected_mso_request.json
@@ -0,0 +1,15 @@
+{
+  "requestDetails": {
+    "cloudConfiguration": {
+      "lcpCloudRegionId": "mdt1",
+      "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+    },
+    "requestInfo": {
+      "source": "VID",
+      "requestorId": "az2016"
+    },
+    "requestParameters": {
+      "payload": "{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}"
+    }
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/services/change_management_software_update_request.json b/onap-enabler-be/src/test/resources/services/change_management_software_update_request.json
new file mode 100644
index 0000000..2ce2a77
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/services/change_management_software_update_request.json
@@ -0,0 +1,26 @@
+{ "requestDetails": [
+    {
+      "cloudConfiguration": {
+        "lcpCloudRegionId": "mdt1",
+        "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+      },
+      "requestInfo": {
+        "source": "VID",
+        "requestorId": "az2016"
+      },
+      "requestParameters": {
+        "payload": "{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}"
+      },
+      "vnfName": "vidVnf",
+      "vnfInstanceId": "abe59ceb-6909-4a2c-ad6a-c46d90b18f0b",
+      "relatedInstanceList": [
+        {
+          "relatedInstance": {
+            "instanceId": "166b2c5b-6746-4613-bd38-faf46f7afb73"
+          }
+        }
+      ]
+    }
+  ],
+  "requestType": "VNF In Place Software Update"
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/vf-csar.JSON b/onap-enabler-be/src/test/resources/vf-csar.JSON
new file mode 100644
index 0000000..b07ff37
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/vf-csar.JSON
@@ -0,0 +1,178 @@
+{
+  "networks": {
+
+  },
+  "service": {
+    "category": "Mobility",
+    "description": "Bla bla",
+    "serviceRole": null,
+    "serviceType": null,
+    "inputs": {
+      "greatdefect0_availability_zone_max_count": {
+        "constraints": [
+
+        ],
+        "default": 1,
+        "description": "",
+        "entry_schema": null,
+        "required": true,
+        "type": "integer"
+      },
+      "greatdefect0_itc_name_0": {
+        "constraints": [
+
+        ],
+        "default": "ab",
+        "description": "ixla itc instance name",
+        "entry_schema": null,
+        "required": true,
+        "type": "string"
+      },
+      "greatdefect0_vf_module_id": {
+        "constraints": [
+
+        ],
+        "default": "abc",
+        "description": "Unique ID for this VF Module instance",
+        "entry_schema": null,
+        "required": true,
+        "type": "string"
+      }
+    },
+    "invariantUuid": "bd9bf71a-df22-4c95-8638-89f15d875395",
+    "name": "Moriya_new_test",
+    "serviceEcompNaming": "true",
+    "toscaModelURL": null,
+    "uuid": "48a52540-8772-4368-9cdb-1f124ea5c931",
+    "version": "1.0",
+    "instantiationType": null
+  },
+  "vfModules": {
+    "greatdefect0..Greatdefect..base_ixla..module-0": {
+      "customizationUuid": "316e323d-611d-4007-a647-b1d2ecdaee9e",
+      "description": null,
+      "invariantUuid": "80ff85fb-cb11-42cb-9737-e47095d42756",
+      "modelCustomizationName": "Greatdefect..base_ixla..module-0",
+      "name": "Greatdefect..base_ixla..module-0",
+      "uuid": "01166434-ef34-4969-aaf2-626203d72e48",
+      "version": "3",
+      "volumeGroupAllowed": false
+    },
+    "greatdefect0..Greatdefect..module_1_ixla..module-2": {
+      "customizationUuid": "1106fca3-235a-4f92-8d5a-960a7336b32f",
+      "description": null,
+      "invariantUuid": "e0297a51-c670-452e-b31c-c5b37c6ad40f",
+      "modelCustomizationName": "Greatdefect..module_1_ixla..module-2",
+      "name": "Greatdefect..module_1_ixla..module-2",
+      "uuid": "6f09e053-56a6-4fbb-8299-e1de616825cc",
+      "version": "3",
+      "volumeGroupAllowed": false
+    },
+    "greatdefect0..Greatdefect..module_2_ixla..module-1": {
+      "customizationUuid": "b52c1fda-fbbf-4de3-ad9b-190d4a14990c",
+      "description": null,
+      "invariantUuid": "23befc6e-aa97-4004-b215-4979c3f84913",
+      "modelCustomizationName": "Greatdefect..module_2_ixla..module-1",
+      "name": "Greatdefect..module_2_ixla..module-1",
+      "uuid": "dea8e41f-c996-4557-b521-263210d96baa",
+      "version": "3",
+      "volumeGroupAllowed": false
+    }
+  },
+  "vnfs": {
+    "greatdefect 0": {
+      "uuid": "3b25707a-d345-4a80-8744-73adf8f2e67b",
+      "invariantUuid": "d149c45a-b42f-419a-9fac-f9c359fc2034",
+      "description": "checl-IdanWithSecondFix",
+      "name": "greatdefect",
+      "version": "3.0",
+      "customizationUuid": "9123ced3-fbcd-42f7-b103-5965c54bbd66",
+      "inputs": {
+
+      },
+      "commands": {
+
+      },
+      "properties": {
+        "availability_zone_max_count": "get_input:greatdefect0_availability_zone_max_count",
+        "itc_flavor_name": "nv.c8r24d160",
+        "itc_image_name": "NIMBUS_IXLA-ITC_8.20_EA_KVM_210117.qcow2",
+        "itc_name_0": "get_input:greatdefect0_itc_name_0",
+        "itm_flavor_name": "nv.c2r4d50",
+        "itm_image_name": "NIMBUS_IXLA-ITM_8.20.EA_KVM.qcow2",
+        "vf_module_id": "get_input:greatdefect0_vf_module_id"
+      },
+      "type": "VF",
+      "modelCustomizationName": "greatdefect 0",
+      "vfModules": {
+        "greatdefect0..Greatdefect..module_1_ixla..module-2": {
+          "uuid": "6f09e053-56a6-4fbb-8299-e1de616825cc",
+          "invariantUuid": "e0297a51-c670-452e-b31c-c5b37c6ad40f",
+          "customizationUuid": "1106fca3-235a-4f92-8d5a-960a7336b32f",
+          "description": null,
+          "name": "Greatdefect..module_1_ixla..module-2",
+          "version": "3",
+          "modelCustomizationName": "Greatdefect..module_1_ixla..module-2",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": null
+          },
+          "inputs": {
+
+          },
+          "volumeGroupAllowed": false
+        },
+        "greatdefect0..Greatdefect..base_ixla..module-0": {
+          "uuid": "01166434-ef34-4969-aaf2-626203d72e48",
+          "invariantUuid": "80ff85fb-cb11-42cb-9737-e47095d42756",
+          "customizationUuid": "316e323d-611d-4007-a647-b1d2ecdaee9e",
+          "description": null,
+          "name": "Greatdefect..base_ixla..module-0",
+          "version": "3",
+          "modelCustomizationName": "Greatdefect..base_ixla..module-0",
+          "properties": {
+            "minCountInstances": 1,
+            "maxCountInstances": 1,
+            "initialCount": 1,
+            "vfModuleLabel": null
+          },
+          "inputs": {
+
+          },
+          "volumeGroupAllowed": false
+        },
+        "greatdefect0..Greatdefect..module_2_ixla..module-1": {
+          "uuid": "dea8e41f-c996-4557-b521-263210d96baa",
+          "invariantUuid": "23befc6e-aa97-4004-b215-4979c3f84913",
+          "customizationUuid": "b52c1fda-fbbf-4de3-ad9b-190d4a14990c",
+          "description": null,
+          "name": "Greatdefect..module_2_ixla..module-1",
+          "version": "3",
+          "modelCustomizationName": "Greatdefect..module_2_ixla..module-1",
+          "properties": null,
+          "inputs": {
+
+          },
+          "volumeGroupAllowed": false
+        }
+      },
+      "volumeGroups": {
+
+      }
+    }
+  },
+  "volumeGroups": {
+
+  },
+  "configurations": {
+
+  },
+  "serviceProxies": {
+
+  },
+  "pnfs": {
+
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/vf-with-annotation-csar.json b/onap-enabler-be/src/test/resources/vf-with-annotation-csar.json
new file mode 100644
index 0000000..2729d6c
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/vf-with-annotation-csar.json
@@ -0,0 +1,644 @@
+{
+  "service": {
+    "uuid": "f4d84bb4-a416-4b4e-997e-0059973630b9",
+    "invariantUuid": "598e3f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+    "name": "ADIOD vMX vPE_BV Service 488",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Network L1-3",
+    "serviceType": "",
+    "serviceRole": "",
+    "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+    "serviceEcompNaming": "true",
+    "instantiationType": "Macro",
+    "inputs": {
+      "2017488_adiodvpe0_ASN": {
+        "type": "string",
+        "description": "AV/PE",
+        "entry_schema": null,
+        "inputProperties": null,
+        "constraints": [
+          
+        ],
+        "required": true,
+        "default": "AV_vPE"
+      }
+    }
+  },
+  "vnfs": {
+    "2017-488_ADIOD-vPE 0": {
+      "uuid": "ea81d6f7-0861-44a7-b7d5-d173b562c350",
+      "invariantUuid": "5be7e99e-8eb2-4d97-be63-8081ff3cd10e",
+      "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+      "name": "2017-488_ADIOD-vPE",
+      "version": "9.0",
+      "customizationUuid": "41516cc6-5098-4b40-a619-f8d5f55fc4d8",
+      "inputs": {
+
+      },
+      "commands": {
+        
+      },
+      "properties": {
+        "vmxvre_retype": "RE-VMX",
+        "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+        "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+        "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+        "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+        "int_ctl_net_name": "VMX-INTXI",
+        "vmx_int_ctl_prefix": "128.0.0.0",
+        "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+        "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+        "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+        "nf_type": "ROUTER",
+        "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+        "is_AVPN_service": "false",
+        "vmx_RSG_name": "vREXI-affinity",
+        "vmx_int_ctl_forwarding": "l2",
+        "vmxvre_oam_ip_0": "10.40.123.5",
+        "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+        "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+        "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+        "vmxvre_image_name_0": "vre172_nova_img",
+        "vmxvre_instance": "0",
+        "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvre_flavor_name": "ns.c1r16d32.v5",
+        "vmxvpfe_volume_size_0": "40.0",
+        "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+        "nf_naming": "{ecomp_generated_naming=true}",
+        "multi_stage_design": "false",
+        "nf_naming_code": "me6",
+        "vmxvre_name_0": "vREXI",
+        "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+        "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+        "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+        "vmxvpfe_image_name_0": "vpfe172_nova_img",
+        "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+        "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+        "vmxvre_console": "vidconsole",
+        "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+        "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+        "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+        "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+        "vf_module_id": "123",
+        "nf_function": "ADIOD vPE",
+        "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+        "vmxvre_int_ctl_ip_0": "128.0.0.1",
+        "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+        "vnf_name": "mtnj309me6vre",
+        "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+        "vmxvre_volume_type_1": "HITACHI",
+        "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+        "vmxvre_volume_type_0": "HITACHI",
+        "vmxvpfe_volume_type_0": "HITACHI",
+        "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+        "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+        "vnf_id": "123",
+        "vmxvre_oam_prefix": "24",
+        "availability_zone_0": "get_input:2017488_adiodvpe0_availability_zone_0",
+        "ASN": "get_input:2017488_adiodvpe0_ASN",
+        "vmxvre_chassis_i2cid": "161",
+        "vmxvpfe_name_0": "vPFEXI",
+        "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+        "availability_zone_max_count": "1",
+        "vmxvre_volume_size_0": "45.0",
+        "vmxvre_volume_size_1": "50.0",
+        "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+        "vmxvre_oam_gateway": "10.40.123.1",
+        "vmxvre_volume_name_1": "vREXI_FAVolume",
+        "vmxvre_ore_present": "0",
+        "vmxvre_volume_name_0": "vREXI_FBVolume",
+        "vmxvre_type": "0",
+        "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+        "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+        "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+        "vmx_int_ctl_len": "24",
+        "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+        "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+        "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+        "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+        "nf_role": "vPE",
+        "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+        "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+        "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+      },
+      "type": "VF",
+      "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+      "vfModules": {
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+          "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+          "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+          "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+          "description": null,
+          "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+          "version": "8",
+          "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "ADIOD_vRE_BV"
+          },
+          "inputs": {
+            "2017488_adiodvpe0_bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "2017488_adiodvpe0_bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "2017488_adiodvpe0_vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "vnf_instance_name"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            },
+            "2017488_adiodvpe0_vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "vnf_config_template_version"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "2017488_adiodvpe0_AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            }
+          },
+          "volumeGroupAllowed": true
+        },
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+          "uuid": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+          "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+          "customizationUuid": "5c5f91f9-5e31-4120-b892-5536587ec258",
+          "description": null,
+          "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+          "version": "6",
+          "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+          "properties": {
+            "minCountInstances": 1,
+            "maxCountInstances": 1,
+            "initialCount": 1,
+            "vfModuleLabel": "ADIOD_base_vPE_BV"
+          },
+          "inputs": {
+            
+          },
+          "volumeGroupAllowed": false
+        },
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+          "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+          "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+          "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+          "description": null,
+          "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+          "version": "8",
+          "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "ADIOD_vPFE_BV"
+          },
+          "inputs": {
+            "2017488_adiodvpe0_availability_zone_0": {
+              "type": "string",
+              "description": "The Availability Zone to launch the instance.",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vPFE_BV",
+                "paramName": "availability_zone_0"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "mtpocfo-kvm-az01"
+            }
+          },
+          "volumeGroupAllowed": true
+        }
+      },
+      "volumeGroups": {
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+          "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+          "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+          "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+          "description": null,
+          "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+          "version": "8",
+          "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "ADIOD_vRE_BV"
+          },
+          "inputs": {
+            "2017488_adiodvpe0_bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "2017488_adiodvpe0_bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "2017488_adiodvpe0_vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "vnf_instance_name"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            },
+            "2017488_adiodvpe0_vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "vnf_config_template_version"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "2017488_adiodvpe0_AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            }
+          }
+        },
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+          "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+          "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+          "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+          "description": null,
+          "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+          "version": "8",
+          "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "ADIOD_vPFE_BV"
+          },
+          "inputs": {
+            "2017488_adiodvpe0_availability_zone_0": {
+              "type": "string",
+              "description": "The Availability Zone to launch the instance.",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vPFE_BV",
+                "paramName": "availability_zone_0"
+              },
+              "constraints": null,
+              "required": true,
+              "default": "mtpocfo-kvm-az01"
+            }
+          }
+        }
+      }
+    }
+  },
+  "networks": {
+    
+  },
+  "collectionResource": {
+    
+  },
+  "configurations": {
+    
+  },
+  "serviceProxies": {
+    
+  },
+  "vfModules": {
+    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+      "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+      "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+      "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+      "description": null,
+      "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+      "version": "8",
+      "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "ADIOD_vRE_BV"
+      },
+      "inputs": {
+        "2017488_adiodvpe0_bandwidth_units": {
+          "type": "string",
+          "description": "Units of bandwidth",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "bandwidth_units"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "Gbps"
+        },
+        "2017488_adiodvpe0_bandwidth": {
+          "type": "string",
+          "description": "Requested VPE bandwidth",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "bandwidth"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "10"
+        },
+        "2017488_adiodvpe0_vnf_instance_name": {
+          "type": "string",
+          "description": "The hostname assigned to the vpe.",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "vnf_instance_name"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "mtnj309me6"
+        },
+        "2017488_adiodvpe0_vnf_config_template_version": {
+          "type": "string",
+          "description": "VPE Software Version",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "vnf_config_template_version"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "17.2"
+        },
+        "2017488_adiodvpe0_AIC_CLLI": {
+          "type": "string",
+          "description": "AIC Site CLLI",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "AIC_CLLI"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "ATLMY8GA"
+        }
+      },
+      "volumeGroupAllowed": true
+    },
+    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+      "uuid": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+      "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+      "customizationUuid": "5c5f91f9-5e31-4120-b892-5536587ec258",
+      "description": null,
+      "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+      "version": "6",
+      "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+      "properties": {
+        "minCountInstances": 1,
+        "maxCountInstances": 1,
+        "initialCount": 1,
+        "vfModuleLabel": "ADIOD_base_vPE_BV"
+      },
+      "inputs": {
+        
+      },
+      "volumeGroupAllowed": false
+    },
+    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+      "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+      "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+      "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+      "description": null,
+      "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+      "version": "8",
+      "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "ADIOD_vPFE_BV"
+      },
+      "inputs": {
+        "2017488_adiodvpe0_availability_zone_0": {
+          "type": "string",
+          "description": "The Availability Zone to launch the instance.",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vPFE_BV",
+            "paramName": "availability_zone_0"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "mtpocfo-kvm-az01"
+        }
+      },
+      "volumeGroupAllowed": true
+    }
+  },
+  "volumeGroups": {
+    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+      "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+      "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+      "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+      "description": null,
+      "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+      "version": "8",
+      "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "ADIOD_vRE_BV"
+      },
+      "inputs": {
+        "2017488_adiodvpe0_bandwidth_units": {
+          "type": "string",
+          "description": "Units of bandwidth",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "bandwidth_units"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "Gbps"
+        },
+        "2017488_adiodvpe0_bandwidth": {
+          "type": "string",
+          "description": "Requested VPE bandwidth",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "bandwidth"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "10"
+        },
+        "2017488_adiodvpe0_vnf_instance_name": {
+          "type": "string",
+          "description": "The hostname assigned to the vpe.",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "vnf_instance_name"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "mtnj309me6"
+        },
+        "2017488_adiodvpe0_vnf_config_template_version": {
+          "type": "string",
+          "description": "VPE Software Version",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "vnf_config_template_version"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "17.2"
+        },
+        "2017488_adiodvpe0_AIC_CLLI": {
+          "type": "string",
+          "description": "AIC Site CLLI",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "AIC_CLLI"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "ATLMY8GA"
+        }
+      }
+    },
+    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+      "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+      "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+      "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+      "description": null,
+      "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+      "version": "8",
+      "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "ADIOD_vPFE_BV"
+      },
+      "inputs": {
+        "2017488_adiodvpe0_availability_zone_0": {
+          "type": "string",
+          "description": "The Availability Zone to launch the instance.",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vPFE_BV",
+            "paramName": "availability_zone_0"
+          },
+          "constraints": null,
+          "required": true,
+          "default": "mtpocfo-kvm-az01"
+        }
+      }
+    }
+  },
+  "pnfs": {
+    
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/vf-with-vfcInstanceGroups.json b/onap-enabler-be/src/test/resources/vf-with-vfcInstanceGroups.json
new file mode 100644
index 0000000..334e2a7
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/vf-with-vfcInstanceGroups.json
@@ -0,0 +1,135 @@
+{
+  "service": {
+    "uuid": "6bce7302-70bd-4057-b48e-8d5b99e686ca",
+    "invariantUuid": "9aa04749-c02c-432d-a90c-18caa361c833",
+    "name": "vDBE_srv",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Network L4+",
+    "serviceType": "",
+    "serviceRole": "",
+    "description": "vDBE_srv",
+    "serviceEcompNaming": "true",
+    "instantiationType": "A-La-Carte",
+    "inputs": {
+      
+    }
+  },
+  "vnfs": {
+    "vDBE 0": {
+      "uuid": "61535073-2e50-4141-9000-f66fea69b433",
+      "invariantUuid": "fcdf49ce-6f0b-4ca2-b676-a484e650e734",
+      "description": "vDBE",
+      "name": "vDBE",
+      "version": "0.2",
+      "customizationUuid": "882e5dcb-ba9f-4766-8cde-e326638107db",
+      "inputs": {
+        
+      },
+      "commands": {
+        
+      },
+      "properties": {
+        "nf_naming": "{ecomp_generated_naming=true}",
+        "multi_stage_design": "false",
+        "oam_vfc_instance_group_function": "oambbb",
+        "availability_zone_max_count": "1",
+        "oam_network_collection_function": "oamaaa",
+        "ecomp_generated_naming": "true",
+        "untr_vfc_instance_group_function": "untrbbb",
+        "untr_network_collection_function": "untraaa"
+      },
+      "type": "VF",
+      "modelCustomizationName": "vDBE 0",
+      "vfModules": {
+        "vdbe0..Vdbe..main..module-0": {
+          "uuid": "25a4d009-2f5a-44b4-b02a-62c584c15912",
+          "invariantUuid": "614afb1a-3e7e-44e9-90ab-424d0070c781",
+          "customizationUuid": "3443b341-7b0b-498c-a84a-a7ee736cba7e",
+          "description": null,
+          "name": "Vdbe..main..module-0",
+          "version": "1",
+          "modelCustomizationName": "Vdbe..main..module-0",
+          "properties": {
+            "minCountInstances": 1,
+            "maxCountInstances": 1,
+            "initialCount": 1,
+            "vfModuleLabel": "main"
+          },
+          "inputs": {
+            
+          },
+          "volumeGroupAllowed": false
+        }
+      },
+      "volumeGroups": {
+        
+      },
+      "vfcInstanceGroups": {
+        "untr_group": {
+          "uuid": "5fca04e2-a889-4579-8338-f60f1bf285fa",
+          "invariantUuid": "fb1e384b-117a-46ae-9ad1-bf2f1ee1e49f",
+          "name": "untr_group",
+          "version": "1",
+          "vfcInstanceGroupProperties": {
+            "vfcParentPortRole": "untr",
+            "networkCollectionFunction": "untraaa",
+            "vfcInstanceGroupFunction": null,
+            "subinterfaceRole": "untr"
+          }
+        },
+        "oam_group": {
+          "uuid": "a0efd5fc-f7be-4502-936a-a6c6392b958f",
+          "invariantUuid": "9384abf9-1231-4da4-bd8d-89e4d2f8a749",
+          "name": "oam_group",
+          "version": "1",
+          "vfcInstanceGroupProperties": {
+            "vfcParentPortRole": "untr",
+            "networkCollectionFunction": "untraaa",
+            "vfcInstanceGroupFunction": null,
+            "subinterfaceRole": "untr"
+          }
+        }
+      }
+    }
+  },
+  "networks": {
+    
+  },
+  "collectionResource": {
+    
+  },
+  "configurations": {
+    
+  },
+  "serviceProxies": {
+    
+  },
+  "vfModules": {
+    "vdbe0..Vdbe..main..module-0": {
+      "uuid": "25a4d009-2f5a-44b4-b02a-62c584c15912",
+      "invariantUuid": "614afb1a-3e7e-44e9-90ab-424d0070c781",
+      "customizationUuid": "3443b341-7b0b-498c-a84a-a7ee736cba7e",
+      "description": null,
+      "name": "Vdbe..main..module-0",
+      "version": "1",
+      "modelCustomizationName": "Vdbe..main..module-0",
+      "properties": {
+        "minCountInstances": 1,
+        "maxCountInstances": 1,
+        "initialCount": 1,
+        "vfModuleLabel": "main"
+      },
+      "inputs": {
+        
+      },
+      "volumeGroupAllowed": false
+    }
+  },
+  "volumeGroups": {
+    
+  },
+  "pnfs": {
+    
+  }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/vl-csar.JSON b/onap-enabler-be/src/test/resources/vl-csar.JSON
new file mode 100644
index 0000000..8be2d09
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/vl-csar.JSON
@@ -0,0 +1,94 @@
+{
+    "service": {
+        "uuid": "68101369-6f08-4e99-9a28-fa6327d344f3",
+        "invariantUuid": "d752a44c-ac7b-4bda-8111-fb52312d101e",
+        "name": "Macro_flow_test",
+        "version": "1.0",
+        "toscaModelURL": null,
+        "category": "Network L1-3",
+        "serviceType": null,
+        "serviceRole": null,
+        "description": "dsfg",
+        "serviceEcompNaming": "true",
+        "instantiationType": "ClientConfig",
+        "inputs": {
+            "extvl0_network_scope": {
+                "type": "string",
+                "description": "Uniquely identifies the network scope. Valid values for the network scope   includes: VF - VF-level network. Intra-VF network which connects the VFCs (VMs) inside the VF. SERVICE - Service-level network. Intra-Service network which connects  the VFs within the service GLOBAL - Global network which can be shared by multiple services\n",
+                "entry_schema": null,
+                "inputProperties": null,
+                "constraints": [
+
+                ],
+                "required": true,
+                "default": null
+            },
+            "extvl0_network_role": {
+                "type": "string",
+                "description": "Unique label that defines the role that this network performs.   example: vce oam network, vnat sr-iov1 network\n",
+                "entry_schema": null,
+                "inputProperties": null,
+                "constraints": [
+
+                ],
+                "required": true,
+                "default": null
+            },
+            "extvl0_exVL_naming_naming_policy": {
+                "type": "string",
+                "description": "Reference to naming policy that ECOMP will use when the name is auto-generated",
+                "entry_schema": null,
+                "inputProperties": null,
+                "constraints": [
+
+                ],
+                "required": true,
+                "default": null
+            }
+        }
+    },
+    "vnfs": {
+
+    },
+    "networks": {
+        "ExtVL 0": {
+            "uuid": "af584529-d7f0-420e-a6f3-c38b689c030f",
+            "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+            "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+            "name": "ExtVL",
+            "version": "4.0",
+            "customizationUuid": "664f8aa7-3989-46ac-81c0-dd72a8a63f26",
+            "inputs": {
+
+            },
+            "commands": {
+
+            },
+            "properties": {
+                "network_role": "get_input:extvl0_network_role",
+                "exVL_naming": "{naming_policy=get_input:extvl0_exVL_naming_naming_policy}",
+                "network_scope": "get_input:extvl0_network_scope"
+            },
+            "type": "VL",
+            "modelCustomizationName": "ExtVL 0"
+        }
+    },
+    "collectionResource": {
+
+    },
+    "configurations": {
+
+    },
+    "serviceProxies": {
+
+    },
+    "vfModules": {
+
+    },
+    "volumeGroups": {
+
+    },
+    "pnfs": {
+
+    }
+}
\ No newline at end of file
diff --git a/onap-enabler-be/src/test/resources/vnfConfigUpdatePayload.json b/onap-enabler-be/src/test/resources/vnfConfigUpdatePayload.json
new file mode 100644
index 0000000..94161d9
--- /dev/null
+++ b/onap-enabler-be/src/test/resources/vnfConfigUpdatePayload.json
@@ -0,0 +1,40 @@
+{
+    "payload":{
+        "request-parameters":{
+            "vm":[
+                {
+                    "vnfc":[
+                        {
+                            "ipaddress-v4-oam-vip":"135.21.166.39",
+                            "vnfc-name":"ibcx0001vm001dbg001",
+                            "vnfc-function-code":"dbg",
+                            "vnfc-type":"DBE-VM #1",
+                            "group-notation":"ibcx0001vm001dbg001pair"
+                        }
+                    ],
+                    "vm-name":"ibcx0001vm001"
+                },
+                {
+                    "vnfc":[
+                        {
+                            "vnfc-name":"ibcx0001vm002dbg001",
+                            "vnfc-function-code":"dbg",
+                            "vnfc-type":"DBE-VM #1",
+                            "group-notation":"ibcx0001vm001dbg001pair"
+                        }
+                    ],
+                    "vm-name":"ibcx0001vm002"
+                }
+            ],
+            "vnf-name":"ibcx0099v",
+            "template-name":"vdbe_template1"
+        },
+        "configuration":{
+            "configuration-json":"{\n   \"version\": \"15.1X49-D50.3\",\n   \"groups\": {\n      \"name\": \"node0\",\n      \"system\": {\n         \"host-name\": \"$node0_hostname\",\n         \"backup-router\": {\n            \"address\": \"$node0_backup_router_address\",\n            \"destination\": \"0.0.0.0/0\"\n         }\n      }\n   }\n}",
+            "configuration-string": "   <configuration xmlns=\"http://xml.juniper.net/xnm/1.1/xnm\" \n    xmlns:a=\"http://xml.juniper.net/junos/15.1X49/junos\" >\n            <version>15.1X49-D50.3<\/version>\n            <groups>\n                <name>node0<\/name>\n                <system>\n                    <host-name>$node0_hostname<\/host-name>\n                    <backup-router>\n                        <address>$node0_backup_router_address<\/address>\n                        <destination>0.0.0.0/0<\/destination>\n             <\/backup-router>\n                <\/system>\n     <\/groups>\n    <\/configuration>"
+        },
+        "configuration-parameters":{
+            "nat_source_sp_v6rogerssnat_address1":"2001:1890:fc45:f025:135:25:246:c806/128"
+        }
+    }
+}
\ No newline at end of file
