Merge "update pom and change aaf config"
diff --git a/deliveries/local-dev-host-clone.sh b/deliveries/local-dev-host-clone.sh
index 1d7ae42..43153d3 100644
--- a/deliveries/local-dev-host-clone.sh
+++ b/deliveries/local-dev-host-clone.sh
@@ -2,6 +2,6 @@
 # Sets up a new build area for Portal projects on on a dev/test host such as vm-ep-dev3
 
 USER=org.UserId-goes-here
-git clone https://${USER}@gerrit.onap.org/r/a/portal
+git clone --depth 1 https://${USER}@gerrit.onap.org/r/a/portal
 cd lf_portal
-git clone https://${USER}@gerrit.onap.org/r/a/portal/sdk
+git clone --depth 1 https://${USER}@gerrit.onap.org/r/a/portal/sdk
diff --git a/docs/conf.py b/docs/conf.py
index 8f40e8b..5371015 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -12,4 +12,4 @@
 html_last_updated_fmt = '%d-%b-%y %H:%M'
 
 def setup(app):
-    app.add_stylesheet("css/ribbon_onap.css")
+    app.add_stylesheet("css/ribbon.css")
diff --git a/docs/tutorials/portal-BE/setting-up.rst b/docs/tutorials/portal-BE/setting-up.rst
index 22d7f47..3644899 100644
--- a/docs/tutorials/portal-BE/setting-up.rst
+++ b/docs/tutorials/portal-BE/setting-up.rst
@@ -18,7 +18,7 @@
 
 ::
 
-    git clone "https://gerrit.onap.org/r/portal"
+    git clone --depth 1 "https://gerrit.onap.org/r/portal"
 
 Building
 -----------------
diff --git a/docs/tutorials/portal-sdk/setting-up.rst b/docs/tutorials/portal-sdk/setting-up.rst
index ce32dbb..ae03f1a 100644
--- a/docs/tutorials/portal-sdk/setting-up.rst
+++ b/docs/tutorials/portal-sdk/setting-up.rst
@@ -18,7 +18,7 @@
 
 ::
 
-    git clone http://gerrit.onap.org/r/portal/sdk
+    git clone --depth 1 http://gerrit.onap.org/r/portal/sdk
 
 Building the base
 -----------------
diff --git a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/controller/WidgetsCatalogController.java b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/controller/WidgetsCatalogController.java
index 4b68a01..e2cd13c 100644
--- a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/controller/WidgetsCatalogController.java
+++ b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/controller/WidgetsCatalogController.java
@@ -282,16 +282,7 @@
                 + MS_WIDGET_URL + widgetId + "/framework.js", String.class,
 				WidgetServiceHeaders.getInstance());
 	}
-
-	@GetMapping(value = "/portalApi/microservices/{widgetId}/controller.js")
-	public String getWidgetController(@PathVariable("widgetId") long widgetId) throws Exception {
-		return template.getForObject(EcompPortalUtils.widgetMsProtocol() + "://"
-				+ widgetMService.getServiceLocation(whatService,
-						SystemProperties.getProperty(MS_WIDGET_LOCAL_PORT))
-                + MS_WIDGET_URL + widgetId + "/controller.js", String.class,
-				WidgetServiceHeaders.getInstance());
-	}
-
+	
 	@GetMapping(value = "/portalApi/microservices/{widgetId}/style.css")
 	public String getWidgetCSS(@PathVariable("widgetId") long widgetId) throws Exception {
 		return template.getForObject(EcompPortalUtils.widgetMsProtocol() + "://"
diff --git a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/controller/WidgetsCatalogUnRestrictedController.java b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/controller/WidgetsCatalogUnRestrictedController.java
new file mode 100644
index 0000000..55cb08d
--- /dev/null
+++ b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/controller/WidgetsCatalogUnRestrictedController.java
@@ -0,0 +1,133 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software 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.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.portalapp.portal.controller;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.onap.portalapp.controller.EPUnRestrictedBaseController;
+import org.onap.portalapp.portal.domain.EPUser;
+import org.onap.portalapp.portal.domain.MicroserviceParameter;
+import org.onap.portalapp.portal.domain.WidgetCatalog;
+import org.onap.portalapp.portal.domain.WidgetCatalogParameter;
+import org.onap.portalapp.portal.domain.WidgetParameterResult;
+import org.onap.portalapp.portal.domain.WidgetServiceHeaders;
+import org.onap.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.onap.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.onap.portalapp.portal.logging.aop.EPAuditLog;
+import org.onap.portalapp.portal.service.WidgetMService;
+import org.onap.portalapp.portal.utils.EPCommonSystemProperties;
+import org.onap.portalapp.portal.utils.EcompPortalUtils;
+import org.onap.portalapp.util.EPUserUtils;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
+
+@SuppressWarnings("unchecked")
+@RestController
+@org.springframework.context.annotation.Configuration
+@EnableAspectJAutoProxy
+@EPAuditLog
+public class WidgetsCatalogUnRestrictedController extends EPUnRestrictedBaseController {
+
+	private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(WidgetsCatalogUnRestrictedController.class);
+
+	private static final String MS_WIDGET_LOCAL_PORT = "microservices.widget.local.port";
+
+    private static final String MS_WIDGET_URL = "/widget/microservices/";
+
+	private RestTemplate template = new RestTemplate();
+
+	private String whatService = "widgets-service";
+
+	@Autowired
+	private WidgetMService widgetMService;
+
+
+	@Bean
+	public CommonsMultipartResolver multipartResolver() {
+		return new CommonsMultipartResolver();
+	}
+
+	static {
+		// for localhost testing only
+		javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
+			public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
+				if ("localhost".equals(hostname))
+					return true;
+				return false;
+			}
+		});
+	}
+	@GetMapping(value = "/portalApi/microservices/{widgetId}/controller.js")
+	public String getWidgetController(@PathVariable("widgetId") long widgetId) throws Exception {
+		return template.getForObject(EcompPortalUtils.widgetMsProtocol() + "://"
+				+ widgetMService.getServiceLocation(whatService,
+						SystemProperties.getProperty(MS_WIDGET_LOCAL_PORT))
+                + MS_WIDGET_URL + widgetId + "/controller.js", String.class,
+				WidgetServiceHeaders.getInstance());
+	}
+}
diff --git a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduler/SchedulerRestInterface.java b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduler/SchedulerRestInterface.java
index 6a581c1..0f6f3ce 100644
--- a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduler/SchedulerRestInterface.java
+++ b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduler/SchedulerRestInterface.java
@@ -151,9 +151,6 @@
 				
 		logger.debug(EELFLoggerDelegate.debugLogger, "Client Initialized");
 		
