diff --git a/ms/controllerblueprints/application/etc/logback.xml b/ms/controllerblueprints/application/etc/logback.xml
index 0a75e60..6639705 100644
--- a/ms/controllerblueprints/application/etc/logback.xml
+++ b/ms/controllerblueprints/application/etc/logback.xml
@@ -33,6 +33,7 @@
 
     <logger name="org.springframework" level="info"/>
     <logger name="org.springframework.web" level="info"/>
+    <logger name="org.springframework.security.web.authentication" level="warn"/>
     <logger name="org.hibernate" level="error"/>
     <logger name="org.onap.ccsdk.apps" level="info"/>
 
diff --git a/ms/controllerblueprints/application/opt/app/onap/config/application.properties b/ms/controllerblueprints/application/opt/app/onap/config/application.properties
index d281482..e4457d0 100644
--- a/ms/controllerblueprints/application/opt/app/onap/config/application.properties
+++ b/ms/controllerblueprints/application/opt/app/onap/config/application.properties
@@ -18,6 +18,10 @@
 ms_name=org.onap.ccsdk.apps.controllerblueprints
 appVersion=1.0.0
 
+# Basic Authentication
+basic-auth.user-name=ccsdkapps
+basic-auth.hashed-pwd=$2a$10$MJxhNiOAffxbyrV9.rrOUewP9Q/ASg5Nit2cmP.yBaXGsVXo8BW3y
+
 #logging.pattern.console=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr($ threadId: {PID:- }){magenta} %clr(---){faint} %clr([ hostname: %X{hostname} serviceName: %X{serviceName} version: %X{version} transactionId: %X{transactionId} requestTimeStamp: %X{requestTimestamp}  responseTimeStamp: %X{responseTimestamp} duration: %X{duration}]){yellow} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wex
 
 logging.level.org.springframework.web=INFO
diff --git a/ms/controllerblueprints/application/pom.xml b/ms/controllerblueprints/application/pom.xml
index 24f4deb..9834924 100644
--- a/ms/controllerblueprints/application/pom.xml
+++ b/ms/controllerblueprints/application/pom.xml
@@ -55,6 +55,10 @@
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
         <dependency>
@@ -68,6 +72,11 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.jetbrains.kotlin</groupId>
             <artifactId>kotlin-test</artifactId>
             <scope>test</scope>
diff --git a/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/ApplicationExceptionHandler.java b/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/ApplicationExceptionHandler.java
index 6e9dcd7..78706d5 100644
--- a/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/ApplicationExceptionHandler.java
+++ b/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/ApplicationExceptionHandler.java
@@ -23,13 +23,19 @@
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.web.csrf.InvalidCsrfTokenException;
 import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.context.request.WebRequest;
 
+import javax.naming.AuthenticationException;
+import java.nio.file.AccessDeniedException;
+
 @ControllerAdvice
 @RestController
 @SuppressWarnings("unused")
@@ -43,6 +49,14 @@
         return new ResponseEntity<>(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
     }
 
