diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/AllTests.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/AllTests.java
index 44aa635..389eee8 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/AllTests.java
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/AllTests.java
@@ -13,6 +13,7 @@
  *******************************************************************************/
 package org.eclipse.equinox.http.servlet.testbase;
 
+import org.eclipse.equinox.http.servlet.tests.ContextHelperCustomizerTests;
 import org.eclipse.equinox.http.servlet.tests.AuthenticationTest;
 import org.eclipse.equinox.http.servlet.tests.DispatchingTest;
 import org.eclipse.equinox.http.servlet.tests.PreprocessorTestCase;
@@ -93,6 +94,7 @@
 	TestHttpServiceAndErrorPage.class,
 	TestHttpServiceAndNamedServlet.class,
 	TestUpload.class,
+	ContextHelperCustomizerTests.class
 })
 public class AllTests {
 	// see @SuiteClasses
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/BaseTest.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/BaseTest.java
index bb9800d..6b9bc00 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/BaseTest.java
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/testbase/BaseTest.java
@@ -694,10 +694,10 @@
 
 	}
 
-	protected static class TestContextPathAdaptor extends ContextPathCustomizer {
-		private final String defaultFilter;
-		private final String contextPrefix;
-		private final String testName;
+	protected class TestContextPathAdaptor extends ContextPathCustomizer {
+		protected final String defaultFilter;
+		protected final String contextPrefix;
+		protected final String testName;
 
 		/**
 		 * @param defaultFilter
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ContextHelperCustomizerTests.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ContextHelperCustomizerTests.java
new file mode 100644
index 0000000..4413e6e
--- /dev/null
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ContextHelperCustomizerTests.java
@@ -0,0 +1,322 @@
+/*******************************************************************************
+ * Copyright (c) 2019 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ *******************************************************************************/
+package org.eclipse.equinox.http.servlet.tests;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextListener;
+
+import org.eclipse.equinox.http.servlet.context.ContextPathCustomizer;
+import org.eclipse.equinox.http.servlet.testbase.BaseTest;
+import org.eclipse.equinox.http.servlet.tests.util.BaseServlet;
+import org.eclipse.equinox.http.servlet.tests.util.MockSCL;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.hooks.service.FindHook;
+import org.osgi.service.http.HttpContext;
+import org.osgi.service.http.HttpService;
+import org.osgi.service.http.context.ServletContextHelper;
+import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
+
+public class ContextHelperCustomizerTests extends BaseTest {
+	@Rule
+	public TestName testName = new TestName();
+	private ServiceReference<HttpService> httpServiceReference;
+	private HttpService httpService;
+	private BundleContext context;
+	
+	@Before
+	public void begin() throws Exception {
+		httpServiceReference = getBundleContext().getServiceReference(HttpService.class);	
+		context = httpServiceReference.getBundle().getBundleContext();
+		httpService = context.getService(httpServiceReference);
+	}
+	
+	@After
+	public void end() throws Exception {
+		context.ungetService(httpServiceReference);
+	}
+
+	@Test
+	public void testCreateDefaultHttpContextCreatesNewServletContextHelper() throws Exception {
+		HttpContext context1 = httpService.createDefaultHttpContext();
+		HttpContext context2 = httpService.createDefaultHttpContext();
+		Assert.assertNotEquals(context1, context2);	
+	}
+	
+	@Test
+	public void testServletContextHelpersNotHiddenWhenRegisteredUsingConsumingContext() throws Exception {
+		ServiceRegistration<ServletContextHelper> helperReg = null;
+		ServiceRegistration<FindHook> findHookReg = null;
+		
+		try {
+			Dictionary<String, Object> properties = new Hashtable<String, Object>();
+			properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "context1");
+			properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/context1");
+			//register a ServletContextHelper using the consuming bundle context "org.eclipse.equinox.http.servlet"
+			helperReg = context.registerService(ServletContextHelper.class, new ServletContextHelper() {}, properties);
+
+			FindHook findHook = new FindHook() {
+
+				@Override
+				public void find(
+						BundleContext bundleContext, String name, String filter,
+						boolean allServices, Collection<ServiceReference<?>> references) {
+
+					if (bundleContext != context) {
+						return;
+					}
+
+					// don't show ServletContextHelper
+					for (Iterator<ServiceReference<?>> iterator = references.iterator(); iterator.hasNext();) {
+						ServiceReference<?> sr = iterator.next();
+
+						if ("context1".equals(sr.getProperty("osgi.http.whiteboard.context.name"))) {
+							iterator.remove();
+						}
+					}
+				}
+
+			};
+
+			findHookReg = context.registerService(FindHook.class, findHook, null);
+			AtomicReference<ServletContext> sc1 = new AtomicReference<ServletContext>();
+
+			properties = new Hashtable<String, Object>();
+			properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_LISTENER, "true");
+			properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(osgi.http.whiteboard.context.name=context1)");
+			context.registerService(ServletContextListener.class, new MockSCL(sc1), properties);
+
+			//ServletContextHelpers registered using the consuming context should not be hidden
+			assertNotNull(sc1.get());
+		} finally {
+			if (helperReg != null) {
+				helperReg.unregister();
+			}
+			if (findHookReg != null) {
+				findHookReg.unregister();
+			}	
+		}
+		
+	}
+	
+	@Test
+	public void testWBServletContextPathCustomizerContextPrefix() throws Exception {
+		ServiceRegistration<ContextPathCustomizer> pathAdaptorReg = null;
+		ServiceRegistration<ServletContextHelper> helperReg = null;
+		ServiceRegistration<Servlet> servlet = null;
+		ServiceRegistration<FindHook> findHookReg = null;
+		
+		try {
+			Dictionary<String, String> helperProps = new Hashtable<String, String>();
+			helperProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "testContext" + testName.getMethodName());
+			helperProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/helperContext");
+			helperProps.put(TEST_PATH_CUSTOMIZER_NAME, testName.getMethodName());
+			helperReg = context.registerService(ServletContextHelper.class, new TestServletContextHelperFactory(), helperProps);
+
+			//Pass the context path prefix paramater
+			ContextPathCustomizer pathAdaptor = new TestContextPathAdaptor(null, "testPrefix", testName.getMethodName());
+			pathAdaptorReg = context.registerService(ContextPathCustomizer.class, pathAdaptor, null);
+			
+			FindHook findHook = new FindHook() {
+
+				@Override
+				public void find(
+						BundleContext bundleContext, String name, String filter,
+						boolean allServices, Collection<ServiceReference<?>> references) {
+
+					if (bundleContext != context) {
+						return;
+					}
+
+					// don't show ServletContextHelper
+					for (Iterator<ServiceReference<?>> iterator = references.iterator(); iterator.hasNext();) {
+						ServiceReference<?> sr = iterator.next();
+						if (("testContext" + testName.getMethodName()).equals(sr.getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME))) {
+							iterator.remove();
+						}
+					}
+				}
+
+			};
+
+			findHookReg = context.registerService(FindHook.class, findHook, null);
+						
+			//Register a servlet service with a matching context helper
+			BaseServlet baseServlet = new BaseServlet("content");
+			Dictionary<String, Object> serviceProps = new Hashtable<String, Object>();		
+			serviceProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/servlet");
+			serviceProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=" + "testContext" + testName.getMethodName() + ")");
+			servlet = context.registerService(Servlet.class, baseServlet, serviceProps);
+		
+			String actual = requestAdvisor.request("testPrefix/helperContext/servlet");
+			Assert.assertEquals("content", actual);
+		} finally {
+			if (helperReg != null) {
+				helperReg.unregister();
+			}
+			if (pathAdaptorReg != null) {
+				pathAdaptorReg.unregister();
+			}
+			if (servlet != null) {
+				servlet.unregister();
+			}
+			if (findHookReg != null) {
+				findHookReg.unregister();
+			}		
+		}	
+	}
+	
+	@Test
+	public void testWBServletContextPathCustomizerDefaultFilter() throws Exception {
+		ServiceRegistration<ContextPathCustomizer> pathAdaptorReg = null;
+		ServiceRegistration<ServletContextHelper> helperReg = null;
+		ServiceRegistration<Servlet> servlet = null;
+		ServiceRegistration<FindHook> findHookReg = null;
+		
+		try {
+			Dictionary<String, String> helperProps = new Hashtable<String, String>();
+			helperProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "testContext" + testName.getMethodName());
+			helperProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/helperContext");
+			helperProps.put(TEST_PATH_CUSTOMIZER_NAME, testName.getMethodName());
+			helperReg = context.registerService(ServletContextHelper.class, new TestServletContextHelperFactory(), helperProps);
+
+			//Pass the filter parameter
+			ContextPathCustomizer pathAdaptor = new TestContextPathAdaptor("(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=" + "testContext" + testName.getMethodName() + ")", null,  testName.getMethodName());
+			pathAdaptorReg = context.registerService(ContextPathCustomizer.class, pathAdaptor, null);
+			
+			FindHook findHook = new FindHook() {
+
+				@Override
+				public void find(
+						BundleContext bundleContext, String name, String filter,
+						boolean allServices, Collection<ServiceReference<?>> references) {
+
+					if (bundleContext != context) {
+						return;
+					}
+
+					// don't show ServletContextHelper
+					for (Iterator<ServiceReference<?>> iterator = references.iterator(); iterator.hasNext();) {
+						ServiceReference<?> sr = iterator.next();
+						if (("testContext" + testName.getMethodName()).equals(sr.getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME))) {
+							iterator.remove();
+						}
+					}
+				}
+
+			};
+
+			findHookReg = context.registerService(FindHook.class, findHook, null);
+						
+			//Register a servlet service with a matching context helper
+			BaseServlet baseServlet = new BaseServlet("content");
+			Dictionary<String, Object> serviceProps = new Hashtable<String, Object>();		
+			serviceProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/servlet");
+			//Filter property
+			serviceProps.put("servlet.init." + TEST_PATH_CUSTOMIZER_NAME, testName.getMethodName());
+			servlet = context.registerService(Servlet.class, baseServlet, serviceProps);
+		
+			String actual = requestAdvisor.request("helperContext/servlet");
+			Assert.assertEquals("content", actual);
+		} finally {
+			if (helperReg != null) {
+				helperReg.unregister();
+			}
+			if (pathAdaptorReg != null) {
+				pathAdaptorReg.unregister();
+			}
+			if (servlet != null) {
+				servlet.unregister();
+			}
+			if (findHookReg != null) {
+				findHookReg.unregister();
+			}		
+		}	
+	}
+	
+	@Test
+	public void testLegacyServletContextPathCustomizerContextPrefix() throws Exception {
+		ServiceRegistration<ContextPathCustomizer> pathAdaptorReg = null;
+		ServiceRegistration<FindHook> findHookReg = null;
+		
+		try {
+			//Pass the context path prefix paramater
+			ContextPathCustomizer pathAdaptor = new TestContextPathAdaptor(null, "testPrefix", testName.getMethodName()) {
+				
+				@Override
+				public String getContextPathPrefix(ServiceReference<ServletContextHelper> helper) {
+					if (Boolean.TRUE.equals(helper.getProperty("equinox.legacy.context.helper"))) {
+						return contextPrefix;
+					}
+					return null;
+				}		
+			};
+			pathAdaptorReg = context.registerService(ContextPathCustomizer.class, pathAdaptor, null);
+			
+			FindHook findHook = new FindHook() {
+
+				@Override
+				public void find(
+						BundleContext bundleContext, String name, String filter,
+						boolean allServices, Collection<ServiceReference<?>> references) {
+
+					if (bundleContext != context) {
+						return;
+					}
+
+					// don't show ServletContextHelper
+					for (Iterator<ServiceReference<?>> iterator = references.iterator(); iterator.hasNext();) {
+						ServiceReference<?> sr = iterator.next();
+						if (Boolean.TRUE.equals(sr.getProperty("equinox.legacy.context.helper"))) {
+							iterator.remove();
+						}
+						iterator.remove();
+					}
+				}
+			};
+
+			findHookReg = context.registerService(FindHook.class, findHook, null);
+			//Register a servlet service using HttpService
+			BaseServlet baseServlet = new BaseServlet("content");
+			httpService.registerServlet("/servlet", baseServlet, null, null);
+		
+			String actual = requestAdvisor.request("testPrefix/servlet");
+			Assert.assertEquals("content", actual);
+		} finally {
+			if (pathAdaptorReg != null) {
+				pathAdaptorReg.unregister();
+			}
+			if (findHookReg != null) {
+				findHookReg.unregister();
+			}
+			httpService.unregister("/servlet");
+		}
+	}
+}
+
+