-		
-		
-
 	}
 
 	@SuppressWarnings("unchecked")
@@ -178,7 +175,7 @@
 			if (cres.getEntity() != null) {
 				try {
 					String str = (cres).readEntity(String.class);
-					if (t.getClass().getName().equals(String.class.getName())) {
+					if (t.getClass().isAssignableFrom(String.class)) {
 						t = (T) str;
 
 					} else {
@@ -233,7 +230,7 @@
 
 				try {
 					String str = (cres).readEntity(String.class);
-					if (t.getClass().getName().equals(String.class.getName())) {
+					if (t.getClass().isAssignableFrom(String.class)) {
 						t = (T) str;
 
 					} else {
diff --git a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduler/SchedulerUtil.java b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduler/SchedulerUtil.java
index c1ca873..675cfe1 100644
--- a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduler/SchedulerUtil.java
+++ b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduler/SchedulerUtil.java
@@ -57,17 +57,17 @@
 
 	public static GetTimeSlotsWrapper getTimeSlotsWrapResponse (GetTimeSlotsRestObject<String> rs) {	
 		
-		String resp_str = "";
+		String respStr = "";
 		int status = 0;
 		
 		if ( rs != null ) {
-			resp_str = rs.get();
+			respStr = rs.get();
 			status = rs.getStatusCode();
 		}
 				
 		GetTimeSlotsWrapper w = new GetTimeSlotsWrapper();
 		
-		w.setEntity(resp_str);
+		w.setEntity(respStr);
 		w.setStatus (status);
 		
 		return (w);
@@ -75,19 +75,19 @@
 	
 	public static PostSubmitVnfChangeTimeSlotsWrapper postSubmitNewVnfWrapResponse (PostSubmitVnfChangeRestObject<String> rs) {	
 		
-		String resp_str = "";
+		String respStr = "";
 		int status = 0;
 		String uuid = "";
 		
 		if ( rs != null ) {
-			resp_str = rs.get();
+			respStr = rs.get();
 			status = rs.getStatusCode();
 			uuid = rs.getUUID();
 		}
 				
 		PostSubmitVnfChangeTimeSlotsWrapper w = new PostSubmitVnfChangeTimeSlotsWrapper();
 		
-		w.setEntity(resp_str);
+		w.setEntity(respStr);
 		w.setStatus (status);
 		w.setUuid(uuid);
 		
@@ -96,19 +96,19 @@
 	
 	public static PostCreateNewVnfWrapper postCreateNewVnfWrapResponse (PostCreateNewVnfRestObject<String> rs) {	
 		
-		String resp_str = "";
+		String respStr = "";
 		int status = 0;
 		String uuid = "";
 		
 		if ( rs != null ) {
-			resp_str = rs.get();
+			respStr = rs.get();
 			status = rs.getStatusCode();
 			uuid = rs.getUUID();
 		}
 				
 		PostCreateNewVnfWrapper w = new PostCreateNewVnfWrapper();
 		
-		w.setEntity(resp_str);
+		w.setEntity(respStr);
 		w.setStatus (status);
 		w.setUuid(uuid);
 		
@@ -121,14 +121,14 @@
 		ObjectMapper mapper = new ObjectMapper();
 		String r_json_str = "";
 	    if ( t != null ) {
-		    try {
-		    	r_json_str = mapper.writeValueAsString(t);
-		    }
-		    catch ( com.fasterxml.jackson.core.JsonProcessingException j ) {
-					logger.debug(EELFLoggerDelegate.debugLogger,
-						DateUtil.getDateFormat().format(new Date()) + "<== " + methodName + " Unable " + "to "
-							+ "parse object as json");
-				}
+            try {
+                r_json_str = mapper.writeValueAsString(t);
+            } catch (com.fasterxml.jackson.core.JsonProcessingException j) {
+                logger.debug(
+                        EELFLoggerDelegate.debugLogger, DateUtil.getDateFormat().format(new Date())
+                                + "<== " + methodName + " Unable " + "to " + "parse object as json",
+                        j);
+            }
 	    }
 	    return (r_json_str);
 	}
diff --git a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduleraux/SchedulerAuxRestInt.java b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduleraux/SchedulerAuxRestInt.java
index 75919ee..f120c4f 100644
--- a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduleraux/SchedulerAuxRestInt.java
+++ b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/scheduleraux/SchedulerAuxRestInt.java
@@ -63,24 +63,21 @@
 	 *
 	 * @param r the r
 	 */
-	public void logRequest ( RequestDetails r ) {
-		  SimpleDateFormat dateFormat = DateUtil.getDateFormat();
-    	String methodName = "logRequest";
-	    ObjectMapper mapper = new ObjectMapper();
-	    String r_json_str = "";
-	    if ( r != null ) {
-	    	r_json_str = r.toString();
-		    try {
-		    	r_json_str = mapper.writeValueAsString(r);
-		    }
-		    catch ( com.fasterxml.jackson.core.JsonProcessingException j ) {
-		    	logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " +  methodName + " "
-						+ "Unable to "
-						+ "parse request as json");
-		    }
-	    }
-	    logger.debug(EELFLoggerDelegate.debugLogger,dateFormat.format(new Date()) + "<== " +  methodName + " Request="
-				+ "(" +
-				r_json_str + ")");
+    public void logRequest(RequestDetails r) {
+        SimpleDateFormat dateFormat = DateUtil.getDateFormat();
+        String methodName = "logRequest";
+        ObjectMapper mapper = new ObjectMapper();
+        String rJsonStr = "";
+        if (r != null) {
+            rJsonStr = r.toString();
+            try {
+                rJsonStr = mapper.writeValueAsString(r);
+            } catch (com.fasterxml.jackson.core.JsonProcessingException j) {
+                logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== "
+                        + methodName + " " + "Unable to " + "parse request as json", j);
+            }
+        }
+        logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== "
+                + methodName + " Request=" + "(" + rJsonStr + ")");
     }
 }
diff --git a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/service/EPRoleServiceImpl.java b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/service/EPRoleServiceImpl.java
index 5d38317..4adf1fd 100644
--- a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/service/EPRoleServiceImpl.java
+++ b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/service/EPRoleServiceImpl.java
@@ -62,6 +62,9 @@
 public class EPRoleServiceImpl implements EPRoleService {
     EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(EPRoleServiceImpl.class);
 
+    private static final String GET_APP_ROLE_SQL_FORMAT =
+            "SELECT * FROM fn_role where APP_ID = %s AND APP_ROLE_ID = %s";
+
     @Autowired
     private DataAccessService dataAccessService;
 
@@ -123,10 +126,6 @@
         return (EPRole) getDataAccessService().getDomainObject(EPRole.class, id, null);
     }
 
-    // TODO: refactor
-    private static final String GET_APP_ROLE_SQL_FORMAT =
-            "SELECT * FROM fn_role where APP_ID = %s AND APP_ROLE_ID = %s";
-
     @SuppressWarnings("unchecked")
     public EPRole getRole(Long appId, Long appRoleid) {
         if (appId == null || appRoleid == null) {
@@ -185,7 +184,7 @@
             if (roles != null) {
                 return roles.get(0);
             }
-        } else if (resultsCount == 1) {
+        } else if (roles!=null && resultsCount == 1) {
             return roles.get(0);
         }
         return null;
diff --git a/ecomp-portal-BE-common/src/test/java/org/onap/portalapp/portal/controller/WidgetsCatalogControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/onap/portalapp/portal/controller/WidgetsCatalogControllerTest.java
index 675e4f4..5daacbd 100644
--- a/ecomp-portal-BE-common/src/test/java/org/onap/portalapp/portal/controller/WidgetsCatalogControllerTest.java
+++ b/ecomp-portal-BE-common/src/test/java/org/onap/portalapp/portal/controller/WidgetsCatalogControllerTest.java
@@ -353,28 +353,6 @@
 
 	@SuppressWarnings("unchecked")
 	@Test
-	public void getWidgetControllerTest() throws Exception {
-		PowerMockito.mockStatic(EcompPortalUtils.class);
-		PowerMockito.mockStatic(SystemProperties.class);
-		PowerMockito.mockStatic(EPCommonSystemProperties.class);
-		PowerMockito.mockStatic(CipherUtil.class);
-		Mockito.when(EcompPortalUtils.widgetMsProtocol()).thenReturn("test1");
-		Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.WIDGET_MS_PROTOCOL)).thenReturn("https");
-		Mockito.when(SystemProperties.getProperty("microservices.widget.local.port")).thenReturn("test");
-		Mockito.when(EcompPortalUtils.getPropertyOrDefault("microservices.widget.username", "widget_user"))
-				.thenReturn("test");
-		Mockito.when(CipherUtil
-				.decryptPKC(EcompPortalUtils.getPropertyOrDefault("microservices.widget.password", "widget_password")))
-				.thenReturn("abc");
-		Mockito.when(widgetMService.getServiceLocation("widgets-service", "test")).thenReturn("test.com");
-		Mockito.when(template.getForObject(Mockito.anyString(), Mockito.any(Class.class), Mockito.any(String.class)))
-				.thenReturn("test123");
-		String result = widgetsCatalogController.getWidgetController(1);
-		assertNull(result);
-	}
-
-	@SuppressWarnings("unchecked")
-	@Test
 	public void getWidgetCSSTest() throws Exception {
 		PowerMockito.mockStatic(EcompPortalUtils.class);
 		PowerMockito.mockStatic(SystemProperties.class);
diff --git a/ecomp-portal-BE-common/src/test/java/org/onap/portalapp/portal/controller/WidgetsCatalogUnRestrictedControllerTest.java b/ecomp-portal-BE-common/src/test/java/org/onap/portalapp/portal/controller/WidgetsCatalogUnRestrictedControllerTest.java
new file mode 100644
index 0000000..fbee764
--- /dev/null
+++ b/ecomp-portal-BE-common/src/test/java/org/onap/portalapp/portal/controller/WidgetsCatalogUnRestrictedControllerTest.java
@@ -0,0 +1,143 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software 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.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.portalapp.portal.controller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.onap.portalapp.portal.core.MockEPUser;
+import org.onap.portalapp.portal.domain.EPUser;
+import org.onap.portalapp.portal.domain.MicroserviceParameter;
+import org.onap.portalapp.portal.domain.WidgetCatalog;
+import org.onap.portalapp.portal.domain.WidgetCatalogParameter;
+import org.onap.portalapp.portal.domain.WidgetParameterResult;
+import org.onap.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.onap.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.onap.portalapp.portal.framework.MockitoTestSuite;
+import org.onap.portalapp.portal.service.MicroserviceServiceImpl;
+import org.onap.portalapp.portal.service.WidgetMService;
+import org.onap.portalapp.portal.service.WidgetMServiceImpl;
+import org.onap.portalapp.portal.service.WidgetParameterServiceImpl;
+import org.onap.portalapp.portal.utils.EPCommonSystemProperties;
+import org.onap.portalapp.portal.utils.EcompPortalUtils;
+import org.onap.portalapp.util.EPUserUtils;
+import org.onap.portalsdk.core.onboarding.util.CipherUtil;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.mock.web.MockMultipartHttpServletRequest;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
+
+@SuppressWarnings("rawtypes")
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ EPUserUtils.class, CipherUtil.class, EcompPortalUtils.class, SystemProperties.class,
+		EPCommonSystemProperties.class, EPUserUtils.class })
+public class WidgetsCatalogUnRestrictedControllerTest {
+
+	@Mock
+	WidgetMService widgetMService = new WidgetMServiceImpl();
+
+	@InjectMocks
+	WidgetsCatalogUnRestrictedController widgetsCatalogControllerTest = new WidgetsCatalogUnRestrictedController();
+
+	@Before
+	public void setup() {
+		MockitoAnnotations.initMocks(this);
+	}
+
+	@Mock
+	RestTemplate template = new RestTemplate();
+
+	MockitoTestSuite mockitoTestSuite = new MockitoTestSuite();
+
+	HttpServletRequest mockedRequest = mockitoTestSuite.getMockedRequest();
+	HttpServletResponse mockedResponse = mockitoTestSuite.getMockedResponse();
+
+	NullPointerException nullPointerException = new NullPointerException();
+
+	MockEPUser mockUser = new MockEPUser();
+
+
+	@SuppressWarnings("unchecked")
+	@Test
+	public void getWidgetControllerTest() throws Exception {
+		PowerMockito.mockStatic(EcompPortalUtils.class);
+		PowerMockito.mockStatic(SystemProperties.class);
+		PowerMockito.mockStatic(EPCommonSystemProperties.class);
+		PowerMockito.mockStatic(CipherUtil.class);
+		Mockito.when(EcompPortalUtils.widgetMsProtocol()).thenReturn("test1");
+		Mockito.when(SystemProperties.getProperty(EPCommonSystemProperties.WIDGET_MS_PROTOCOL)).thenReturn("https");
+		Mockito.when(SystemProperties.getProperty("microservices.widget.local.port")).thenReturn("test");
+		Mockito.when(EcompPortalUtils.getPropertyOrDefault("microservices.widget.username", "widget_user"))
+				.thenReturn("test");
+		Mockito.when(CipherUtil
+				.decryptPKC(EcompPortalUtils.getPropertyOrDefault("microservices.widget.password", "widget_password")))
+				.thenReturn("abc");
+		Mockito.when(widgetMService.getServiceLocation("widgets-service", "test")).thenReturn("test.com");
+		Mockito.when(template.getForObject(Mockito.anyString(), Mockito.any(Class.class), Mockito.any(String.class)))
+				.thenReturn("test123");
+		String result = widgetsCatalogControllerTest.getWidgetController(1);
+		assertNull(result);
+	}
+
+	
+	
+}
diff --git a/ecomp-portal-widget-ms/widget-ms/pom.xml b/ecomp-portal-widget-ms/widget-ms/pom.xml
index 50a285c..2cdf13f 100644
--- a/ecomp-portal-widget-ms/widget-ms/pom.xml
+++ b/ecomp-portal-widget-ms/widget-ms/pom.xml
@@ -91,7 +91,7 @@
 		<dependency>
 			<groupId>org.mariadb.jdbc</groupId>
 			<artifactId>mariadb-java-client</artifactId>
-			<!-- <version>1.5.8</version> -->
+			<version>1.5.8</version>
 		</dependency>
 		<dependency>
 			<groupId>com.github.ulisesbocchio</groupId>
diff --git a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/controller/WidgetsCatalogController.java b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/controller/WidgetsCatalogController.java
index 1896a4f..e6c1c0a 100644
--- a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/controller/WidgetsCatalogController.java
+++ b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/controller/WidgetsCatalogController.java
@@ -163,13 +163,14 @@
 		try {
 			//check the zip file structure first
 			respond = storageService.checkZipFile(file);
+			logger.debug("Check file validity"+respond.isValid()+respond.getError());
 			if(respond.isValid()){
 				//update the widget catalog
 				WidgetCatalog newWidget = new ObjectMapper().readValue(widget, WidgetCatalog.class);
 				widgetCatalogService.updateWidgetCatalog(widgetId, newWidget);
 				logger.debug("WidgetsCatalogController.saveWidgetCatalog: updating widget with widgetId={}", widgetId);
 				//update the widget zip file
-				storageService.update(file, newWidget, widgetId);
+				storageService.updateJsFile(file, newWidget, widgetId);
 			}
 		} catch (Exception e) {
 			logger.error("Exception occurred while performing WidgetsCatalogController.saveWidgetCatalog in widget microservices. Details:", e);
diff --git a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/StorageService.java b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/StorageService.java
index fbd0f96..d8b5642 100644
--- a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/StorageService.java
+++ b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/StorageService.java
@@ -30,5 +30,7 @@
     
     void update(MultipartFile file, WidgetCatalog newWidget, long widgetId);
     
+    void updateJsFile(MultipartFile file, WidgetCatalog newWidget, long widgetId);
+    
 	byte[] getWidgetCatalogContent(long widgetId) throws Exception;
 }
diff --git a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/StorageServiceImpl.java b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/StorageServiceImpl.java
index 7a35ba4..3bb41b6 100644
--- a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/StorageServiceImpl.java
+++ b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/StorageServiceImpl.java
@@ -73,7 +73,7 @@
 		Criteria criteria = session.createCriteria(WidgetFile.class);
 		criteria.add(Restrictions.eq("widgetId", widgetId));
 		List<WidgetFile> widgetFiles = criteria.list();
-		session.flush();
+		//session.flush();
 		session.close();
 		if (widgetFiles.size() > 0)
 			widgetFile = widgetFiles.get(0);
@@ -148,7 +148,7 @@
 			logger.error("StorageServiceImpl.save: Failed to store file " + file.getOriginalFilename(), e);
 			throw new StorageException("Failed to store file " + file.getOriginalFilename(), e);
 		}
-		saveHelper(newWidget, widgetId, map);
+		saveJsHelper(newWidget, widgetId, map);
 	}
 
 	@Override
@@ -167,7 +167,7 @@
 			throw new StorageException("Failed to store file " + file.getName(), e);
 		}
 		
-		saveHelper(newWidget, widgetId, map);
+		saveJsHelper(newWidget, widgetId, map);
 	}
 
 	/**
@@ -259,6 +259,90 @@
 				widgetId);
 
 	}
+	
+	/**
+	 * Helper method to UnZip File
+	 * 
+	 * @param file
+	 */
+	private Map<String, byte[]> unZipFile(MultipartFile file) {
+		UnzipUtil unzipper = new UnzipUtil();
+		Map<String, byte[]> map;
+		File convFile;
+		try {
+			if (file.isEmpty()) {
+				logger.error("StorageServiceImpl.update: Failed to store empty file " + file.getOriginalFilename());
+				throw new StorageException("Failed to store empty file " + file.getOriginalFilename());
+			}
+			String fileLocation = file.getOriginalFilename();
+			logger.debug("StorageServiceImpl.update: store the widget to:" + fileLocation);
+			convFile = new File(fileLocation);
+			try(FileOutputStream fos = new FileOutputStream(convFile)){
+				fos.write(file.getBytes());
+			}
+			map = unzipper.unzip_db(fileLocation, ".", "tempWidgets");
+			convFile.delete();
+			return map;
+		} catch (IOException e) {
+			logger.error("StorageServiceImpl.update: Failed to store file " + file.getOriginalFilename(), e);
+			throw new StorageException("StorageServiceImpl.update: Failed to store file " + file.getOriginalFilename(),
+					e);
+		}
+	}
+	
+	/**
+	 * Helper method for saving widget file (controller.js) to ep_widget_catalog_files table in database
+	 * 
+	 * @param newWidget
+	 * @param widgetId
+	 * @param map
+	 */
+	private void saveJsHelper(WidgetCatalog newWidget, long widgetId, Map<String, byte[]> map) {
+
+		logger.debug("Going to save controller.js " + newWidget);
+		WidgetFile widgetFile = new WidgetFile();
+		widgetFile.setName(newWidget.getName());
+		widgetFile.setWidgetId(widgetId);
+		final byte[] controllerLoc = map.get(WidgetConstant.WIDGET_CONTROLLER_LOCATION);
+		if (controllerLoc == null || controllerLoc.length == 0)
+			throw new IllegalArgumentException(
+					"Map is missing required key " + WidgetConstant.WIDGET_CONTROLLER_LOCATION);
+		String javascript = new String(controllerLoc);
+
+		widgetFile.setController(javascript.getBytes());
+		Session session = sessionFactory.openSession();
+		session.save(widgetFile);
+		session.flush();
+		session.close();
+		logger.debug(
+				"StorageServiceImpl.save: saved controller.js file to the database for widget {}",
+				widgetId);
+
+	}
+	
+	@Override
+	public void updateJsFile(MultipartFile file, WidgetCatalog newWidget, long widgetId) {
+		Map<String, byte[]> map;
+		map = unZipFile(file);
+		//Get existing widget file from DB	
+		WidgetFile widgetFile = getWidgetFile(widgetId);
+		
+		String javascript = new String(map.get(WidgetConstant.WIDGET_CONTROLLER_LOCATION));
+		widgetFile.setController(javascript.getBytes());
+		Session session = sessionFactory.openSession();
+		Transaction tx = session.beginTransaction();
+		session.update(widgetFile);
+		tx.commit();
+		session.flush();
+		session.close();
+		logger.debug(
+				"StorageServiceImpl.save: updated controller.js file to the database for widget {}",
+				widgetId);
+	}
+	
+	
+	
+	
 
 	@Override
 	public void update(MultipartFile file, WidgetCatalog newWidget, long widgetId) {
@@ -424,53 +508,14 @@
 	public byte[] getWidgetCatalogContent(long widgetId) throws Exception {
 
 		WidgetCatalog widget = widgetCatalogService.getWidgetCatalog(widgetId);
-		String namespace = "Portal" + widgetId + "Widget";
-		String controllerName = "Portal" + widgetId + "Ctrl";
-		String cssName = "portal" + widgetId + "-css-ready";
-
-		String styles = getWidgetCSS(widgetId).replaceAll(cssName, widget.getName() + "-css-ready");
 		File f = File.createTempFile("temp", ".zip");
 		try(ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f))){
-			ZipEntry e = new ZipEntry(widget.getName() + "/styles/styles.css");
-			out.putNextEntry(new ZipEntry(widget.getName() + "/"));
-			out.putNextEntry(new ZipEntry(widget.getName() + "/styles/"));
-			out.putNextEntry(e);
-			byte[] data = styles.getBytes();
-			out.write(data, 0, data.length);
+			String javascript = getWidgetController(widgetId);
 	
-			String widgetData = namespace + "=" + namespace + "||{};" + "var res = " + namespace + ".widgetData;";
-			String javascript = getWidgetController(widgetId).replace(widgetData, "").replace(namespace + ".controller =",
-					"");
-	
-			String functionHeader = javascript.substring(javascript.indexOf("function"), javascript.indexOf(")") + 1);
-			javascript = javascript.replaceFirst(controllerName, widget.getName() + "Ctrl");
-			String functionParam = functionHeader.substring(functionHeader.indexOf("(") + 1, functionHeader.indexOf(")"));
-			StringBuilder injectStr = new StringBuilder().append("[");
-			List<String> paramList = Arrays.asList(functionParam.split(","));
-			for (int i = 0; i < paramList.size(); i++) {
-				if (i == paramList.size() - 1)
-					injectStr.append("'" + paramList.get(i).trim() + "'];");
-				else
-					injectStr.append("'" + paramList.get(i).trim() + "',");
-			}
-			javascript = javascript.replace(";" + namespace + ".controller.$inject = " + injectStr.toString(), "");
-	
-			e = new ZipEntry(widget.getName() + "/js/controller.js");
+			ZipEntry e = new ZipEntry(widget.getName() + "/js/controller.js");
 			out.putNextEntry(new ZipEntry(widget.getName() + "/js/"));
 			out.putNextEntry(e);
-			data = javascript.getBytes();
-			out.write(data, 0, data.length);
-	
-			String html = getWidgetMarkup(widgetId).replaceFirst(controllerName, widget.getName() + "Ctrl");
-	
-			// new
-			// String(map.get(WidgetConstant.WIDGET_MARKUP_LOCATION)).replaceFirst(functionName,
-			// controllerName);;
-	
-			e = new ZipEntry(widget.getName() + "/markup/markup.html");
-			out.putNextEntry(new ZipEntry(widget.getName() + "/markup/"));
-			out.putNextEntry(e);
-			data = html.getBytes();
+			byte[] data = javascript.getBytes();
 			out.write(data, 0, data.length);
 			out.closeEntry();
 			byte[] result = Files.readAllBytes(Paths.get(f.getPath()));
diff --git a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/WidgetCatalogServiceImpl.java b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/WidgetCatalogServiceImpl.java
index f5558e2..d71356f 100644
--- a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/WidgetCatalogServiceImpl.java
+++ b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/WidgetCatalogServiceImpl.java
@@ -148,14 +148,13 @@
 	@Override
 	public WidgetCatalog getWidgetCatalog(Long widgetCatalogId) {
 		Session session = sessionFactory.getCurrentSession();
-		Transaction tx = session.beginTransaction();
 		WidgetCatalog widget = (WidgetCatalog) session.get(WidgetCatalog.class, widgetCatalogId);
-		tx.commit();
 		logger.debug("WidgetCatalogServiceImpl.getWidgetCatalog: getting widget={}", widget);
 		return widget;
 	}
 	
 	@Override
+	@Transactional
 	public void deleteWidgetCatalog(long widgetCatalogId) {
 		logger.debug("WidgetCatalogServiceImpl.deleteWidgetCatalog: deleting the widget with widgetId={}", widgetCatalogId);
 		WidgetCatalog widget = getWidgetCatalog(widgetCatalogId);
@@ -164,7 +163,7 @@
 			return;
 		}
 		Session session = sessionFactory.getCurrentSession();
-		Transaction tx = session.beginTransaction();
+		//Transaction tx = session.beginTransaction();
 		Query query = session.createSQLQuery("delete from ep_pers_user_widget_sel where widget_id = :widgetId ").setParameter("widgetId", widgetCatalogId);
 		query.executeUpdate();
 		query = session.createSQLQuery("delete from ep_pers_user_widget_placement where widget_id = :widgetId ").setParameter("widgetId", widgetCatalogId);
@@ -174,7 +173,7 @@
 		query = session.createSQLQuery("delete from ep_widget_catalog_parameter where widget_id = :widgetId ").setParameter("widgetId", widgetCatalogId);
 		query.executeUpdate();
 		session.delete(widget);
-		tx.commit();
+		//tx.commit();
 	}
 	
 	@Override
