Initial OpenECOMP SDC commit

Change-Id: I0924d5a6ae9cdc161ae17c68d3689a30d10f407b
Signed-off-by: Michael Lando <ml636r@att.com>
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/Constants.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/Constants.java
new file mode 100644
index 0000000..e157efc
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/Constants.java
@@ -0,0 +1,15 @@
+package org.openecomp.sdc.fe;
+
+public class Constants {
+
+	public static String HTTP_IV_USER = "HTTP_IV_USER";
+	public static String USER_ID = "USER_ID";
+	public static String HTTP_CSP_FIRSTNAME = "HTTP_CSP_FIRSTNAME";
+	public static String HTTP_CSP_LASTNAME = "HTTP_CSP_LASTNAME";
+	public static String HTTP_IV_REMOTE_ADDRESS = "HTTP_IV_REMOTE_ADDRESS";
+	public static String HTTP_CSP_WSTYPE = "HTTP_CSP_WSTYPE";
+	public static String HTTP_CSP_EMAIL = "HTTP_CSP_EMAIL";
+	
+	public static final String WEBSEAL_USER_ID_HEADER = "csp-attuid";
+	
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/client/BackendClient.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/client/BackendClient.java
new file mode 100644
index 0000000..93e1714
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/client/BackendClient.java
@@ -0,0 +1,179 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.client;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.core.Response;
+
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.entity.InputStreamEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.api.ResponseInfo;
+import org.openecomp.sdc.common.api.ResponseInfo.ResponseStatusEnum;
+import org.openecomp.sdc.fe.impl.Audit;
+import org.openecomp.sdc.fe.impl.HttpRequestInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BackendClient {
+
+	private static Logger log = LoggerFactory.getLogger(BackendClient.class.getName());
+
+	private HostnameVerifier hostnameVerifier = null;
+
+	private CloseableHttpClient backendHttpClient;
+	private String backendHost;
+	private String backendContext;
+
+	public BackendClient(String protocol, String backendHost, String backendContext) {
+
+		this.backendContext = backendContext;
+		hostnameVerifier = new HostnameVerifier() {
+
+			public boolean verify(String hostname, SSLSession session) {
+
+				return true;
+			}
+		};
+
+		if (protocol == null || protocol.isEmpty() || protocol.equals(Constants.HTTP)) {
+			backendHttpClient = HttpClients.createDefault();
+			this.backendHost = Constants.HTTP + "://" + backendHost;
+		} else {
+			// NULL can be returned in case of error
+			backendHttpClient = getSslClient();
+			this.backendHost = Constants.HTTPS + "://" + backendHost;
+		}
+
+	}
+
+	public HostnameVerifier getHostnameVerifier() {
+		return hostnameVerifier;
+	}
+
+	private CloseableHttpClient getSslClient() {
+
+		CloseableHttpClient httpClient = null;
+		try {
+
+			// SSLContextBuilder is not thread safe
+			SSLContextBuilder builder = new SSLContextBuilder();
+			builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
+			SSLContext sslContext = builder.build();
+
+			httpClient = HttpClientBuilder.create().setSSLHostnameVerifier(hostnameVerifier).setSslcontext(sslContext)
+					.build();
+
+		} catch (Exception e) {
+			log.error("Failed to create https client", e);
+			return null;
+		}
+
+		return httpClient;
+
+	}
+
+	public ResponseInfo forwardRequestToBackend(HttpRequestInfo requestInfo, List<String> requiredHeaders,
+			AsyncResponse asyncResponse) {
+
+		ResponseInfo responseInfo = null;
+		log.debug("forwardRequestToBackend");
+		if (backendHttpClient == null) {
+			responseInfo = new ResponseInfo(ResponseStatusEnum.INTERNAL_ERROR, "Failed to create https client");
+			Audit.error(log, requestInfo, HttpStatus.SC_INTERNAL_SERVER_ERROR);
+			asyncResponse.resume(
+					Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(responseInfo.toString()).build());
+			return responseInfo;
+		}
+
+		CloseableHttpResponse response = null;
+		int status = HttpStatus.SC_INTERNAL_SERVER_ERROR;
+		HttpPost httpPost = new HttpPost(backendHost + backendContext);
+		try {
+
+			log.debug("Executing request {}", httpPost.getRequestLine());
+			httpPost.setEntity(new InputStreamEntity(requestInfo.getRequestData()));
+			boolean allHeadersAreSet = copyHeadersToRequest(requiredHeaders, requestInfo, httpPost);
+			if (!allHeadersAreSet) {
+				responseInfo = new ResponseInfo(ResponseStatusEnum.MISSING_HEADERS, "Required headers are missing");
+				asyncResponse
+						.resume(Response.status(HttpStatus.SC_BAD_REQUEST).entity(responseInfo.toString()).build());
+				Audit.error(log, requestInfo, HttpStatus.SC_BAD_REQUEST);
+			} else {
+				response = backendHttpClient.execute(httpPost);
+				status = response.getStatusLine().getStatusCode();
+				asyncResponse.resume(Response.status(status).entity(response.getEntity()).build());
+			}
+			Audit.info(log, requestInfo, status);
+
+		} catch (IOException e) {
+			log.error("connection with backend failed with exception", e);
+			responseInfo = new ResponseInfo(ResponseStatusEnum.INTERNAL_ERROR, e.getMessage());
+			Audit.error(log, requestInfo, HttpStatus.SC_INTERNAL_SERVER_ERROR);
+			asyncResponse.resume(
+					Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(responseInfo.toString()).build());
+		} finally {
+			try {
+				if (response != null) {
+					response.close();
+				}
+				backendHttpClient.close();
+			} catch (IOException e) {
+				log.error("failed to close httpClient: " + e.getMessage());
+			}
+
+		}
+
+		return responseInfo;
+
+	}
+
+	private boolean copyHeadersToRequest(List<String> requiredHeaders, HttpRequestInfo requestInfo, HttpPost httpPost) {
+		boolean allHeadersAreSet = false;
+		Map<String, String> originalHeaders = requestInfo.getHeaders();
+		for (String headerName : requiredHeaders) {
+			String headerValue = originalHeaders.get(headerName);
+			if (headerValue != null) {
+				httpPost.setHeader(headerName, headerValue);
+			} else {
+				log.error("missing required header " + headerName);
+				return allHeadersAreSet;
+			}
+		}
+		allHeadersAreSet = true;
+		return allHeadersAreSet;
+	}
+
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/Audit.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/Audit.java
new file mode 100644
index 0000000..449d8a9
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/Audit.java
@@ -0,0 +1,73 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.impl;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.openecomp.sdc.common.api.Constants;
+import org.slf4j.Logger;
+
+public class Audit {
+
+	private Audit() {
+	}
+
+	public static void error(Logger log, HttpRequestInfo requestInfo, int status) {
+		String errorMsg = "Internal Error";
+		if (requestInfo != null && requestInfo.getHeaders() != null) {
+			Map<String, String> requestHeaders = requestInfo.getHeaders();
+			errorMsg = String.format(Constants.ERROR_LOG_FORMAT, requestHeaders.get(Constants.USER_ID_HEADER),
+					requestHeaders.get(Constants.FIRST_NAME_HEADER) + " "
+							+ requestHeaders.get(Constants.LAST_NAME_HEADER),
+					requestHeaders.get(Constants.ORIGIN_HEADER), requestHeaders.get(Constants.ACCESS_HEADER),
+					requestInfo.getRequestURL(), status);
+		}
+		log.error(errorMsg);
+	}
+
+	public static void error(Logger log, HttpServletRequest request, int status) {
+		String errorMsg = "Internal Error";
+		if (request != null) {
+
+			errorMsg = String.format(Constants.ERROR_LOG_FORMAT, request.getHeader(Constants.USER_ID_HEADER),
+					request.getHeader(Constants.FIRST_NAME_HEADER) + " "
+							+ request.getHeader(Constants.LAST_NAME_HEADER),
+					request.getHeader(Constants.ORIGIN_HEADER), request.getHeader(Constants.ACCESS_HEADER),
+					request.getRequestURL(), status);
+		}
+		log.error(errorMsg);
+	}
+
+	public static void info(Logger log, HttpRequestInfo requestInfo, int status) {
+		String errorMsg = "Internal Error";
+		if (requestInfo != null && requestInfo.getHeaders() != null) {
+			Map<String, String> requestHeaders = requestInfo.getHeaders();
+			errorMsg = String.format(Constants.ERROR_LOG_FORMAT, requestHeaders.get(Constants.USER_ID_HEADER),
+					requestHeaders.get(Constants.FIRST_NAME_HEADER) + " "
+							+ requestHeaders.get(Constants.LAST_NAME_HEADER),
+					requestHeaders.get(Constants.ORIGIN_HEADER), requestHeaders.get(Constants.ACCESS_HEADER),
+					requestInfo.getRequestURL(), status);
+		}
+		log.info(errorMsg);
+	}
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/CrudOperation.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/CrudOperation.java
new file mode 100644
index 0000000..27fc02c
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/CrudOperation.java
@@ -0,0 +1,26 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.impl;
+
+public enum CrudOperation {
+
+	CREATE, RETRIEVE, UPDATE, DELETE
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/HttpRequestInfo.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/HttpRequestInfo.java
new file mode 100644
index 0000000..6a2a41f
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/HttpRequestInfo.java
@@ -0,0 +1,77 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class HttpRequestInfo {
+
+	public HttpRequestInfo(HttpServletRequest request, Map<String, String> headersMap, String data) {
+		headers = headersMap;
+		requestURL = request.getRequestURI();
+		requestData = new ByteArrayInputStream(data.getBytes());
+		originServletContext = request.getContextPath();
+	}
+
+	private Map<String, String> headers;
+	private String requestURL;
+	private InputStream requestData;
+	private String originServletContext;
+
+	public Map<String, String> getHeaders() {
+		return headers;
+	}
+
+	public void setHeaders(Map<String, String> headers) {
+		this.headers = headers;
+	}
+
+	public String getRequestURL() {
+		return requestURL;
+	}
+
+	public void setRequestURL(String requestURL) {
+		this.requestURL = requestURL;
+	}
+
+	public InputStream getRequestData() {
+		return requestData;
+	}
+
+	public void setRequestData(InputStream requestData) {
+		this.requestData = requestData;
+	}
+
+	public String getOriginServletContext() {
+		return originServletContext;
+	}
+
+	public void setOriginServletContext(String originServletContext) {
+		this.originServletContext = originServletContext;
+	}
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/ImportMetadata.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/ImportMetadata.java
new file mode 100644
index 0000000..0d0aa7b
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/ImportMetadata.java
@@ -0,0 +1,80 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.impl;
+
+public class ImportMetadata {
+
+	private String name;
+	private long size;
+	private String mime;
+	private String creator;
+	private String md5Checksum;
+
+	public ImportMetadata(String name, long size, String mime, String creator, String md5Checksum) {
+		super();
+		this.name = name;
+		this.size = size;
+		this.mime = mime;
+		this.creator = creator;
+		this.md5Checksum = md5Checksum;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public long getSize() {
+		return size;
+	}
+
+	public void setSize(long size) {
+		this.size = size;
+	}
+
+	public String getMime() {
+		return mime;
+	}
+
+	public void setMime(String mime) {
+		this.mime = mime;
+	}
+
+	public String getCreator() {
+		return creator;
+	}
+
+	public void setCreator(String creator) {
+		this.creator = creator;
+	}
+
+	public String getMd5Checksum() {
+		return md5Checksum;
+	}
+
+	public void setMd5Checksum(String md5Checksum) {
+		this.md5Checksum = md5Checksum;
+	}
+
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/listen/FEAppContextListener.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/listen/FEAppContextListener.java
new file mode 100644
index 0000000..b132c46
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/listen/FEAppContextListener.java
@@ -0,0 +1,85 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.listen;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.impl.ExternalConfiguration;
+import org.openecomp.sdc.common.listener.AppContextListener;
+import org.openecomp.sdc.fe.config.ConfigurationManager;
+import org.openecomp.sdc.fe.monitoring.FeMonitoringService;
+import org.openecomp.sdc.fe.servlets.HealthCheckService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FEAppContextListener extends AppContextListener implements ServletContextListener {
+
+	private static Logger log = LoggerFactory.getLogger(FEAppContextListener.class.getName());
+
+	public void contextInitialized(ServletContextEvent context) {
+
+		super.contextInitialized(context);
+
+		ConfigurationManager configurationManager = new ConfigurationManager(
+				ExternalConfiguration.getConfigurationSource());
+		log.debug("loading configuration from configDir:{} appName:{}", ExternalConfiguration.getConfigDir(),
+				ExternalConfiguration.getAppName());
+		context.getServletContext().setAttribute(Constants.CONFIGURATION_MANAGER_ATTR, configurationManager);
+
+		// Health Check service
+		HealthCheckService hcs = new HealthCheckService(context.getServletContext());
+		hcs.start(configurationManager.getConfiguration().getHealthCheckIntervalInSeconds(5));
+		context.getServletContext().setAttribute(Constants.HEALTH_CHECK_SERVICE_ATTR, hcs);
+
+		// Monitoring service
+		FeMonitoringService fms = new FeMonitoringService(context.getServletContext());
+		fms.start(configurationManager.getConfiguration().getSystemMonitoring().getProbeIntervalInSeconds(15));
+
+		if (configurationManager.getConfiguration() == null) {
+			log.debug("ERROR: configuration was not properly loaded");
+			return;
+		}
+
+		ExecutorService executorPool = Executors
+				.newFixedThreadPool(configurationManager.getConfiguration().getThreadpoolSize());
+		context.getServletContext().setAttribute(Constants.THREAD_EXECUTOR_ATTR, executorPool);
+
+		log.debug("After executing {}", this.getClass());
+	}
+
+	public void contextDestroyed(ServletContextEvent context) {
+
+		ExecutorService executorPool = (ExecutorService) context.getServletContext()
+				.getAttribute(Constants.THREAD_EXECUTOR_ATTR);
+		if (executorPool != null) {
+			executorPool.shutdown();
+		}
+
+		super.contextDestroyed(context);
+
+	}
+
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/listen/MyObjectMapperProvider.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/listen/MyObjectMapperProvider.java
new file mode 100644
index 0000000..f891ba4
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/listen/MyObjectMapperProvider.java
@@ -0,0 +1,49 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.listen;
+
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Provider;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+@Provider
+public class MyObjectMapperProvider implements ContextResolver<ObjectMapper> {
+	final ObjectMapper defaultObjectMapper;
+
+	public MyObjectMapperProvider() {
+		defaultObjectMapper = createDefaultMapper();
+	}
+
+	@Override
+	public ObjectMapper getContext(Class<?> type) {
+		return defaultObjectMapper;
+	}
+
+	private static ObjectMapper createDefaultMapper() {
+		final ObjectMapper result = new ObjectMapper();
+		result.configure(SerializationFeature.INDENT_OUTPUT, true);
+
+		return result;
+	}
+
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigMgrServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigMgrServlet.java
new file mode 100644
index 0000000..7792225
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigMgrServlet.java
@@ -0,0 +1,88 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.servlets;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.rest.api.RestConfigurationInfo;
+import org.openecomp.sdc.common.servlets.BasicServlet;
+import org.openecomp.sdc.fe.config.Configuration;
+import org.openecomp.sdc.fe.config.ConfigurationManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Root resource (exposed at "/" path)
+ */
+@Path("/configmgr")
+public class ConfigMgrServlet extends BasicServlet {
+
+	private static Logger log = LoggerFactory.getLogger(ConfigMgrServlet.class.getName());
+
+	@GET
+	@Path("/get")
+	@Produces(MediaType.APPLICATION_JSON)
+	public String getConfig(@Context final HttpServletRequest request, @QueryParam("type") String type) {
+
+		String result = null;
+
+		ServletContext context = request.getSession().getServletContext();
+
+		ConfigurationManager configurationManager = (ConfigurationManager) context
+				.getAttribute(Constants.CONFIGURATION_MANAGER_ATTR);
+
+		if (type == null || type.equals("configuration")) {
+
+			Configuration configuration = configurationManager.getConfiguration();
+			if (configuration == null) {
+				log.warn("Configuration of type " + Configuration.class + " was not found");
+			} else {
+				log.info("The value returned from getConfig is " + configuration);
+
+				result = gson.toJson(configuration);
+
+			}
+		} else if (type.equals("rest")) {
+
+			RestConfigurationInfo configuration = configurationManager.getRestClientConfiguration();
+			if (configuration == null) {
+				log.warn("Configuration of type " + RestConfigurationInfo.class + " was not found");
+			} else {
+				log.info("The value returned from getConfig is " + configuration);
+
+				result = gson.toJson(configuration);
+
+			}
+
+		}
+		return result;
+
+	}
+
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java
new file mode 100644
index 0000000..92bb9e8
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java
@@ -0,0 +1,114 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.servlets;
+
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.container.TimeoutHandler;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.openecomp.sdc.common.api.ConfigurationSource;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.servlets.BasicServlet;
+import org.openecomp.sdc.fe.config.Configuration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Root resource (exposed at "/" path)
+ */
+@Path("/config")
+public class ConfigServlet extends BasicServlet {
+
+	private static Logger log = LoggerFactory.getLogger(ConfigServlet.class.getName());
+
+	@GET
+	@Path("/get")
+	@Produces(MediaType.APPLICATION_JSON)
+	public String getConfig(@Context final HttpServletRequest request) {
+
+		String result = null;
+
+		ServletContext context = request.getSession().getServletContext();
+
+		ConfigurationSource configurationSource = (ConfigurationSource) context
+				.getAttribute(Constants.CONFIGURATION_SOURCE_ATTR);
+		if (configurationSource != null) {
+			Configuration configuration = configurationSource.getAndWatchConfiguration(Configuration.class, null);
+
+			if (configuration == null) {
+				log.warn("Configuration of type " + Configuration.class + " was not found");
+			}
+			log.debug("{}", configuration);
+			if (log.isInfoEnabled()) {
+				log.info("Info level ENABLED...");
+			}
+			log.info("The value returned from getConfig is " + configuration);
+
+			result = gson.toJson(configuration);
+
+		} else {
+			log.warn("Source Configuration object was not initialized in the context.");
+		}
+
+		return result;
+
+	}
+
+	@GET
+	@Path("/asyncget")
+	public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
+
+		asyncResponse.setTimeoutHandler(new TimeoutHandler() {
+
+			@Override
+			public void handleTimeout(AsyncResponse asyncResponse) {
+				asyncResponse.resume(
+						Response.status(Response.Status.SERVICE_UNAVAILABLE).entity("Operation time out.").build());
+			}
+		});
+		asyncResponse.setTimeout(3, TimeUnit.SECONDS);
+
+		new Thread(new Runnable() {
+			@Override
+			public void run() {
+				String result = veryExpensiveOperation();
+				asyncResponse.resume(result);
+			}
+
+			private String veryExpensiveOperation() {
+
+				return "veryExpensiveOperation SUCCESS";
+
+			}
+		}).start();
+	}
+
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeHealthCheckServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeHealthCheckServlet.java
new file mode 100644
index 0000000..da5b321
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeHealthCheckServlet.java
@@ -0,0 +1,49 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.servlets;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.servlets.BasicServlet;
+
+import com.jcabi.aspects.Loggable;
+
+@Loggable(prepend = true, value = Loggable.TRACE, trim = false)
+@Path("/healthCheck")
+public class FeHealthCheckServlet extends BasicServlet {
+
+	// private static Logger log =
+	// LoggerFactory.getLogger(FeHealthCheckServlet.class.getName());
+
+	@GET
+	public Response getFEandBeHealthCheck(@Context final HttpServletRequest request) {
+		ServletContext context = request.getSession().getServletContext();
+		HealthCheckService hcs = ((HealthCheckService) context.getAttribute(Constants.HEALTH_CHECK_SERVICE_ATTR));
+		return hcs.getFeHealth();
+	}
+
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeProxyServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeProxyServlet.java
new file mode 100644
index 0000000..1cd28de
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeProxyServlet.java
@@ -0,0 +1,214 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.servlets;
+
+import java.net.URI;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.client.api.Response;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.config.EcompErrorName;
+import org.openecomp.sdc.fe.config.Configuration;
+import org.openecomp.sdc.fe.config.ConfigurationManager;
+import org.openecomp.sdc.fe.config.FeEcompErrorManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+
+public class FeProxyServlet extends SSLProxyServlet {
+	private static final long serialVersionUID = 1L;
+	private static final String URL = "%s://%s:%s%s";
+	private static Logger log = LoggerFactory.getLogger(FeProxyServlet.class.getName());
+	private static Cache<String, MdcData> mdcDataCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build();
+
+	@Override
+	public URI rewriteURI(HttpServletRequest request) {
+		try {
+			logFeRequest(request);
+		} catch (Exception e) {
+			FeEcompErrorManager.getInstance().processEcompError(EcompErrorName.FeHttpLoggingError, "FE Request");
+			FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Request");
+			log.error("Unexpected FE request logging error :", e);
+		}
+		String originalUrl = request.getRequestURL().toString();
+		String redirectedUrl = getModifiedUrl(request);
+
+		log.debug("FeProxyServlet Redirecting request from: {} , to: {}", originalUrl, redirectedUrl);
+
+		return URI.create(redirectedUrl);
+	}
+
+	@Override
+	protected void onResponseSuccess(HttpServletRequest request, HttpServletResponse response, Response proxyResponse) {
+		try {
+			logFeResponse(request, proxyResponse);
+		} catch (Exception e) {
+			FeEcompErrorManager.getInstance().processEcompError(EcompErrorName.FeHttpLoggingError, "FE Response");
+			FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response");
+			log.error("Unexpected FE response logging error :", e);
+		}
+		super.onResponseSuccess(request, response, proxyResponse);
+	}
+
+	private void logFeRequest(HttpServletRequest httpRequest) {
+
+		MDC.clear();
+
+		Long transactionStartTime = System.currentTimeMillis();
+		// UUID - In FE, we are supposed to get the below header from UI.
+		// We do not generate it if it's missing - BE does.
+		String uuid = httpRequest.getHeader(Constants.X_ECOMP_REQUEST_ID_HEADER);
+		String serviceInstanceID = httpRequest.getHeader(Constants.X_ECOMP_SERVICE_ID_HEADER);
+
+		if (uuid != null && uuid.length() > 0) {
+			// User Id for logging
+			String userId = httpRequest.getHeader(Constants.USER_ID_HEADER);
+
+			String remoteAddr = httpRequest.getRemoteAddr();
+			String localAddr = httpRequest.getLocalAddr();
+
+			mdcDataCache.put(uuid, new MdcData(serviceInstanceID, userId, remoteAddr, localAddr, transactionStartTime));
+
+			updateMdc(uuid, serviceInstanceID, userId, remoteAddr, localAddr, null);
+		}
+		inHttpRequest(httpRequest);
+	}
+
+	private void logFeResponse(HttpServletRequest request, Response proxyResponse) {
+		String uuid = request.getHeader(Constants.X_ECOMP_REQUEST_ID_HEADER);
+		String transactionRoundTime = null;
+
+		if (uuid != null) {
+			MdcData mdcData = mdcDataCache.getIfPresent(uuid);
+			if (mdcData != null) {
+				Long transactionStartTime = mdcData.getTransactionStartTime();
+				if (transactionStartTime != null) {// should'n ever be null, but
+													// just to be defensive
+					transactionRoundTime = Long.toString(System.currentTimeMillis() - transactionStartTime);
+				}
+				updateMdc(uuid, mdcData.getServiceInstanceID(), mdcData.getUserId(), mdcData.getRemoteAddr(), mdcData.getLocalAddr(), transactionRoundTime);
+			}
+		}
+		outHttpResponse(proxyResponse);
+
+		MDC.clear();
+	}
+
+	// Extracted for purpose of clear method name, for logback %M parameter
+	private void inHttpRequest(HttpServletRequest httpRequest) {
+		log.info("{} {} {}", httpRequest.getMethod(), httpRequest.getRequestURI(), httpRequest.getProtocol());
+	}
+
+	// Extracted for purpose of clear method name, for logback %M parameter
+	private void outHttpResponse(Response proxyResponse) {
+		log.info("SC=\"{}\"", proxyResponse.getStatus());
+	}
+
+	private void updateMdc(String uuid, String serviceInstanceID, String userId, String remoteAddr, String localAddr, String transactionStartTime) {
+		MDC.put("uuid", uuid);
+		MDC.put("serviceInstanceID", serviceInstanceID);
+		MDC.put("userId", userId);
+		MDC.put("remoteAddr", remoteAddr);
+		MDC.put("localAddr", localAddr);
+		MDC.put("timer", transactionStartTime);
+	}
+
+	private class MdcData {
+		private String serviceInstanceID;
+		private String userId;
+		private String remoteAddr;
+		private String localAddr;
+		private Long transactionStartTime;
+
+		public MdcData(String serviceInstanceID, String userId, String remoteAddr, String localAddr, Long transactionStartTime) {
+			super();
+			this.serviceInstanceID = serviceInstanceID;
+			this.userId = userId;
+			this.remoteAddr = remoteAddr;
+			this.localAddr = localAddr;
+			this.transactionStartTime = transactionStartTime;
+		}
+
+		public Long getTransactionStartTime() {
+			return transactionStartTime;
+		}
+
+		public String getUserId() {
+			return userId;
+		}
+
+		public String getRemoteAddr() {
+			return remoteAddr;
+		}
+
+		public String getLocalAddr() {
+			return localAddr;
+		}
+
+		public String getServiceInstanceID() {
+			return serviceInstanceID;
+		}
+	}
+
+	public String getModifiedUrl(HttpServletRequest request) {
+
+		Configuration config = getConfiguration(request);
+		if (config == null) {
+			log.error("failed to retrive configuration.");
+		}
+		String scheme = config.getBeProtocol();
+		String uri = request.getRequestURI().toString();
+		StringBuilder url = new StringBuilder();
+		url.append(scheme).append("://").append(config.getBeHost());
+		url.append(":");
+		if (config.getBeProtocol().equals(BE_PROTOCOL.HTTP.getProtocolName())) {
+			url.append(config.getBeHttpPort());
+		} else {
+			url.append(config.getBeSslPort());
+		}
+		url.append(uri);
+		String queryString = request.getQueryString(); // d=789
+		if (queryString != null) {
+			url.append("?").append(queryString);
+		}
+
+		String redirectedUrl = url.toString();
+		String onboardingForwardContext = config.getOnboardingForwardContext();
+		if (onboardingForwardContext == null || onboardingForwardContext.isEmpty()) {
+			onboardingForwardContext = "/onboarding-api";
+		}
+		redirectedUrl = redirectedUrl.replace("/sdc1/feProxy/onboarding-api", onboardingForwardContext);
+		redirectedUrl = redirectedUrl.replace("/sdc1/feProxy", "/sdc2");
+		return redirectedUrl;
+
+	}
+
+	private Configuration getConfiguration(HttpServletRequest request) {
+		Configuration config = ((ConfigurationManager) request.getSession().getServletContext().getAttribute(Constants.CONFIGURATION_MANAGER_ATTR)).getConfiguration();
+		return config;
+	}
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/HealthCheckService.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/HealthCheckService.java
new file mode 100644
index 0000000..338e8d4
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/HealthCheckService.java
@@ -0,0 +1,219 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.servlets;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletContext;
+import javax.ws.rs.core.Response;
+
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.api.HealthCheckInfo;
+import org.openecomp.sdc.common.api.HealthCheckInfo.HealthCheckComponent;
+import org.openecomp.sdc.common.api.HealthCheckInfo.HealthCheckStatus;
+import org.openecomp.sdc.common.api.HealthCheckWrapper;
+import org.openecomp.sdc.common.config.EcompErrorName;
+import org.openecomp.sdc.common.impl.ExternalConfiguration;
+import org.openecomp.sdc.fe.config.Configuration;
+import org.openecomp.sdc.fe.config.ConfigurationManager;
+import org.openecomp.sdc.fe.config.FeEcompErrorManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+
+public class HealthCheckService {
+
+	private class HealthStatus {
+		public String body;
+		public int statusCode;
+
+		public HealthStatus(int code, String body) {
+			this.body = body;
+			this.statusCode = code;
+		}
+	}
+
+	private static final String URL = "%s://%s:%s/sdc2/rest/healthCheck";
+	private static Logger healthLogger = LoggerFactory.getLogger("asdc.fe.healthcheck");
+	private static Logger log = LoggerFactory.getLogger(HealthCheckService.class.getName());
+
+	private HealthStatus lastHealthStatus = new HealthStatus(500, "{}");
+
+	private class HealthCheckScheduledTask implements Runnable {
+		@Override
+		public void run() {
+			healthLogger.trace("Executing FE Health Check Task - Start");
+			HealthStatus currentHealth = checkHealth();
+			int currentHealthStatus = currentHealth.statusCode;
+			healthLogger.trace("Executing FE Health Check Task - Status = {}", currentHealthStatus);
+
+			// In case health status was changed, issue alarm/recovery
+			if (currentHealthStatus != lastHealthStatus.statusCode) {
+				log.trace("FE Health State Changed to {}. Issuing alarm / recovery alarm...", currentHealthStatus);
+				logFeAlarm(currentHealthStatus);
+			}
+
+			// Anyway, update latest response
+			lastHealthStatus = currentHealth;
+		}
+	}
+
+	/**
+	 * This executor will execute the health check task.
+	 */
+	ScheduledExecutorService healthCheckExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
+		@Override
+		public Thread newThread(Runnable r) {
+			return new Thread(r, "FE-Health-Check-Thread");
+		}
+	});
+	private ServletContext context;
+
+	public HealthCheckService(ServletContext context) {
+		this.context = context;
+	}
+
+	public void start(int interval) {
+		this.healthCheckExecutor.scheduleAtFixedRate(new HealthCheckScheduledTask(), 0, interval, TimeUnit.SECONDS);
+	}
+
+	/**
+	 * To be used by the HealthCheckServlet
+	 * 
+	 * @return
+	 */
+	public Response getFeHealth() {
+		return this.buildResponse(lastHealthStatus.statusCode, lastHealthStatus.body);
+	}
+
+	private HealthStatus checkHealth() {
+		CloseableHttpClient httpClient = null;
+		try {
+			Gson gson = new GsonBuilder().setPrettyPrinting().create();
+			Configuration config = ((ConfigurationManager) context.getAttribute(Constants.CONFIGURATION_MANAGER_ATTR))
+					.getConfiguration();
+			String redirectedUrl = String.format(URL, config.getBeProtocol(), config.getBeHost(),
+					config.getBeHttpPort());
+			httpClient = getHttpClient(config);
+			HttpGet httpGet = new HttpGet(redirectedUrl);
+			CloseableHttpResponse beResponse;
+			int beStatus;
+			String feAggHealthCheck;
+			try {
+				beResponse = httpClient.execute(httpGet);
+				beStatus = beResponse.getStatusLine().getStatusCode();
+				String beJsonResponse = EntityUtils.toString(beResponse.getEntity());
+				feAggHealthCheck = getFeHealthCheckInfos(gson, beJsonResponse);
+			} catch (Exception e) {
+				log.error("Health Check error when trying to connect to BE", e);
+				String beDowneResponse = gson.toJson(getBeDownCheckInfos());
+				return new HealthStatus(500, beDowneResponse);
+			}
+			return new HealthStatus(beStatus, feAggHealthCheck);
+		} catch (Exception e) {
+			FeEcompErrorManager.getInstance().processEcompError(EcompErrorName.FeHealthCheckGeneralError, "Unexpected FE Health check error");
+			FeEcompErrorManager.getInstance().logFeHealthCheckGeneralError("Unexpected FE Health check error");
+			log.error("Unexpected FE health check error {}", e.getMessage());
+			return new HealthStatus(500, e.getMessage());
+		} finally {
+			if (httpClient != null) {
+				try {
+					httpClient.close();
+				} catch (IOException e) {
+				}
+			}
+		}
+	}
+
+	private Response buildResponse(int status, String jsonResponse) {
+		healthLogger.trace("FE and BE health check status: {}", jsonResponse);
+		return Response.status(status).entity(jsonResponse).build();
+	}
+
+	private void logFeAlarm(int lastFeStatus) {
+
+		switch (lastFeStatus) {
+		case 200:
+			FeEcompErrorManager.getInstance().processEcompError(EcompErrorName.FeHealthCheckRecovery,
+					"FE Health Recovered");
+			FeEcompErrorManager.getInstance().logFeHealthCheckRecovery("FE Health Recovered");
+			break;
+		case 500:
+			FeEcompErrorManager.getInstance().processEcompError(EcompErrorName.FeHealthCheckConnectionError,
+					"Connection with ASDC-BE is probably down");
+			FeEcompErrorManager.getInstance().logFeHealthCheckError("Connection with ASDC-BE is probably down");
+			break;
+		default:
+			break;
+		}
+
+	}
+
+	private String getFeHealthCheckInfos(Gson gson, String responseString) {
+		Type wrapperType = new TypeToken<HealthCheckWrapper>() {
+		}.getType();
+		HealthCheckWrapper healthCheckWrapper = gson.fromJson(responseString, wrapperType);
+		String appVersion = ExternalConfiguration.getAppVersion();
+		String description = "OK";
+		healthCheckWrapper.getComponentsInfo()
+				.add(new HealthCheckInfo(HealthCheckComponent.FE, HealthCheckStatus.UP, appVersion, description));
+		return gson.toJson(healthCheckWrapper);
+	}
+
+	private HealthCheckWrapper getBeDownCheckInfos() {
+		List<HealthCheckInfo> healthCheckInfos = new ArrayList<HealthCheckInfo>();
+		healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.FE, HealthCheckStatus.UP,
+				ExternalConfiguration.getAppVersion(), "OK"));
+		healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.BE, HealthCheckStatus.DOWN, null, null));
+		healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.ES, HealthCheckStatus.UNKNOWN, null, null));
+		healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.TITAN, HealthCheckStatus.UNKNOWN, null, null));
+		healthCheckInfos.add(new HealthCheckInfo(HealthCheckComponent.DE, HealthCheckStatus.UNKNOWN, null, null));
+		HealthCheckWrapper hcWrapper = new HealthCheckWrapper(healthCheckInfos, "UNKNOWN", "UNKNOWN");
+		return hcWrapper;
+	}
+
+	private CloseableHttpClient getHttpClient(Configuration config) {
+		int timeout = 3000;
+		int socketTimeout = config.getHealthCheckSocketTimeoutInMs(5000);
+		RequestConfig.Builder requestBuilder = RequestConfig.custom();
+		requestBuilder.setConnectTimeout(timeout).setConnectionRequestTimeout(timeout).setSocketTimeout(socketTimeout);
+
+		HttpClientBuilder builder = HttpClientBuilder.create();
+		builder.setDefaultRequestConfig(requestBuilder.build());
+		return builder.build();
+	}
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/KibanaServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/KibanaServlet.java
new file mode 100644
index 0000000..64784b3
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/KibanaServlet.java
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.servlets;
+
+import java.net.URI;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.client.api.Response;
+import org.eclipse.jetty.proxy.ProxyServlet;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.fe.config.Configuration;
+import org.openecomp.sdc.fe.config.ConfigurationManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KibanaServlet extends ProxyServlet {
+	private static final long serialVersionUID = 1L;
+	private static Logger log = LoggerFactory.getLogger(KibanaServlet.class.getName());
+
+	@Override
+	public URI rewriteURI(HttpServletRequest request) {
+
+		String originalUrl = request.getRequestURI();
+
+		String redirectedUrl = getModifiedUrl(request);
+
+		log.debug("KibanaServlet Redirecting request from: {} , to: {}", originalUrl, redirectedUrl);
+
+		return URI.create(redirectedUrl);
+	}
+
+	@Override
+	public void customizeProxyRequest(Request proxyRequest, HttpServletRequest request) {
+		super.customizeProxyRequest(proxyRequest, request);
+
+	}
+
+	@Override
+	protected void onResponseSuccess(HttpServletRequest request, HttpServletResponse response, Response proxyResponse) {
+
+		super.onResponseSuccess(request, response, proxyResponse);
+	}
+
+	public String getModifiedUrl(HttpServletRequest request) {
+		Configuration config = getConfiguration(request);
+		if (config == null) {
+			log.error("failed to retrive configuration.");
+		}
+		// String scheme = request.getScheme();
+		String contextPath = request.getContextPath(); // /mywebapp
+		String servletPath = request.getServletPath(); // /servlet/MyServlet
+		String pathInfo = request.getPathInfo(); // /a/b;c=123
+		String queryString = request.getQueryString(); // d=789
+
+		StringBuilder url = new StringBuilder();
+		url.append(config.getKibanaProtocol()).append("://").append(config.getKibanaHost());
+		url.append(":").append(config.getKibanaPort());
+		url.append(contextPath).append(servletPath);
+
+		if (pathInfo != null) {
+			url.append(pathInfo);
+		}
+		if (queryString != null) {
+			url.append("?").append(queryString);
+		}
+
+		String redirectedUrl = url.toString().replace("/sdc1/kibanaProxy/", "/");
+		return redirectedUrl;
+
+	}
+
+	private Configuration getConfiguration(HttpServletRequest request) {
+		Configuration config = ((ConfigurationManager) request.getSession().getServletContext()
+				.getAttribute(Constants.CONFIGURATION_MANAGER_ATTR)).getConfiguration();
+		return config;
+	}
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/PortalServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/PortalServlet.java
new file mode 100644
index 0000000..4eba2e5
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/PortalServlet.java
@@ -0,0 +1,279 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.servlets;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.List;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+
+import org.openecomp.portalsdk.core.onboarding.crossapi.ECOMPSSO;
+import org.openecomp.sdc.common.config.EcompErrorName;
+import org.openecomp.sdc.common.impl.MutableHttpServletRequest;
+import org.openecomp.sdc.fe.Constants;
+import org.openecomp.sdc.fe.config.Configuration;
+import org.openecomp.sdc.fe.config.ConfigurationManager;
+import org.openecomp.sdc.fe.config.FeEcompErrorManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Root resource (exposed at "/" path)
+ */
+@Path("/")
+public class PortalServlet extends HttpServlet {
+
+	private static Logger log = LoggerFactory.getLogger(PortalServlet.class.getName());
+	private static final long serialVersionUID = 1L;
+	public static final String MISSING_HEADERS_MSG = "Missing Headers In Request";
+	public static final String AUTHORIZATION_ERROR_MSG = "Autherization error";
+	public static final String NEW_LINE = System.getProperty("line.separator");
+
+	/**
+	 * Entry point from ECOMP portal
+	 */
+	@GET
+	@Path("/portal")
+	public void doGet(@Context final HttpServletRequest request, @Context final HttpServletResponse response) {
+		try {
+			addRequestHeadersUsingWebseal(request, response);
+		} catch (Exception e) {
+			FeEcompErrorManager.getInstance().processEcompError(EcompErrorName.FePortalServletError, "Portal Servlet");
+			FeEcompErrorManager.getInstance().logFePortalServletError("Portal Servlet");
+			log.error("Error during getting portal page", e);
+		}
+	}
+	
+	/**
+	 * Building new HTTP request and setting headers for the request The request
+	 * will dispatch to index.html
+	 * 
+	 * @param request
+	 * @param response
+	 * @throws ServletException
+	 * @throws IOException
+	 */
+	private void addRequestHeadersUsingWebseal(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
+		
+		response.setContentType("text/html");
+
+		// Create new request object to dispatch
+		MutableHttpServletRequest mutableRequest = new MutableHttpServletRequest(request);
+
+		// Get configuration object (reads data from configuration.yaml)
+		Configuration configuration = getConfiguration(request);
+
+		// Check if we got header from webseal
+		String userId = request.getHeader(Constants.WEBSEAL_USER_ID_HEADER);
+		if (null == userId) {
+			// Authentication via ecomp portal
+			try {
+				String valdiateECOMPSSO = ECOMPSSO.valdiateECOMPSSO(request);
+				String userIdFromCookie = ECOMPSSO.getUserIdFromCookie(request);
+				if (valdiateECOMPSSO == null || ("").equals(userIdFromCookie)) {
+					// This is probably a webseal request, so missing header in request should be printed.
+					response.sendError(HttpServletResponse.SC_USE_PROXY, MISSING_HEADERS_MSG);
+				}
+				userId = userIdFromCookie;
+			} catch (Exception e) {
+				response.sendError(HttpServletResponse.SC_USE_PROXY, AUTHORIZATION_ERROR_MSG);
+			}
+		}
+		
+		// Replace webseal header with open source header
+		mutableRequest.putHeader(Constants.USER_ID, userId);	
+		
+		// Getting identification headers from configuration.yaml
+		// (identificationHeaderFields) and setting them to new request
+		// mutableRequest
+		List<List<String>> identificationHeaderFields = configuration.getIdentificationHeaderFields();
+		for (List<String> possibleHeadersToRecieve : identificationHeaderFields) {
+			String allowedHeaderToPass = possibleHeadersToRecieve.get(0);
+			setNewHeader(possibleHeadersToRecieve, allowedHeaderToPass, request, mutableRequest);
+		}
+
+		// Getting optional headers from configuration.yaml
+		// (optionalHeaderFields) and setting them to new request mutableRequest
+		List<List<String>> optionalHeaderFields = configuration.getOptionalHeaderFields();
+		for (List<String> possibleHeadersToRecieve : optionalHeaderFields) {
+			String allowedHeaderToPass = possibleHeadersToRecieve.get(0);
+			setNewHeader(possibleHeadersToRecieve, allowedHeaderToPass, request, mutableRequest);
+		}
+
+		// Print headers from original request for debug purposes
+		printHeaders(request);
+
+		// In case using webseal, validate all mandatory headers (identificationHeaderFields) are included in the new request (mutableRequest).
+		// Via ecomp portal do not need to check the headers.
+		boolean allHeadersExist = true;
+		if (null != request.getHeader(Constants.WEBSEAL_USER_ID_HEADER)) {
+			allHeadersExist = checkHeaders(mutableRequest);
+		}
+		
+		if (allHeadersExist) {
+			addCookies(response, mutableRequest, getMandatoryHeaders(request));
+			addCookies(response, mutableRequest, getOptionalHeaders(request));
+			RequestDispatcher rd = request.getRequestDispatcher("index.html");
+			rd.forward(mutableRequest, response);
+		} else {
+			response.sendError(HttpServletResponse.SC_USE_PROXY, MISSING_HEADERS_MSG);
+		}
+	}
+
+	/**
+	 * Print all request headers to the log
+	 * 
+	 * @param request
+	 */
+	private void printHeaders(HttpServletRequest request) {
+
+		if (log.isDebugEnabled()) {
+			StringBuilder builder = new StringBuilder();
+			String sessionId = "";
+			if (request.getSession() != null) {
+				String id = request.getSession().getId();
+				if (id != null) {
+					sessionId = id;
+				}
+			}
+
+			builder.append("Receiving request with headers:" + NEW_LINE);
+			log.debug("{}", request.getHeaderNames());
+			@SuppressWarnings("unchecked")
+			Enumeration<String> headerNames = request.getHeaderNames();
+			if (headerNames != null) {
+				while (headerNames.hasMoreElements()) {
+					String headerName = headerNames.nextElement();
+					String headerValue = request.getHeader(headerName);
+					builder.append("session " + sessionId + " header: name = " + headerName + ", value = " + headerValue + NEW_LINE);
+				}
+			}
+
+			log.debug(builder.toString());
+		}
+
+	}
+
+	/**
+	 * Add cookies (that where set in the new request headers) in the response
+	 * 
+	 * @param response
+	 * @param request
+	 * @param headers
+	 */
+	private void addCookies(HttpServletResponse response, HttpServletRequest request, String[] headers) {
+		for (int i = 0; i < headers.length; i++) {
+			String currHeader = headers[i];
+			String headerValue = request.getHeader(currHeader);
+			if (headerValue != null) {
+				response.addCookie(new Cookie(currHeader, headerValue));
+			}
+		}
+	}
+
+	/**
+	 * Get mandatory headers (identificationHeaderFields) String array, and
+	 * checks that each header exists in the new request
+	 * 
+	 * @param request
+	 * @return boolean
+	 */
+	private boolean checkHeaders(HttpServletRequest request) {
+		String[] mandatoryHeaders = getMandatoryHeaders(request);
+
+		boolean allHeadersExist = true;
+		for (int i = 0; i < mandatoryHeaders.length; i++) {
+			String headerValue = request.getHeader(mandatoryHeaders[i]);
+			if (headerValue == null) {
+				allHeadersExist = false;
+				break;
+			}
+		}
+		return allHeadersExist;
+	}
+
+	/**
+	 * Get mandatory headers (identificationHeaderFields) from
+	 * configuration.yaml file and return String[]
+	 * 
+	 * @param request
+	 * @return String[]
+	 */
+	private String[] getMandatoryHeaders(HttpServletRequest request) {
+		Configuration configuration = getConfiguration(request);
+		List<List<String>> identificationHeaderFields = configuration.getIdentificationHeaderFields();
+		String[] mandatoryHeaders = new String[identificationHeaderFields.size()];
+		for (int i = 0; i < identificationHeaderFields.size(); i++) {
+			mandatoryHeaders[i] = identificationHeaderFields.get(i).get(0);
+		}
+		return mandatoryHeaders;
+	}
+
+	/**
+	 * Get optional headers (optionalHeaderFields) from configuration.yaml file
+	 * and return String[]
+	 * 
+	 * @param request
+	 * @return String[]
+	 */
+	private String[] getOptionalHeaders(HttpServletRequest request) {
+		Configuration configuration = getConfiguration(request);
+		List<List<String>> optionalHeaderFields = configuration.getOptionalHeaderFields();
+		String[] optionalHeaders = new String[optionalHeaderFields.size()];
+		for (int i = 0; i < optionalHeaderFields.size(); i++) {
+			optionalHeaders[i] = optionalHeaderFields.get(i).get(0);
+		}
+		return optionalHeaders;
+	}
+
+	/**
+	 * Return Configuration object to read from configuration.yaml
+	 * 
+	 * @param request
+	 * @return Configuration
+	 */
+	private Configuration getConfiguration(HttpServletRequest request) {
+		ConfigurationManager configManager = (ConfigurationManager) request.getSession().getServletContext().getAttribute(org.openecomp.sdc.common.api.Constants.CONFIGURATION_MANAGER_ATTR);
+		return configManager.getConfiguration();
+	}
+
+	private boolean setNewHeader(List<String> possibleOldHeaders, String newHeaderToSet, HttpServletRequest oldRequest, MutableHttpServletRequest newRequest) {
+		boolean newHeaderIsSet = false;
+		for (int i = 0; i < possibleOldHeaders.size() && !newHeaderIsSet; i++) {
+			String headerValue = oldRequest.getHeader(possibleOldHeaders.get(i));
+			if (headerValue != null) {
+				newRequest.putHeader(newHeaderToSet, headerValue);
+				newHeaderIsSet = true;
+			}
+		}
+		return newHeaderIsSet;
+	}
+
+}
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/SSLProxyServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/SSLProxyServlet.java
new file mode 100644
index 0000000..c3ba279
--- /dev/null
+++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/SSLProxyServlet.java
@@ -0,0 +1,108 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.fe.servlets;
+
+import java.util.Enumeration;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.api.Request;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.proxy.ProxyServlet;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.fe.config.Configuration;
+import org.openecomp.sdc.fe.config.ConfigurationManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class SSLProxyServlet extends ProxyServlet {
+
+	private static final long serialVersionUID = 1L;
+	private static Logger log = LoggerFactory.getLogger(SSLProxyServlet.class.getName());
+
+	public enum BE_PROTOCOL {
+		HTTP("http"), SSL("ssl");
+		private String protocolName;
+
+		public String getProtocolName() {
+			return protocolName;
+		}
+
+		BE_PROTOCOL(String protocolName) {
+			this.protocolName = protocolName;
+		}
+	};
+
+	@Override
+	public void customizeProxyRequest(Request proxyRequest, HttpServletRequest request) {
+		super.customizeProxyRequest(proxyRequest, request);
+		// Add Missing Headers to proxy request
+		@SuppressWarnings("unchecked")
+		Enumeration<String> headerNames = request.getHeaderNames();
+		while (headerNames.hasMoreElements()) {
+			String headerName = headerNames.nextElement();
+			if (!proxyRequest.getHeaders().containsKey(headerName)) {
+				String headerVal = request.getHeader(headerName);
+				log.debug("Adding missing header to request,  header name: {} , header value: {}", headerName,
+						headerVal);
+				proxyRequest.header(headerName, headerVal);
+			}
+		}
+		proxyRequest.getHeaders().remove(HttpHeader.HOST);
+
+	}
+
+	@Override
+	protected HttpClient createHttpClient() throws ServletException {
+		Configuration config = ((ConfigurationManager) getServletConfig().getServletContext()
+				.getAttribute(Constants.CONFIGURATION_MANAGER_ATTR)).getConfiguration();
+		boolean isSecureClient = !config.getBeProtocol().equals(BE_PROTOCOL.HTTP.getProtocolName());
+		HttpClient client = (isSecureClient) ? getSecureHttpClient() : super.createHttpClient();
+		setTimeout(600000);
+		client.setIdleTimeout(600000);
+		client.setStopTimeout(600000);
+
+		return client;
+	}
+
+	private HttpClient getSecureHttpClient() throws ServletException {
+		// Instantiate and configure the SslContextFactory
+		SslContextFactory sslContextFactory = new SslContextFactory(true);
+
+		// Instantiate HttpClient with the SslContextFactory
+		HttpClient httpClient = new HttpClient(sslContextFactory);
+
+		// Configure HttpClient, for example:
+		httpClient.setFollowRedirects(false);
+
+		// Start HttpClient
+		try {
+			httpClient.start();
+
+			return httpClient;
+		} catch (Exception x) {
+			throw new ServletException(x);
+		}
+	}
+}
diff --git a/catalog-fe/src/main/resources/application-context.xml b/catalog-fe/src/main/resources/application-context.xml
new file mode 100644
index 0000000..a5ec926
--- /dev/null
+++ b/catalog-fe/src/main/resources/application-context.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+  xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
+  xsi:schemaLocation="
+        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
+        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
+        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
+
+  <context:annotation-config />
+  <aop:aspectj-autoproxy proxy-target-class="true" />
+
+  <context:component-scan
+    base-package="org.openecomp.sdnc.catalog.backend.dao,	   
+		org.elasticsearch.mapping,		
+		org.openecomp.sdnc.catalog.backend.artifacts">
+ 
+  </context:component-scan>
+
+ 
+
+  <!-- <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> -->
+</beans>
diff --git a/catalog-fe/src/main/resources/config/configuration.yaml b/catalog-fe/src/main/resources/config/configuration.yaml
new file mode 100644
index 0000000..6be93b3
--- /dev/null
+++ b/catalog-fe/src/main/resources/config/configuration.yaml
@@ -0,0 +1,78 @@
+# Needed for logging purposes. To be populated by DevOps - currently dummy
+feFqdn: asdcFe.att.com
+
+# catalog backend hostname
+beHost: localhost
+
+# catalog backend http port
+beHttpPort: 8080
+
+# catalog backend http context
+beContext: /sdc2/rest/v1/catalog/upload/resources
+
+# catalog backend protocol
+beProtocol: http
+
+# catalog backend ssl port
+beSslPort: 8443
+
+# threadpool size for handling requests
+threadpoolSize: 50 
+
+# request processing timeout (seconds)
+requestTimeout: 10
+
+healthCheckSocketTimeoutInMs: 5000
+
+healthCheckIntervalInSeconds: 5
+
+identificationHeaderFields: 
+   -
+        - &HTTP_IV_USER HTTP_IV_USER
+        - &iv-user iv-user
+   -
+        - &USER_ID USER_ID
+        - &user-id user-id
+   -
+        - &HTTP_CSP_ATTUID HTTP_CSP_ATTUID
+        - &csp-attuid csp-attuid
+   -
+        - &HTTP_CSP_WSTYPE HTTP_CSP_WSTYPE 
+        - &csp-wstype csp-wstype
+
+optionalHeaderFields: 
+   -
+        - &HTTP_CSP_FIRSTNAME HTTP_CSP_FIRSTNAME
+        - &csp-firstname csp-firstname
+   -
+        - &HTTP_CSP_LASTNAME HTTP_CSP_LASTNAME
+        - &csp-lastname csp-lastname
+   -
+        - &HTTP_IV_REMOTE_ADDRESS HTTP_IV_REMOTE_ADDRESS
+        - &iv-remote-address iv-remote-address
+   -
+        - &HTTP_CSP_EMAIL HTTP_CSP_EMAIL
+        - &csp-email csp-email
+
+version: 1.0
+released: 2012-11-30
+
+# Connection parameters
+connection:
+    url: jdbc:mysql://localhost:3306/db
+    poolSize: 17
+
+# Protocols
+protocols:
+   - http
+   - https
+
+
+systemMonitoring:
+    enabled: false
+    isProxy: true
+    probeIntervalInSeconds: 15
+
+kibanaHost: localhost
+kibanaPort: 5601
+kibanaProtocol: http
diff --git a/catalog-fe/src/main/resources/config/ecomp-error-configuration.yaml b/catalog-fe/src/main/resources/config/ecomp-error-configuration.yaml
new file mode 100644
index 0000000..8982b24
--- /dev/null
+++ b/catalog-fe/src/main/resources/config/ecomp-error-configuration.yaml
@@ -0,0 +1,48 @@
+###########################################
+# Note the conventions of the field values:
+# type can be one of: CONFIG_ERROR, SYSTEM_ERROR, DATA_ERROR, CONNECTION_PROBLEM
+# severity can be one of: WARN, ERROR, FATAL
+# alarmSeverity can be one of: CRITICAL,MAJOR,MINOR,INFORMATIONAL,NONE
+# code is a unique integer in range of 3003-9999 (3000-3002 are occupied for internal usage)
+# The above enumeration values are out-of-the-box and can be changed in code. 
+# In case of config and code mismatch, the appropriate error will be printed to log
+#
+# Range of FE codes - 8000-9999
+
+
+errors:
+    FeHealthCheckConnectionError: {
+        type: CONNECTION_PROBLEM,
+        code: ASDC_8000,
+        severity: ERROR,
+        description: "Connection error during FE Health Check",
+        alarmSeverity: CRITICAL
+    }
+    FeHttpLoggingError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_8001,
+        severity: ERROR,
+        description: "Error when logging FE HTTP request/response",
+        alarmSeverity: MINOR
+    }
+    FePortalServletError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_8002,
+        severity: ERROR,
+        description: "Error when trying to access FE Portal page",
+        alarmSeverity: MAJOR
+    }
+    FeHealthCheckGeneralError: {
+        type: SYSTEM_ERROR,
+        code: ASDC_8004,
+        severity: ERROR,
+        description: "General error during FE Health Check",
+        alarmSeverity: CRITICAL
+    }
+    FeHealthCheckRecovery: {
+        type: RECOVERY,
+        code: ASDC_8005,
+        severity: INFO,
+        description: "BE Health Check Recovery",
+        alarmSeverity: INFORMATIONAL
+    }    
\ No newline at end of file
diff --git a/catalog-fe/src/main/resources/config/logback.xml b/catalog-fe/src/main/resources/config/logback.xml
new file mode 100644
index 0000000..fd2e13c
--- /dev/null
+++ b/catalog-fe/src/main/resources/config/logback.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="5 seconds">
+
+	<property scope="system" name="ECOMP-component-name" value="ASDC" />
+	<property scope="system" name="ECOMP-subcomponent-name" value="ASDC-FE" />
+	<property scope="context" name="enable-all-log" value="false" />
+	<property file="${config.home}/catalog-fe/configuration.yaml" />
+	<!-- value used by pattern field list (| - is inter-field separator, || - unavailable or not applicable field value) (m - mandatory, o- optional)-->
+	<!--timestamp(m)| requestID(m)| serviceInstanceID(o)| threadID(m)| physicalServerName(o)| serviceName(m)| userID(m)| logLevel(m)| severity(o)| serverIpAddress(m)| serverName(m)| clientIpAddress(o)| className(m)| timer(o)| detailedMessage(o)-->
+	<property name="default-log-pattern"
+		value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{uuid}|%X{serviceInstanceID}|%thread||${ECOMP-subcomponent-name}|%X{userId}|%level|%X{alarmSeverity}|%X{localAddr}|${feFqdn}|%X{remoteAddr}|%logger{35}|%X{timer}|ActivityType=&lt;%M&gt;, Desc=&lt;%msg&gt;%n" />
+
+	<!-- All log -->
+	<if condition='property("enable-all-log").equalsIgnoreCase("true")'>
+		<then>
+			<appender name="ALL_ROLLING"
+				class="ch.qos.logback.core.rolling.RollingFileAppender">
+				<file>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/all.log
+				</file>
+
+				<rollingPolicy
+					class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+					<fileNamePattern>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/all.log.%i
+					</fileNamePattern>
+					<minIndex>1</minIndex>
+					<maxIndex>10</maxIndex>
+				</rollingPolicy>
+
+				<triggeringPolicy
+					class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+					<maxFileSize>20MB</maxFileSize>
+				</triggeringPolicy>
+				<encoder>
+					<pattern>${default-log-pattern}</pattern>
+				</encoder>
+			</appender>
+			
+		  <appender name="ASYNC_ERROR" class="ch.qos.logback.classic.AsyncAppender">
+	      <appender-ref ref="ALL_ROLLING" />
+	</appender>
+	
+		</then>
+	</if>
+
+	<!-- Error log -->
+	<appender name="ERROR_ROLLING"
+		class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/error.log
+		</file>
+
+		<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
+		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+			<level>INFO</level>
+		</filter>
+
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<fileNamePattern>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/error.log.%i
+			</fileNamePattern>
+			<minIndex>1</minIndex>
+			<maxIndex>10</maxIndex>
+		</rollingPolicy>
+
+		<triggeringPolicy
+			class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<maxFileSize>20MB</maxFileSize>
+		</triggeringPolicy>
+		<encoder>
+			<pattern>${default-log-pattern}</pattern>
+		</encoder>
+	</appender>
+
+	<!-- Debug log -->
+	<appender name="DEBUG_ROLLING"
+		class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/debug.log
+		</file>
+
+		<!-- accept DEBUG and TRACE level -->
+		<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
+			<evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
+				<expression>
+					e.level.toInt() &lt;= DEBUG.toInt()
+				</expression>
+			</evaluator>
+			<OnMismatch>DENY</OnMismatch>
+			<OnMatch>NEUTRAL</OnMatch>
+		</filter>
+
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<fileNamePattern>${log.home}/${ECOMP-component-name}/${ECOMP-subcomponent-name}/debug.log.%i
+			</fileNamePattern>
+			<minIndex>1</minIndex>
+			<maxIndex>10</maxIndex>
+		</rollingPolicy>
+
+		<triggeringPolicy
+			class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<maxFileSize>20MB</maxFileSize>
+		</triggeringPolicy>
+		<encoder>
+			<pattern>${default-log-pattern}</pattern>
+		</encoder>
+	</appender>
+	
+		<!-- Asynchronicity Configurations -->
+	<appender name="ASYNC_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
+	      <appender-ref ref="DEBUG_ROLLING" />
+	</appender>
+
+	<appender name="ASYNC_ERROR" class="ch.qos.logback.classic.AsyncAppender">
+	      <appender-ref ref="ERROR_ROLLING" />
+	</appender>
+
+	<root level="INFO">
+		<appender-ref ref="ASYNC_ERROR" />
+		<appender-ref ref="ASYNC_DEBUG" />
+		<if condition='property("enable-all-log").equalsIgnoreCase("true")'>
+			<then>
+				<appender-ref ref="ALL_ROLLING" />
+			</then>
+		</if>
+	</root>
+
+	<logger name="org.openecomp.sdc" level="INFO" />
+</configuration>
\ No newline at end of file
diff --git a/catalog-fe/src/main/resources/config/rest-configuration-info.yaml b/catalog-fe/src/main/resources/config/rest-configuration-info.yaml
new file mode 100644
index 0000000..083adcf
--- /dev/null
+++ b/catalog-fe/src/main/resources/config/rest-configuration-info.yaml
@@ -0,0 +1,12 @@
+# rest read timeout - means no timeout
+readTimeoutInSec: 0
+
+# whether to ignore certificate
+ignoreCertificate: false
+
+# the connection pool size
+connectionPoolSize: 10 
+
+# create connection timeout
+connectTimeoutInSec: 10
+
diff --git a/catalog-fe/src/main/resources/jetty-ipaccess.xml b/catalog-fe/src/main/resources/jetty-ipaccess.xml
new file mode 100644
index 0000000..97db551
--- /dev/null
+++ b/catalog-fe/src/main/resources/jetty-ipaccess.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+
+<!-- =============================================================== -->
+<!-- Mixin the Statistics Handler                                    -->
+<!-- =============================================================== -->
+
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+    <Get id="oldhandler" name="handler"/>
+
+    <Set name="handler">
+     <New id="IPAccessHandler" class="org.eclipse.jetty.server.handler.IPAccessHandler">
+      <Set name="handler"><Ref refid="oldhandler"/></Set>
+      <Set name="white">
+        <Array type="String">
+	      <Item>0-255.0-255.0-255.0-255</Item>
+	</Array>
+      </Set>
+      <Set name="black">
+        <Array type="String">
+	      <Item>127.0.0.1/blacklisted</Item>
+	      <Item>127.0.0.2/black.html</Item>
+	    </Array>
+      </Set>
+      <Set name="whiteListByPath">false</Set>
+     </New>
+    </Set>
+</Configure>
diff --git a/catalog-fe/src/main/resources/portal.properties b/catalog-fe/src/main/resources/portal.properties
new file mode 100644
index 0000000..880c4fe
--- /dev/null
+++ b/catalog-fe/src/main/resources/portal.properties
@@ -0,0 +1,28 @@
+# Portal REST URL, ends "/auxapi"
+ecomp_rest_url = https://portal.api.simpledemo.openecomp.org/ecompportal/auxapi
+ 
+# Java implementation of interface
+portal.api.impl.class = org.openecomp.sdc.be.ecomp.EcompIntImpl
+
+# CSP-SSO URL
+ecomp_redirect_url = http://portal.api.simpledemo.openecomp.org:8989/ECOMPPORTAL/login.htm
+ 
+# Cookie set by CSP-SSO
+csp_cookie_name = attESSec
+# CSP setting, most use PROD; DEV also recognized
+csp_gate_keeper_prod_key = PROD
+
+# Comma-separated list of UEB server names
+ueb_url_list = 
+# UEB topic where Portal listens
+ecomp_portal_inbox_name = ECOMP-PORTAL-INBOX-TEST
+# UEB key generated while on-boarding
+ueb_app_key = app_key_here
+# UEB secret generated while on-boarding
+ueb_app_secret = app_secret_here
+# UEB topic where App listens
+ueb_app_mailbox_name = app_topic_name_here
+# Consumer group name; most Apps should use {UUID}
+ueb_app_consumer_group_name = {UUID}
+
+decryption_key = AGLDdG4D04BKm2IxIWEr8o==
\ No newline at end of file
diff --git a/catalog-fe/src/main/resources/scripts/install.sh b/catalog-fe/src/main/resources/scripts/install.sh
new file mode 100644
index 0000000..bed9411
--- /dev/null
+++ b/catalog-fe/src/main/resources/scripts/install.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+export JETTY_BASE=/home/jetty/base
+
+COMP=$1
+
+function usage() {
+	echo "$0 <fe | be>"
+}
+
+function exitOnError() {
+	if [ $1 -ne 0 ]
+	then
+		echo "Failed running task $2"
+		exit 2
+	fi
+}
+
+if [ $# -ne 1 ]
+then
+	usage
+	exit 1
+
+fi
+
+/opt/app/sdc/catalog-${COMP}/scripts/installJettyBase.sh
+exitOnError $? "installJettyBase"
+
+cd ${JETTY_BASE}
+exitOnError $? "move_to_base_dir"
+
+mkdir -p scripts
+
+cp /opt/app/sdc/catalog-${COMP}/scripts/* scripts
+exitOnError $? "copy_scripts_from_rpm"
+
+cp /opt/app/sdc/catalog-${COMP}/ext/jetty-ipaccess.xml etc
+exitOnError $? "override_jetty-ipaccess_module."
+
+cp /opt/app/sdc/catalog-${COMP}/catalog-${COMP}-*.war webapps
+exitOnError $? "copy_war"
+
+cp /opt/app/sdc/catalog-${COMP}/scripts/startJetty.sh .
+exitOnError $? "copy_startJetty"
+
+cp /opt/app/sdc/catalog-${COMP}/scripts/jvm.properties .
+exitOnError $? "copy_jvm_properties"
+
+./scripts/updateSslParams.sh ${JETTY_BASE}
+exitOnError $? "updateSslParams_script"
+	 
+#ONLY FOR BE	 
+#cp /opt/app/sdc/config/catalog-${COMP}/elasticsearch.yml config
+#exitOnError $? "copy_elasticsearch_yaml_to_config"
+
+mkdir -p ${JETTY_BASE}/config/catalog-${COMP}
+cp -r /opt/app/sdc/config/catalog-${COMP}/*.xml ${JETTY_BASE}/config/catalog-${COMP}
+exitOnError $? "copy_xml_files_to_config"
+
+cp -r /opt/app/sdc/config/catalog-${COMP}/*.yaml ${JETTY_BASE}/config/catalog-${COMP}
+exitOnError $? "copy_yaml_files_to_config"
diff --git a/catalog-fe/src/main/resources/scripts/installJettyBase.sh b/catalog-fe/src/main/resources/scripts/installJettyBase.sh
new file mode 100644
index 0000000..0f8ac7e
--- /dev/null
+++ b/catalog-fe/src/main/resources/scripts/installJettyBase.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+export JETTY_HOME=/home/jetty/jetty-distribution-9.2.7.v20150116
+export JETTY_BASE=/home/jetty/base
+
+mkdir -p ${JETTY_BASE}
+mkdir -p ${JETTY_BASE}/config
+
+cd ${JETTY_BASE}
+
+java -jar $JETTY_HOME/start.jar --add-to-start=deploy
+java -jar $JETTY_HOME/start.jar --add-to-startd=http,https,logging,ipaccess
+
+cd -
diff --git a/catalog-fe/src/main/resources/scripts/jvm.properties b/catalog-fe/src/main/resources/scripts/jvm.properties
new file mode 100644
index 0000000..52b5134
--- /dev/null
+++ b/catalog-fe/src/main/resources/scripts/jvm.properties
@@ -0,0 +1,5 @@
+-XX:MaxPermSize=256m
+-Xmx1500m
+-Dconfig.home=${JETTY_BASE}/config
+-Dlog.home=${JETTY_BASE}/logs
+-Dlogback.configurationFile=${JETTY_BASE}/config/catalog-fe/logback.xml
\ No newline at end of file
diff --git a/catalog-fe/src/main/resources/scripts/startJetty.sh b/catalog-fe/src/main/resources/scripts/startJetty.sh
new file mode 100644
index 0000000..074d91d
--- /dev/null
+++ b/catalog-fe/src/main/resources/scripts/startJetty.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+export JETTY_HOME=/home/jetty/jetty-distribution-9.2.7.v20150116
+export JETTY_BASE=/home/jetty/base
+
+eval "jvmargs=`sed '/^#/d'  jvm.properties | paste -s -d"#"`"
+jvmargs=`echo $jvmargs | sed 's/#/ /g'`
+echo $jvmargs
+
+java  -jar $JETTY_HOME/start.jar $jvmargs $@
\ No newline at end of file
diff --git a/catalog-fe/src/main/resources/scripts/updateSslParams.sh b/catalog-fe/src/main/resources/scripts/updateSslParams.sh
new file mode 100644
index 0000000..d9e955e
--- /dev/null
+++ b/catalog-fe/src/main/resources/scripts/updateSslParams.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+function usage() {
+        echo "$0 <working dir>"
+}
+
+function exitOnError() {
+        if [ $1 -ne 0 ]
+        then
+                echo "Failed running task $2"
+                exit 2
+        fi
+}
+
+if [ $# -ne 1 ]
+then
+        usage
+	if [ ${#OLDPWD} -ne 0 ]
+	then
+		cd -
+	fi
+        exit 1
+
+fi
+
+WORK_DIR=$1
+
+cd $WORK_DIR
+
+sed -i 's/\(^https.port=\)\(.*\)/\1443/g' start.d/https.ini
+exitOnError $? "update_port_in_https_ini"
+
+cd -
diff --git a/catalog-fe/src/main/webapp/META-INF/MANIFEST.MF b/catalog-fe/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c47899c
--- /dev/null
+++ b/catalog-fe/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Implementation-Title: catalog-fe
+Implementation-Version: APPLICATION_VERSION
+Implementation-Vendor-Id: org.openecomp.sdc
+Built-By: esofer
+Build-Jdk: 1.7.0_45
+Created-By: Apache Maven 3.2.1
+Archiver-Version: Plexus Archiver
+
diff --git a/catalog-fe/src/main/webapp/WEB-INF/jetty-web.xml b/catalog-fe/src/main/webapp/WEB-INF/jetty-web.xml
new file mode 100644
index 0000000..adb07b0
--- /dev/null
+++ b/catalog-fe/src/main/webapp/WEB-INF/jetty-web.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"  encoding="UTF-8"?>
+<!DOCTYPE Configure PUBLIC 
+    "-//Mort Bay Consulting//DTD Configure//EN" 
+    "http://www.eclipse.org/jetty/configure_9_0.dtd">
+ 
+<Configure class="org.eclipse.jetty.webapp.WebAppContext">
+     <Set name="contextPath">/sdc1</Set>
+</Configure>
diff --git a/catalog-fe/src/main/webapp/WEB-INF/web.xml b/catalog-fe/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..f6d709e
--- /dev/null
+++ b/catalog-fe/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+	version="3.0">
+
+	<servlet>
+		<servlet-name>jersey</servlet-name>
+		<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+		<init-param>
+			<param-name>jersey.config.server.provider.packages</param-name>
+			<param-value>org.openecomp.sdc.fe.servlets</param-value>
+		</init-param>
+
+		<init-param>
+			<param-name>jersey.config.server.provider.classnames</param-name>
+			<param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
+		</init-param>
+		<init-param>
+			<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
+			<param-value>true</param-value>
+		</init-param>
+		<load-on-startup>1</load-on-startup>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>jersey</servlet-name>
+		<url-pattern>/rest/*</url-pattern>
+	</servlet-mapping>
+
+	<servlet>
+		<servlet-name>ViewStatusMessages</servlet-name>
+		<servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class>
+        <async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ViewStatusMessages</servlet-name>
+		<url-pattern>/lbClassicStatus</url-pattern>
+	</servlet-mapping>
+
+	<!-- Proxy Server Only used for tests to simulate webSeal ## Start ## -->
+<!--   	<servlet>
+		<servlet-name>ProxyAdmin1</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletAdmin1</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyAdmin1</servlet-name>
+		<url-pattern>/proxy-admin1</url-pattern>
+	</servlet-mapping>
+		<servlet>
+		<servlet-name>ProxyAdmin2</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletAdmin2</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyAdmin2</servlet-name>
+		<url-pattern>/proxy-admin2</url-pattern>
+	</servlet-mapping>
+		<servlet>
+		<servlet-name>ProxyAdmin3</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletAdmin3</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyAdmin3</servlet-name>
+		<url-pattern>/proxy-admin3</url-pattern>
+	</servlet-mapping>
+
+   	<servlet>
+		<servlet-name>ProxyDesigner1</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletDesigner1</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyDesigner1</servlet-name>
+		<url-pattern>/proxy-designer1</url-pattern>
+	</servlet-mapping>
+		<servlet>
+		<servlet-name>ProxyDesigner2</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletDesigner2</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyDesigner2</servlet-name>
+		<url-pattern>/proxy-designer2</url-pattern>
+	</servlet-mapping>
+	<servlet>
+		<servlet-name>ProxyDesigner3</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletDesigner3</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyDesigner3</servlet-name>
+		<url-pattern>/proxy-designer3</url-pattern>
+	</servlet-mapping>
+
+	<servlet>
+		<servlet-name>ProxyTester1</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletTester1</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyTester1</servlet-name>
+		<url-pattern>/proxy-tester1</url-pattern>
+	</servlet-mapping>
+		<servlet>
+		<servlet-name>ProxyTester2</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletTester2</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyTester2</servlet-name>
+		<url-pattern>/proxy-tester2</url-pattern>
+	</servlet-mapping>
+
+	<servlet>
+		<servlet-name>ProxyTester3</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletTester3</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyTester3</servlet-name>
+		<url-pattern>/proxy-tester3</url-pattern>
+	</servlet-mapping>
+
+	<servlet-mapping>
+		<servlet-name>ProxyGovernor1</servlet-name>
+		<url-pattern>/proxy-governor1</url-pattern>
+	</servlet-mapping>
+
+	<servlet>
+		<servlet-name>ProxyGovernor1</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletGovernor1</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyOps1</servlet-name>
+		<url-pattern>/proxy-ops1</url-pattern>
+	</servlet-mapping>
+
+	<servlet>
+		<servlet-name>ProxyOps1</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletOps1</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>ProxyPs1</servlet-name>
+		<url-pattern>/proxy-ps1</url-pattern>
+	</servlet-mapping>
+
+	<servlet>
+		<servlet-name>ProxyPs1</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletProductStrategist1</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+	<servlet-mapping>
+		<servlet-name>ProxyPm1</servlet-name>
+		<url-pattern>/proxy-pm1</url-pattern>
+	</servlet-mapping>
+
+	<servlet>
+		<servlet-name>ProxyPm1</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.websealmock.WebSealSimulatorServletProductManger1</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet> -->
+	
+	<!-- Proxy Server Only used for tests to simulate webSeal ## End ## -->
+
+	<!-- Fe Proxy Servlet -->
+	<servlet>
+		<servlet-name>FeProxy</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.FeProxyServlet</servlet-class>
+
+		<load-on-startup>1</load-on-startup>
+		<async-supported>true</async-supported>
+
+
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>FeProxy</servlet-name>
+		<url-pattern>/feProxy/*</url-pattern>
+	</servlet-mapping>
+
+	<servlet>
+		<servlet-name>Portal</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.PortalServlet</servlet-class>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>Portal</servlet-name>
+		<url-pattern>/portal</url-pattern>
+	</servlet-mapping>
+	
+	<!-- Kibana proxy  -->
+	<servlet>
+		<servlet-name>KibanaProxy</servlet-name>
+		<servlet-class>org.openecomp.sdc.fe.servlets.KibanaServlet</servlet-class>
+		<load-on-startup>1</load-on-startup>
+		<async-supported>true</async-supported>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>KibanaProxy</servlet-name>
+		<url-pattern>/kibanaProxy/*</url-pattern>
+	</servlet-mapping>
+
+
+
+	<filter>
+		<filter-name>cross-origin-att</filter-name>
+		<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
+		<async-supported>true</async-supported>
+		<init-param>
+			<param-name>allowedOrigins</param-name>
+			<param-value>*</param-value>
+		</init-param>
+		<init-param>
+			<param-name>allowedMethods</param-name>
+			<param-value>GET,POST,OPTIONS,DELETE,PUT,HEAD</param-value>
+		</init-param>
+		<init-param>
+			<param-name>allowedHeaders</param-name>
+			<param-value>HTTP_CSP_FIRSTNAME, HTTP_CSP_LASTNAME, USER_ID,
+				HTTP_CSP_EMAIL, X-ECOMP-RequestID, origin, content-type, accept, authorization, Content-MD5,X-ECOMP-ServiceID</param-value>
+		</init-param>
+		<init-param>
+			<param-name>allowCredential</param-name>
+			<param-value>true</param-value>
+		</init-param>
+	</filter>
+	<filter-mapping>
+		<filter-name>cross-origin-att</filter-name>
+		<url-pattern>/*</url-pattern>
+	</filter-mapping>
+
+<!--  
+	<filter>
+		<filter-name>GzipFilter</filter-name>
+		<filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class>
+        <async-supported>true</async-supported>
+		<init-param>
+			<param-name></param-name>
+			<param-value>text/html,text/plain,text/css,application/javascript,application/json</param-value>
+		</init-param>
+		<init-param>
+			<param-name>methods</param-name>
+			<param-value>get,post</param-value>
+		</init-param>
+	</filter>
+
+
+	<filter-mapping>
+		<filter-name>GzipFilter</filter-name>
+		<url-pattern>/sdc2/*</url-pattern>
+	</filter-mapping>
+-->
+
+	<listener>
+		<listener-class>org.openecomp.sdc.fe.listen.FEAppContextListener</listener-class>
+	</listener>
+
+	<welcome-file-list>
+		<welcome-file>index.html</welcome-file>
+	</welcome-file-list>
+</web-app>