+    @ExceptionHandler({InvalidCsrfTokenException.class, AuthenticationException.class, BadCredentialsException.class, AccessDeniedException.class})
+    @ResponseStatus(value = HttpStatus.UNAUTHORIZED)
+    public final ResponseEntity<ErrorMessage> handleAuthenticationRequest(Exception ex, WebRequest request) {
+        log.error("Authentication Exception", ex);
+        ErrorMessage exceptionResponse = new ErrorMessage(ex.getMessage(), HttpStatus.UNAUTHORIZED.value(), ex.getLocalizedMessage());
+        return new ResponseEntity<>(exceptionResponse, HttpStatus.UNAUTHORIZED);
+    }
+
     @ExceptionHandler({HttpMessageNotReadableException.class, MethodArgumentNotValidException.class,
             HttpRequestMethodNotSupportedException.class})
     public final ResponseEntity<ErrorMessage> handleBadRequest(Exception ex, WebRequest request) {
diff --git a/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/filters/ApplicationLoggingFilter.java b/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/filters/ApplicationLoggingFilter.java
index fbef55f..4476117 100644
--- a/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/filters/ApplicationLoggingFilter.java
+++ b/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/filters/ApplicationLoggingFilter.java
@@ -25,6 +25,8 @@
 import org.slf4j.LoggerFactory;
 import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 
 import javax.servlet.*;
@@ -40,6 +42,7 @@
  */
 @Component
 @WebFilter(asyncSupported = true, urlPatterns = {"/*"})
+@Order(Ordered.HIGHEST_PRECEDENCE)
 @SuppressWarnings("unused")
 public class ApplicationLoggingFilter implements Filter {
     private static Logger log = LoggerFactory.getLogger(ApplicationLoggingFilter.class);
diff --git a/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/security/ApplicationBasicAuthenticationEntryPoint.java b/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/security/ApplicationBasicAuthenticationEntryPoint.java
new file mode 100644
index 0000000..e3df3a6
--- /dev/null
+++ b/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/security/ApplicationBasicAuthenticationEntryPoint.java
@@ -0,0 +1,43 @@
+/*
+ *  Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ *  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.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.security;
+
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class ApplicationBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
+
+    @Override
+    public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException)
+            throws IOException {
+        response.addHeader("WWW-Authenticate", "Basic realm=\"" + getRealmName() + "\"");
+        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        setRealmName("CCSDK-APPS");
+        super.afterPropertiesSet();
+    }
+
+}
\ No newline at end of file
diff --git a/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/security/ApplicationSecurityConfigurerAdapter.java b/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/security/ApplicationSecurityConfigurerAdapter.java
new file mode 100644
index 0000000..3a39d78
--- /dev/null
+++ b/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/apps/controllerblueprints/security/ApplicationSecurityConfigurerAdapter.java
@@ -0,0 +1,72 @@
+/*
+ *  Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ *  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.
+ */
+
+package org.onap.ccsdk.apps.controllerblueprints.security;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+@SuppressWarnings("unused")
+@Configuration
+@EnableWebSecurity
+public class ApplicationSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
+
+    @Value("${basic-auth.user-name}")
+    private String userName;
+
+    @Value("${basic-auth.hashed-pwd}")
+    private String userHashedPassword;
+
+    private static EELFLogger log = EELFManager.getInstance().getLogger(ApplicationSecurityConfigurerAdapter.class);
+
+    @Autowired
+    private ApplicationBasicAuthenticationEntryPoint authenticationEntryPoint;
+
+    @Autowired
+    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
+        log.info("User Id {} and hashed pwd : {}", userName, userHashedPassword);
+        auth.inMemoryAuthentication()
+                .withUser(userName).password(userHashedPassword)
+                .authorities("ROLE_USER");
+    }
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        http.authorizeRequests()
+                .antMatchers("/actuator/health").permitAll()
+                .antMatchers("/**").authenticated()
+                .and()
+                .httpBasic()
+                .authenticationEntryPoint(authenticationEntryPoint);
+
+        http.csrf().disable();
+    }
+
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
+}
\ No newline at end of file
diff --git a/ms/controllerblueprints/application/src/test/java/org/onap/ccsdk/apps/controllerblueprints/ControllerBluprintsApplicationTest.java b/ms/controllerblueprints/application/src/test/java/org/onap/ccsdk/apps/controllerblueprints/ControllerBluprintsApplicationTest.java
index 61b5c50..7a5f952 100644
--- a/ms/controllerblueprints/application/src/test/java/org/onap/ccsdk/apps/controllerblueprints/ControllerBluprintsApplicationTest.java
+++ b/ms/controllerblueprints/application/src/test/java/org/onap/ccsdk/apps/controllerblueprints/ControllerBluprintsApplicationTest.java
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
+ *
  * 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
@@ -16,8 +16,6 @@
 
 package org.onap.ccsdk.apps.controllerblueprints;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -27,56 +25,40 @@
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
 import org.springframework.boot.test.web.client.TestRestTemplate;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