diff --git a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/utils/UnzipUtil.java b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/utils/UnzipUtil.java
index f20ed1b..164a698 100644
--- a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/utils/UnzipUtil.java
+++ b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/utils/UnzipUtil.java
@@ -51,8 +51,7 @@
 			ZipEntry entry = zipIn.getNextEntry();
 			Map<String, byte[]> map = new HashMap<>();
 	
-			String[] requiredKeys = { WidgetConstant.WIDGET_CONTROLLER_LOCATION, WidgetConstant.WIDGET_MARKUP_LOCATION,
-					WidgetConstant.WIDGET_STYLE_LOCATION };
+			String[] requiredKeys = { WidgetConstant.WIDGET_CONTROLLER_LOCATION };
 			for (String k : requiredKeys)
 				map.put(k, null);
 	
diff --git a/portal-FE-common/src/app/layout/components/tabbar/tabbar.component.html b/portal-FE-common/src/app/layout/components/tabbar/tabbar.component.html
index 65ccf1d..db0b6af 100644
--- a/portal-FE-common/src/app/layout/components/tabbar/tabbar.component.html
+++ b/portal-FE-common/src/app/layout/components/tabbar/tabbar.component.html
@@ -35,6 +35,17 @@
 
   -->
 
+  <style>
+    .apps-tab {
+     position: absolute;
+     width: 100%;
+     height: 100%;
+     top: 100px;
+     left: 5px;
+     background-color: white;
+   }
+ </style>
+
   <div style="display: flex; flex-direction:column">
 
       <mat-tab-group [selectedIndex]="selected.value" (selectedIndexChange)="selected.setValue($event)"
@@ -79,19 +90,15 @@
 
       </mat-tab-group>
 
-
-
-
-
-        <div *ngFor="let tab of tabs; let index = index"
-          [style.display]='tab.active? "inline" : "none"'
-          [style.position]='tab.active? "static" : "absolute"'
-          [style.height]='tab.active? "calc(100vh)" : "calc(0vh)"'>
-
-          <iframe id="tabframe-{{tab.label.split(' ').join('-')}}-{{index}}" scrolling='yes' frameBorder='0' width='100%'
-            scrolling='yes' frameBorder='0' width='100%' height='90%' [src]='tab.url'></iframe>
-
-        </div>
-
-
-    </div>
+      <div class="apps-tab" *ngFor="let tab of tabs; let index = index"
+          [style.display]='"inline"'
+          [style.position]='"absolute"'
+          [style.height]='"calc(100vh)"'
+          [style.z-index]="tab.active? 1 : 0"
+          [style.opacity]="tab.active? 1 : 0"
+      >
+          <iframe id="tabframe-{{tab.label.split(' ').join('-')}}-{{index}}" scrolling='yes' frameBorder='0'
+            scrolling='yes' frameBorder='0' width='100%' height='90%' [src]='tab.url'>
+          </iframe>
+      </div>
+</div>
diff --git a/portal-FE-common/src/app/pages/functional-menu/functional-menu.component.html b/portal-FE-common/src/app/pages/functional-menu/functional-menu.component.html
index d898563..54df2d1 100644
--- a/portal-FE-common/src/app/pages/functional-menu/functional-menu.component.html
+++ b/portal-FE-common/src/app/pages/functional-menu/functional-menu.component.html
@@ -40,7 +40,7 @@
     <h1 class="heading-page">Edit Functional Menu</h1>
   </div>
   <div id="jqTree"></div>