+import org.springframework.http.*;
+import org.springframework.http.client.support.BasicAuthorizationInterceptor;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
+import static org.assertj.core.api.Assertions.assertThat;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
 public class ControllerBluprintsApplicationTest {
-    private static EELFLogger log = EELFManager.getInstance().getLogger(ControllerBluprintsApplicationTest.class);
-
     @Autowired
     private TestRestTemplate restTemplate;
-    private HttpHeaders headers;
-    private ResponseEntity<ConfigModel> entity;
 
     @Before
     public void setUp(){
-        headers = new HttpHeaders();
-        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
-        entity = this.restTemplate
-                .exchange("/api/v1/config-model/1", HttpMethod.GET, new HttpEntity<>(headers),ConfigModel.class);
-        
+        BasicAuthorizationInterceptor bai = new BasicAuthorizationInterceptor("ccsdkapps", "ccsdkapps");
+        this.restTemplate.getRestTemplate().getInterceptors().add(bai);
     }
 
     @Test
     public void testConfigModel() {
-
         HttpHeaders headers = new HttpHeaders();
         headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
         ResponseEntity<ConfigModel> entity = this.restTemplate
                 .exchange("/api/v1/config-model/1", HttpMethod.GET, new HttpEntity<>(headers),ConfigModel.class);
-
         assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
         Assert.assertNotNull("failed to get response Config model",entity.getBody());
     }
 
     @Test
     public void testConfigModelFailure() {
-
         HttpHeaders headers = new HttpHeaders();
         headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
         ResponseEntity<ConfigModel> entity = this.restTemplate
                 .exchange("/api/v1/config-model-not-found/1", HttpMethod.GET, new HttpEntity<>(headers),ConfigModel.class);
-
         assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
         Assert.assertNotNull("failed to get response Config model",entity.getBody());
     }
diff --git a/ms/controllerblueprints/application/src/test/java/org/onap/ccsdk/apps/controllerblueprints/VersionSplitTest.java b/ms/controllerblueprints/application/src/test/java/org/onap/ccsdk/apps/controllerblueprints/VersionSplitTest.java
index 9445e1d..995644f 100644
--- a/ms/controllerblueprints/application/src/test/java/org/onap/ccsdk/apps/controllerblueprints/VersionSplitTest.java
+++ b/ms/controllerblueprints/application/src/test/java/org/onap/ccsdk/apps/controllerblueprints/VersionSplitTest.java
@@ -16,21 +16,34 @@
 
 package org.onap.ccsdk.apps.controllerblueprints;
 
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
 import org.apache.commons.lang3.StringUtils;
 import org.junit.Assert;
 import org.junit.Test;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
 /**
  * VersionSplitTest
  *
  * @author Brinda Santh
  */
 public class VersionSplitTest {
+    private static EELFLogger log = EELFManager.getInstance().getLogger(VersionSplitTest.class);
 
     @Test
     public void testVersionSplit() {
         String version = "1.03.04";
         String[] tokens = StringUtils.split(version, '.');
         Assert.assertNotNull("failed to tokenize", tokens);
-        Assert.assertEquals("failed to three token ", 3, tokens.length );
+        Assert.assertEquals("failed to three token ", 3, tokens.length);
+    }
+
+    @Test
+    public void encodeTest() {
+        String name = "ccsdkapps";
+        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
+        String encodedValue = bCryptPasswordEncoder.encode(name);
+        Assert.assertTrue("Failed to match", bCryptPasswordEncoder.matches(name, encodedValue));
     }
 }
\ No newline at end of file
diff --git a/ms/controllerblueprints/application/src/test/resources/application.properties b/ms/controllerblueprints/application/src/test/resources/application.properties
index 5c6acf9..e812da5 100644
--- a/ms/controllerblueprints/application/src/test/resources/application.properties
+++ b/ms/controllerblueprints/application/src/test/resources/application.properties
@@ -20,6 +20,10 @@
 ms_name=org.onap.ccsdk.apps.controllerblueprints
 appVersion=1.0.0
 
+# Basic Authentication
+basic-auth.user-name=ccsdkapps
+basic-auth.hashed-pwd=$2a$10$MJxhNiOAffxbyrV9.rrOUewP9Q/ASg5Nit2cmP.yBaXGsVXo8BW3y
+
 #To Remove Null in JSON API Response
 spring.jackson.default-property-inclusion=non_null
 
diff --git a/ms/neng/pom.xml b/ms/neng/pom.xml
index 3f90e0a..8f6c7b1 100644
--- a/ms/neng/pom.xml
+++ b/ms/neng/pom.xml
@@ -55,10 +55,12 @@
         <project.version>0.3.0</project.version>
         <ccsdk.distribution.version>0.2.4</ccsdk.distribution.version>
         <docker.buildArg.https_proxy>${https_proxy}</docker.buildArg.https_proxy>
-		<docker.push.phase>deploy</docker.push.phase>
-                <docker.build.phase>deploy</docker.build.phase>
-		<docker.verbose>true</docker.verbose>
-		<ccsdk.project.version>${project.version}</ccsdk.project.version>
+        <docker.push.phase>deploy</docker.push.phase>
+        <docker.build.phase>deploy</docker.build.phase>
+        <docker.verbose>true</docker.verbose>
+        <ccsdk.project.version>${project.version}</ccsdk.project.version>
+        <image.name>onap/ccsdk-apps-ms-neng</image.name>
+
     </properties>
 
     <profiles>
@@ -114,72 +116,111 @@
             </build>
         </profile>
 
-	<profile>
-		<id>dockerTBD</id>
-		<build>
-			<plugins>
-				<plugin>
-					<groupId>com.spotify</groupId>
-					<artifactId>docker-maven-plugin</artifactId>
-					<version>0.4.11</version>
-					<executions>
-						<execution>
-							<id>push-images</id>
-							<phase>${docker.build.phase}</phase>
-							<goals>
-								<goal>build</goal>
-								<goal>push</goal>
-							</goals>
-						</execution>
-					</executions>
-					<configuration>
-						<imageName>${docker.registry}/onap/ccsdk-apps-ms-neng:${project.version}</imageName>
-						<dockerDirectory>${basedir}/target/docker</dockerDirectory>
-						<serverId>docker-hub</serverId>
-						<registryUrl>https://${docker.registry}</registryUrl>
-						<imageTags>
-							<imageTag>${project.version}</imageTag>
-							<imageTag>${project.version}-STAGING-${maven.build.timestamp}</imageTag>
-							<imageTag>${project.docker.latesttag.version}</imageTag>
-						</imageTags>
-						<forceTags>true</forceTags>
-						<resources>
-							<resource>
-								<targetPath>/</targetPath>
-								<directory>${project.build.directory}</directory>
-								<include>${project.build.finalName}.jar</include>
-							</resource>
-							<resource>
-								<targetPath>/</targetPath>
-								<directory>${project.build.directory}</directory>
-								<include>opt/etc/config/*</include>
-							</resource>
-							<resource>
-								<targetPath>/</targetPath>
-								<directory>${project.build.directory}</directory>
-								<include>opt/etc/keystore/*</include>
-							</resource>
-							<resource>
-								<targetPath>/</targetPath>
-								<directory>${project.build.directory}</directory>
-								<include>opt/etc/truststore/*</include>
-							</resource>
-							<resource>
-								<targetPath>/</targetPath>
-								<directory>${project.build.directory}</directory>
-								<include>opt/aai/keystore/*</include>
-							</resource>
-							<resource>
-								<targetPath>/</targetPath>
-								<directory>${project.build.directory}</directory>
-								<include>etc/*</include>
-							</resource>
-						</resources>
-					</configuration>
-				</plugin>
-			</plugins>
-		</build>
-	</profile>
+        <profile>
+            <id>docker</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-resources-plugin</artifactId>
+                        <version>2.6</version>
+                        <executions>
+                            <execution>
+                                <id>copy-dockerfile</id>
+                                <goals>
+                                    <goal>copy-resources</goal>
+                                </goals>
+                                <phase>${docker.build.phase}</phase>
+                                <configuration>
+                                    <outputDirectory>${basedir}/target/docker-stage</outputDirectory>
+                                    <resources>
+                                        <resource>
+                                            <directory>src/main/docker</directory>
+                                            <includes>
+                                                <include>startService.sh</include>
+                                                <include>Dockerfile</include>
+                                            </includes>
+                                            <filtering>true</filtering>
+                                        </resource>
+                                    </resources>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>copy-app-jar</id>
+                                <goals>
+                                    <goal>copy-resources</goal>
+                                </goals>
+                                <phase>${docker.build.phase}</phase>
+                                <configuration>
+                                    <outputDirectory>${basedir}/target/docker-stage</outputDirectory>
+                                    <resources>
+                                        <resource>
+                                            <directory>${basedir}/target/</directory>
+                                            <includes>
+                                                <include>NetworkElementNameGen.jar</include>
+                                            </includes>
+                                            <filtering>false</filtering>
+                                        </resource>
+                                    </resources>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>copy-config</id>
+                                <goals>
+                                    <goal>copy-resources</goal>
+                                </goals>
+                                <phase>${docker.build.phase}</phase>
+                                <configuration>
+                                    <outputDirectory>${basedir}/target/docker-stage/opt/etc/config</outputDirectory>
+                                    <resources>
+                                        <resource>
+                                            <directory>${basedir}/opt/etc/config</directory>
+                                            <includes>
+                                                <include>*</include>
+                                            </includes>
+                                            <filtering>true</filtering>
+                                        </resource>
+                                    </resources>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+    
+    
+                    <plugin>
+                        <groupId>io.fabric8</groupId>
+                        <artifactId>docker-maven-plugin</artifactId>
+                        <version>0.26.1</version>
+                        <inherited>false</inherited>
+                        <configuration>
+                            <images>
+                                <image>
+                                    <name>${image.name}</name>
+                                    <build>
+                                        <cleanup>try</cleanup>
+                                        <dockerFileDir>${basedir}/target/docker-stage</dockerFileDir>
+                                        <tags>
+                                            <tag>${project.version}</tag>
+                                            <tag>${project.docker.latesttag.version}</tag>
+                                        </tags>
+                                    </build>
+                                </image>
+                            </images>
+                            <verbose>true</verbose>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <id>push-images</id>
+                                <phase>${docker.build.phase}</phase>
+                                <goals>
+                                    <goal>build</goal>
+                                    <goal>push</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
 
     </profiles>
 
@@ -271,11 +312,11 @@
             <groupId>org.liquibase</groupId>
             <artifactId>liquibase-core</artifactId>
         </dependency>
-		<dependency>
-			<groupId>org.mariadb.jdbc</groupId>
-			<artifactId>mariadb-java-client</artifactId>
-			<version>${mariadb.connector.version}</version>
-		</dependency>
+        <dependency>
+            <groupId>org.mariadb.jdbc</groupId>
+            <artifactId>mariadb-java-client</artifactId>
+            <version>${mariadb.connector.version}</version>
+        </dependency>
         <dependency>
             <groupId>com.h2database</groupId>
             <artifactId>h2</artifactId>
@@ -331,6 +372,7 @@
     <build>
         <finalName>NetworkElementNameGen</finalName>
         <plugins>
+
             <plugin>
                 <groupId>org.codehaus.groovy.maven</groupId>
                 <artifactId>gmaven-plugin</artifactId>
@@ -474,68 +516,6 @@
                 <artifactId>exec-maven-plugin</artifactId>
                 <groupId>org.codehaus.mojo</groupId>
             </plugin>
-            <!--
-            <plugin>
-                <groupId>io.fabric8</groupId>
-                <artifactId>docker-maven-plugin</artifactId>
-                <inherited>false</inherited>
-                <configuration>
-                    <verbose>false</verbose>
-                    <images>
-                        <image>
-                            <name>onap/ccsdk-apps-ms-neng</name>
-                            <build>
-                                <cleanup>try</cleanup>
-                                <dockerFileDir>${basedir}/src/main/docker</dockerFileDir>
-                                <dockerFile>Dockerfile</dockerFile>
-                                <tags>
-                                    <tag>${project.version}</tag>
-                                </tags>
-
-                               <assembly>
-                                    <targetDir>/</targetDir>
-                                    <inline>
-                                        <files>
-                                            <file>
-                                                <source>${project.build.directory}/${build.finalName}.${project.packaging}</source>
-                                            </file>
-                                        </files>
-                                        <fileSet>
-                                            <directory>${basedir}/opt/etc</directory>
-                                            <outputDirectory>opt/etc</outputDirectory>
-                                            <includes>
-                                                <include>**</include>
-                                            </includes>
-                                        </fileSet>
-                                    </inline>
-                                </assembly>
-
-
-                            </build>
-                        </image>
-                    </images>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>generate-images</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>build</goal>
-                        </goals>
-                    </execution>
-
-                    <execution>
-                        <id>push-images</id>
-                        <phase>deploy</phase>
-                        <goals>
-                            <goal>build</goal>
-                            <goal>push</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            -->
-
  
             <plugin>
                 <groupId>org.springframework.boot</groupId>
@@ -550,16 +530,9 @@
                 </executions>
             </plugin>
         </plugins>
+
         <resources>
             <resource>
-                <directory>src/main/docker</directory>
-                <targetPath>../docker</targetPath>
-                <filtering>true</filtering>
-                <includes>
-                    <include>**/*</include>
-                </includes>
-            </resource>
-            <resource>
                 <directory>src/main/resources</directory>
                 <filtering>true</filtering>
                 <includes>
diff --git a/ms/neng/src/test/java/org/onap/ccsdk/apps/ms/neng/persistence/entity/IdentifierMapTest.java b/ms/neng/src/test/java/org/onap/ccsdk/apps/ms/neng/persistence/entity/IdentifierMapTest.java
new file mode 100644
index 0000000..dc51042
--- /dev/null
+++ b/ms/neng/src/test/java/org/onap/ccsdk/apps/ms/neng/persistence/entity/IdentifierMapTest.java
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : CCSDK.apps
+ * ================================================================================
+ * Copyright (C) 2018 IBM.
+ * ================================================================================
+ * 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.ccsdk.apps.ms.neng.persistence.entity;
+
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class IdentifierMapTest {
+	private IdentifierMap identifierMap;
+
+    @Before
+    public void setUp() {
+    	identifierMap = new IdentifierMap();
+    }
+
+    @Test
+    public void testGetSetIdentifierMapId() {
+    	identifierMap.setIdentifierMapId(1);
+        Integer expected = 1;
+        Assert.assertEquals(expected, identifierMap.getIdentifierMapId());
+    }
+    
+    @Test
+    public void testGetSetPolicyFnName() {
+    	identifierMap.setPolicyFnName("PolicyFnName");
+        String expected = "PolicyFnName";
+        Assert.assertEquals(expected, identifierMap.getPolicyFnName());
+    }
+    
+    @Test
+    public void testGetSetJsFnName() {
+    	identifierMap.setJsFnName("JsFnName");
+        String expected = "JsFnName";
+        Assert.assertEquals(expected, identifierMap.getJsFnName());
+    }
+    
+    @Test
+    public void testGetSetCreatedTime() throws ParseException {
+    	DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
+        Date date = dateFormat.parse("23/09/2007");
+        long time = date.getTime();
+        Timestamp timeStamp = new Timestamp(time);
+    	identifierMap.setCreatedTime(timeStamp);
+    	Timestamp expected = timeStamp;
+        Assert.assertEquals(expected, identifierMap.getCreatedTime());
+    }
+    
+    @Test
+    public void testGetSetCreatedBy() {
+    	identifierMap.setCreatedBy("Name");
+        String expected = "Name";
+        Assert.assertEquals(expected, identifierMap.getCreatedBy());
+    }
+    
+    @Test
+    public void testGetSetLastUpdatedTime() throws ParseException {
+    	DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
+        Date date = dateFormat.parse("23/09/2007");
+        long time = date.getTime();
+        Timestamp timeStamp = new Timestamp(time);
+    	identifierMap.setLastUpdatedTime(timeStamp);
+    	Timestamp expected = timeStamp;
+        Assert.assertEquals(expected, identifierMap.getLastUpdatedTime());
+    }
+    
+    @Test
+    public void testGetSetLastUpdatedBy() {
+    	identifierMap.setLastUpdatedBy("Name");
+        String expected = "Name";
+        Assert.assertEquals(expected, identifierMap.getLastUpdatedBy());
+    }
+    
+}
diff --git a/ms/neng/src/test/java/org/onap/ccsdk/apps/ms/neng/persistence/entity/PolicyDetailsTest.java b/ms/neng/src/test/java/org/onap/ccsdk/apps/ms/neng/persistence/entity/PolicyDetailsTest.java
new file mode 100644
index 0000000..7050868
--- /dev/null
+++ b/ms/neng/src/test/java/org/onap/ccsdk/apps/ms/neng/persistence/entity/PolicyDetailsTest.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : CCSDK.apps
+ * ================================================================================
+ * Copyright (C) 2018 IBM.
+ * ================================================================================
+ * 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.ccsdk.apps.ms.neng.persistence.entity;
+
+
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PolicyDetailsTest {
+	private PolicyDetails policyDetails;
+
+    @Before
+    public void setUp() {
+    	policyDetails = new PolicyDetails();
+    }
+
+    @Test
+    public void testGetSetPolicyId() {
+    	policyDetails.setPolicyId(1);
+        Integer expected = 1;
+        Assert.assertEquals(expected, policyDetails.getPolicyId());
+    }
+    
+    @Test
+    public void testGetSetPolicyName() {
+    	policyDetails.setPolicyName("PolicyName");
+        String expected = "PolicyName";
+        Assert.assertEquals(expected, policyDetails.getPolicyName());
+    }
+    
+    @Test
+    public void testGetSetPolicyResponse() {
+    	policyDetails.setPolicyResponse("PolicyResponse");
+        String expected = "PolicyResponse";
+        Assert.assertEquals(expected, policyDetails.getPolicyResponse());
+    }
+    
+    @Test
+    public void testGetSetCreatedTime() throws ParseException {
+    	DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
+        Date date = dateFormat.parse("23/09/2007");
+        long time = date.getTime();
+        Timestamp timeStamp = new Timestamp(time);
+    	policyDetails.setCreatedTime(timeStamp);
+        String expected = "PolicyResponse";
+        Assert.assertEquals(timeStamp, policyDetails.getCreatedTime());
+    }
+    
+    
+}
diff --git a/ms/neng/src/test/java/org/onap/ccsdk/apps/ms/neng/persistence/entity/ServiceParameterTest.java b/ms/neng/src/test/java/org/onap/ccsdk/apps/ms/neng/persistence/entity/ServiceParameterTest.java
new file mode 100644
index 0000000..42118a5
--- /dev/null
+++ b/ms/neng/src/test/java/org/onap/ccsdk/apps/ms/neng/persistence/entity/ServiceParameterTest.java
@@ -0,0 +1,95 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : CCSDK.apps
+ * ================================================================================
+ * Copyright (C) 2018 IBM.
+ * ================================================================================
+ * 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.ccsdk.apps.ms.neng.persistence.entity;
+
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ServiceParameterTest {
+	private ServiceParameter serviceParameter;
+
+    @Before
+    public void setUp() {
+    	serviceParameter = new ServiceParameter();
+    }
+
+    @Test
+    public void testGetSetServiceParameterId() {
+    	serviceParameter.setServiceParameterId(1);
+        Integer expected = 1;
+        Assert.assertEquals(expected, serviceParameter.getServiceParameterId());
+    }
+    
+    @Test
+    public void testGetSetName() {
+    	serviceParameter.setName("Name");
+        String expected = "Name";
+        Assert.assertEquals(expected, serviceParameter.getName());
+    }
+    
+    @Test
+    public void testGetSetValue() {
+    	serviceParameter.setValue("Value");
+        String expected = "Value";
+        Assert.assertEquals(expected, serviceParameter.getValue());
+    }
+    
+    @Test
+    public void testGetSetCreatedTime() throws ParseException {
+    	  DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
+          Date date = dateFormat.parse("23/09/2007");
+          long time = date.getTime();
+          Timestamp timeStamp = new Timestamp(time);
+    	serviceParameter.setCreatedTime(timeStamp);
+        Assert.assertEquals(timeStamp, serviceParameter.getCreatedTime());
+    }
+    
+    @Test
+    public void testGetSetCreatedBy() {
+    	serviceParameter.setCreatedBy("CreatedBy");
+        String expected = "CreatedBy";
+        Assert.assertEquals(expected, serviceParameter.getCreatedBy());
+    }
+    
+    @Test
+    public void testGetSetLastUpdatedBy() {
+    	serviceParameter.setLastUpdatedBy("LastUpdatedBy");
+        String expected = "LastUpdatedBy";
+        Assert.assertEquals(expected, serviceParameter.getLastUpdatedBy());
+    }
+    
+    @Test
+    public void testGetSetLastUpdatedTime() throws ParseException {
+    	  DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
+          Date date = dateFormat.parse("23/09/2007");
+          long time = date.getTime();
+          Timestamp timeStamp = new Timestamp(time);
+    	serviceParameter.setLastUpdatedTime(timeStamp);
+        Assert.assertEquals(timeStamp, serviceParameter.getLastUpdatedTime());
+    }
+}
diff --git a/ms/vlantag-api/src/test/java/org/onap/ccsdk/apps/ms/vlangtagapi/core/model/UnassignVlanTagResponseOutputTest.java b/ms/vlantag-api/src/test/java/org/onap/ccsdk/apps/ms/vlangtagapi/core/model/UnassignVlanTagResponseOutputTest.java
new file mode 100644
index 0000000..cec0da9
--- /dev/null
+++ b/ms/vlantag-api/src/test/java/org/onap/ccsdk/apps/ms/vlangtagapi/core/model/UnassignVlanTagResponseOutputTest.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright © 2018 IBM.
+ * 
+ * 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.
+ ******************************************************************************/
+
+package org.onap.ccsdk.apps.ms.vlangtagapi.core.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.ccsdk.apps.ms.vlantagapi.core.model.UnassignVlanTagResponseOutput;
+
+
+public class UnassignVlanTagResponseOutputTest {
+    private UnassignVlanTagResponseOutput unassignVlanTagResponseOutput;
+    private UnassignVlanTagResponseOutput unassignVlanTagResponseOutput1;
+    
+    @Before
+    public void setUp()
+    {
+        unassignVlanTagResponseOutput= new UnassignVlanTagResponseOutput();
+        unassignVlanTagResponseOutput1= new UnassignVlanTagResponseOutput();
+    }
+    
+    @Test
+    public void testVlanType()
+    {
+        unassignVlanTagResponseOutput.vlanType("vlanType");
+        assertEquals("vlanType", unassignVlanTagResponseOutput.getVlanType());
+    }
+    
+    @Test
+    public void testKey()
+    {
+        unassignVlanTagResponseOutput.key("key");
+        assertEquals("key", unassignVlanTagResponseOutput.getVlanTagKey());
+    }
+    
+    @Test
+    public void testVlantagName()
+    {
+        unassignVlanTagResponseOutput.vlantagName("vlantagName");
+        assertEquals("vlantagName", unassignVlanTagResponseOutput.getVlantagName());
+    }
+    
+    @Test
+    public void testEqualsAndHashCode()
+    {
+        assertTrue(unassignVlanTagResponseOutput.equals(unassignVlanTagResponseOutput1));
+        assertTrue((Integer)unassignVlanTagResponseOutput.hashCode() instanceof Integer);
+    }
+}
diff --git a/ms/vlantag-api/src/test/java/org/onap/ccsdk/apps/ms/vlangtagapi/core/model/UnassignVlanTagResponseTest.java b/ms/vlantag-api/src/test/java/org/onap/ccsdk/apps/ms/vlangtagapi/core/model/UnassignVlanTagResponseTest.java
new file mode 100644
index 0000000..4712d14
--- /dev/null
+++ b/ms/vlantag-api/src/test/java/org/onap/ccsdk/apps/ms/vlangtagapi/core/model/UnassignVlanTagResponseTest.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright © 2018 IBM.
+ * 
+ * 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.
+ ******************************************************************************/
+
+package org.onap.ccsdk.apps.ms.vlangtagapi.core.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.ccsdk.apps.ms.vlantagapi.core.model.UnassignVlanTagResponse;
+import org.onap.ccsdk.apps.ms.vlantagapi.core.model.UnassignVlanTagResponseOutput;
+
+public class UnassignVlanTagResponseTest {
+
+    private UnassignVlanTagResponse unassignVlanTagResponse;
+    private UnassignVlanTagResponse unassignVlanTagResponse1;
+    
+    @Before
+    public void setUp()
+    {
+        unassignVlanTagResponse= new UnassignVlanTagResponse();
+        unassignVlanTagResponse1= new UnassignVlanTagResponse();
+    }
+    
+    @Test
+    public void testOutput()
+    {
+        List<UnassignVlanTagResponseOutput> output= new ArrayList<>();
+        unassignVlanTagResponse.output(output);
+        assertEquals(output, unassignVlanTagResponse.getOutput());
+    }
+    
+    @Test
+    public void testErrorCode()
+    {
+        unassignVlanTagResponse.errorCode(200);
+        Integer errorCode=200;
+        assertEquals(errorCode, unassignVlanTagResponse.getErrorCode());
+    }
+    
+    @Test
+    public void testErrorMessage()
+    {
+        unassignVlanTagResponse.errorMessage("testErrorMessage");
+        assertEquals("testErrorMessage", unassignVlanTagResponse.getErrorMessage());
+    }
+    
+    @Test
+    public void testEqualsAndHashCode()
+    {
+        assertTrue(unassignVlanTagResponse.equals(unassignVlanTagResponse1));
+        assertTrue((Integer)unassignVlanTagResponse.hashCode() instanceof Integer);
+    }
+}
diff --git a/ms/vlantag-api/src/test/java/org/onap/ccsdk/apps/ms/vlangtagapi/core/model/VlanTagTest.java b/ms/vlantag-api/src/test/java/org/onap/ccsdk/apps/ms/vlangtagapi/core/model/VlanTagTest.java
new file mode 100644
index 0000000..dafc89a
--- /dev/null
+++ b/ms/vlantag-api/src/test/java/org/onap/ccsdk/apps/ms/vlangtagapi/core/model/VlanTagTest.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright © 2018 IBM.
+ * 
+ * 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.
+ ******************************************************************************/
+
+package org.onap.ccsdk.apps.ms.vlangtagapi.core.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.ccsdk.apps.ms.vlantagapi.core.model.VlanTag;
+
+public class VlanTagTest {
+    private VlanTag vlanTag;
+    private VlanTag vlanTag1;
+
+    @Before
+    public void setUp() {
+        vlanTag = new VlanTag();
+        vlanTag1 = new VlanTag();
+    }
+
+    @Test
+    public void testVlanUuid() {
+        vlanTag.vlanUuid("vlanUuid");
+        assertEquals("vlanUuid", vlanTag.getVlanUuid());
+    }
+    
+    @Test
+    public void testVlantagName() {
+        vlanTag.vlantagName("vlantagName");
+        assertEquals("vlantagName", vlanTag.getVlantagName());
+    }
+
+    @Test
+    public void testVlantagValue() {
+        vlanTag.vlantagValue("vlantagValue");
+        assertEquals("vlantagValue", vlanTag.getVlantagValue());
+    }
+
+    @Test
+    public void testEqualsAndHashCode() {
+        assertTrue(vlanTag.equals(vlanTag1));
+        assertTrue((Integer)vlanTag.hashCode() instanceof Integer);
+    }
+    
+    
+}