-  <div class="functional-admin-button-container">
+  <!-- <div class="functional-admin-button-container">
     <button id="regenrate-functionalmenu-btn"
       class="btn btn-alt btn-small"
       (click)="regenerateFunctionalMenuAncestors()">Regenerate Menu
@@ -48,5 +48,5 @@
     <div class="regenerate-functionalmenu-btn-txt">
       <span class="n16r">Click when you are done with your changes.</span>
     </div>
-  </div>
+  </div> -->
 </div>
diff --git a/portal-FE-common/src/app/pages/functional-menu/functional-menu.component.ts b/portal-FE-common/src/app/pages/functional-menu/functional-menu.component.ts
index d3b5a16..c231061 100644
--- a/portal-FE-common/src/app/pages/functional-menu/functional-menu.component.ts
+++ b/portal-FE-common/src/app/pages/functional-menu/functional-menu.component.ts
@@ -151,43 +151,42 @@
    * @param ngbModal 
    */
   buildTree(treedataarray,ngbModal: NgbModal , _self){
-    //console.log("treedataarray>>>>",treedataarray);
-  //   $(function() {
-  //       $('#jqTree').tree('loadData', treedataarray);
-  //       $('#jqTree').tree({
-  //           data: treedataarray,
-  //           autoOpen: false,
-  //           dragAndDrop: true,
-  //           onCreateLi: function(node, $li) {
-  //               ////console.log("node >>",node);
-  //           }
-  //       }).on(
-  //         'tree.contextmenu',
-  //         function(event:any) {
-  //             // The clicked node is 'event.node'
-  //             var node = event.node;
-  //             openMenuDetailsModal(node, "view");
-  //         }
-  //       );
+    console.log("treedataarray>>>>",treedataarray);
+    $(function() {
+        (<any>$('#jqTree')).tree('loadData', treedataarray);
+        (<any>$('#jqTree')).tree({
+            data: treedataarray,
+            autoOpen: false,
+            dragAndDrop: true,
+            onCreateLi: function(node, $li) {
+                ////console.log("node >>",node);
+            }
+        }).on(
+          'tree.contextmenu',
+          function(event:any) {
+              // The clicked node is 'event.node'
+              var node = event.node;
+              openMenuDetailsModal(node, "view");
+          }
+        );
 
-  //       var openMenuDetailsModal = function(node: any, actionName: string ){
-  //         const modalRef = ngbModal.open(FunctionalMenuDialogComponent, { size: 'lg' });
-  //         modalRef.componentInstance.title = 'Functional Menu ',actionName;
-  //         if(node != 'undefined' && node){
-  //           modalRef.componentInstance.nodedata = node;
-  //           modalRef.componentInstance.operationName = actionName;
-  //         }else{
-  //           modalRef.componentInstance.nodedata  = {};
-  //         }
-  //         modalRef.componentInstance.passEntry.subscribe((receivedEntry: any) => {
-  //           //console.log("receivedEntry>>>>",receivedEntry);
-  //           ngbModal.dismissAll();
-  //           if(receivedEntry.httpStatusCode===200){
-  //             _self.getFunctionalMenu();
-  //           }
-  //         });
-  //       }
-  //    });
-  // }
+        var openMenuDetailsModal = function(node: any, actionName: string ){
+          const modalRef = ngbModal.open(FunctionalMenuDialogComponent, { size: 'lg' });
+          modalRef.componentInstance.title = 'Functional Menu ',actionName;
+          if(node != 'undefined' && node){
+            modalRef.componentInstance.nodedata = node;
+            modalRef.componentInstance.operationName = actionName;
+          }else{
+            modalRef.componentInstance.nodedata  = {};
+          }
+          modalRef.componentInstance.passEntry.subscribe((receivedEntry: any) => {
+            //console.log("receivedEntry>>>>",receivedEntry);
+            ngbModal.dismissAll();
+            if(receivedEntry.httpStatusCode===200){
+              _self.getFunctionalMenu();
+            }
+          });
+        }
+     });
   }
 }
diff --git a/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.scss b/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.scss
index c72d11e..7e68e1a 100644
--- a/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.scss
+++ b/portal-FE-common/src/app/pages/web-analytics/web-analytics.component.scss
@@ -44,6 +44,11 @@
     padding-bottom: 15px;
     padding-right: 40px;
     font-weight: bold;
+    white-space: nowrap;
+}
+
+td.mat-cell, td.mat-footer-cell, th.mat-header-cell {
+   padding-right: 45px;
 }
 
 .ion-md-trash{
diff --git a/portal-FE-os/src/app/pages/application-onboarding/application-details-dialog/application-details-dialog.component.html b/portal-FE-os/src/app/pages/application-onboarding/application-details-dialog/application-details-dialog.component.html
index 6d0c544..f68d879 100644
--- a/portal-FE-os/src/app/pages/application-onboarding/application-details-dialog/application-details-dialog.component.html
+++ b/portal-FE-os/src/app/pages/application-onboarding/application-details-dialog/application-details-dialog.component.html
@@ -252,10 +252,10 @@
 								<span style="flex: 9">Upload
 									Image</span>
 								<app-information-tooltip style="flex: 1;"
-									[textMessage]="'Image file must be smaller than 1MB'">
+									[textMessage]="'Image file(.png or.jpg or.jpeg with dimension 200X200 pixel) must be smaller than 1MB.'">
 								</app-information-tooltip>
 							</div>
-							<input type="file" id="input-app-image-upload"
+							<input #inputAppImageUpload type="file" id="input-app-image-upload"
 								class="input-file-field input-app-image-upload-ht" accept="image/*"
 								[(ngModel)]="applicationObj.originalImage" name="appImage"
 								image-upload="applicationObj.originalImage" image-upload-resize-max-height="300"
@@ -284,7 +284,10 @@
 						<div class="property" *ngIf="!(applicationObj.applicationType == '3')">
 							<div class="property-label preview">
 								<span class="left-label">Preview</span>
-								<span class="remove" (click)="removeImage()">Remove</span>
+								<span *ngIf="(applicationObj.imageLink && applicationObj.imageLink.indexOf('default_app_image.gif') == -1
+								||applicationObj.thumbnail && applicationObj.thumbnail.indexOf('default_app_image.gif') == -1
+								||emptyImgForPreview && emptyImgForPreview.indexOf('default_app_image.gif') == -1)" 
+								class="remove" (click)="removeImage()">Remove</span>
 							</div>
 							<img id="image-app-preview" class="image-preview"
 								src="{{applicationObj.imageLink || applicationObj.thumbnail || emptyImgForPreview}}" />
diff --git a/portal-FE-os/src/app/pages/application-onboarding/application-details-dialog/application-details-dialog.component.ts b/portal-FE-os/src/app/pages/application-onboarding/application-details-dialog/application-details-dialog.component.ts
index 1b15f80..852e970 100644
--- a/portal-FE-os/src/app/pages/application-onboarding/application-details-dialog/application-details-dialog.component.ts
+++ b/portal-FE-os/src/app/pages/application-onboarding/application-details-dialog/application-details-dialog.component.ts
@@ -75,6 +75,7 @@
   @Input() action: any;
   @Output() passEntry: EventEmitter<any> = new EventEmitter();
   @ViewChild('applicationName') applicationNameElement: ElementRef;
+  @ViewChild('inputAppImageUpload') inputAppImageUpload: ElementRef;
 
   newAppModel = {
     'id': null,
@@ -200,6 +201,7 @@
         this.applicationObj.imageUrl = null;
         this.applicationObj.imageLink = null;
         this.emptyImgForPreview = '../../../assets/images/default_app_image.gif';
+        this.inputAppImageUpload.nativeElement.value = "";
       }
     }, (resut) => {
       return;
diff --git a/portal-FE-os/src/app/pages/application-onboarding/application-onboarding.component.html b/portal-FE-os/src/app/pages/application-onboarding/application-onboarding.component.html
index 19f5d8a..4772247 100644
--- a/portal-FE-os/src/app/pages/application-onboarding/application-onboarding.component.html
+++ b/portal-FE-os/src/app/pages/application-onboarding/application-onboarding.component.html
@@ -51,6 +51,7 @@
             </button>
           
             <div class="apps-table">
+                <span class="ecomp-spinner" *ngIf="showEcompSpinner"></span>
                 <!-- Applications Table goes here-->
                 <table mat-table [dataSource]="dataSource" matSort>
                     <!-- Thumbnail Column -->
diff --git a/portal-FE-os/src/app/pages/application-onboarding/application-onboarding.component.ts b/portal-FE-os/src/app/pages/application-onboarding/application-onboarding.component.ts
index 5903d65..83cbfa0 100644
--- a/portal-FE-os/src/app/pages/application-onboarding/application-onboarding.component.ts
+++ b/portal-FE-os/src/app/pages/application-onboarding/application-onboarding.component.ts
@@ -66,6 +66,7 @@
   dataSource = new MatTableDataSource(this.appsList);
   @ViewChild(MatSort) sort: MatSort;
   @ViewChild(MatPaginator) paginator: MatPaginator;
+  showEcompSpinner:boolean = false;
 
   constructor(public applicationsService: ApplicationsService, public ngbModal: NgbModal) { }
 
@@ -77,11 +78,13 @@
 
   getOnboardingApps(){
     //console.log("getOnboardingApps called");
+    this.showEcompSpinner = true;
     this.applicationsService.getOnboardingApps()
       .subscribe(_data => {
           this.result = _data;
           if (this.result == null || this.result == 'undefined') {
               console.log('WidgetOnboardingService::getOnboardingWidgets Failed: Result or result.data is null');
+              this.showEcompSpinner = false;
           }else {
             this.appsList = _data;
             for (var i = 0; i < this.appsList.length; i++) {
@@ -94,11 +97,14 @@
               }                    			
             }
             this.populateTableData(this.appsList);
+            this.showEcompSpinner = false;
           }
       }, error =>{
         console.log(error);
+        this.showEcompSpinner = false;
         this.openConfirmationModal('Error', error.message);
     });
+    this.showEcompSpinner = false;
   }
 
   applyFilter(filterValue: string) {
@@ -143,13 +149,16 @@
           console.log('ApplicationOnboardingCtrl::deleteApplication: No apllication or ID... cannot delete');
           return;
         }
+        this.showEcompSpinner = true;
         this.appsList.splice(this.appsList.indexOf(application), 1);
         this.applicationsService.deleteOnboardingApp(application.id)
           .subscribe( data => {
             this.result = data;
             this.getOnboardingApps();
+            this.showEcompSpinner = false;
           }, error => {
             console.log(error);
+            this.showEcompSpinner = false;
             if(error && error.status == 405){
               this.openConfirmationModal('', 'Application : ' + application.appName+ ' can not be deleted as it is associsted with one of the Microservices.');
             }else{