diff --git a/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/DiagnosticsTest.java b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/DiagnosticsTest.java
index 5a459d5..954c07d 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/DiagnosticsTest.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/DiagnosticsTest.java
@@ -35,10 +35,11 @@
 
 public class DiagnosticsTest extends TestBase {
 	
-	// there is one TestComponent created by org.apache.felix.dm.itest.bundle
-	// this component is always registered, so we only need to take it into 
+	// there are two components (TestComponent and HelloWorldServiceFactory) created by 
+    // org.apache.felix.dm.itest.bundle
+	// These component is always registered, so we only need to take them into 
 	// account when we build the graph with ALL components
-	private static final int InitialComponentCount = 1;
+	private static final int InitialComponentCount = 2;
 	
 	private boolean checkComponentCount(int expected, int count) {
 		return count == expected + InitialComponentCount;
diff --git a/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5153_StopBeforeUngetServiceTest.java b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5153_StopBeforeUngetServiceTest.java
new file mode 100644
index 0000000..3773a9d
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/api/FELIX5153_StopBeforeUngetServiceTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.itest.api;
+
+import org.apache.felix.dm.itest.bundle.HelloWorld;
+import org.apache.felix.dm.itest.util.TestBase;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class FELIX5153_StopBeforeUngetServiceTest extends TestBase {
+    public void testCallStopAfterUngetService() throws Throwable {
+        Bundle testBundle = null;
+        
+        try {
+    	    ServiceReference[] refs = context.getServiceReferences(HelloWorld.class.getName(), "(dm=dm4)");
+    	    HelloWorld service = (HelloWorld) context.getService(refs[0]);
+    	    System.out.println(service.sayIt("DM4"));
+
+    		for (Bundle b : context.getBundles()) {
+    			if (b.getSymbolicName().equals("org.apache.felix.dependencymanager.itest.bundle")) {
+    				testBundle = b;
+    				// Stop the test bundle. In this test bundle, we have a service factory component, and its unget method
+    				// is expected to be called *before* its stop() method.
+    				b.stop();
+    				break;
+    			}
+    		}
+    	} 
+    	
+    	catch (Throwable t) {
+    		error("test failed", t);
+    	}
+    	
+    	finally {
+    	    if (testBundle != null) {
+    	        testBundle.start(); // restart the test bundle
+    	    }
+    	}
+    }
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/Activator.java b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/Activator.java
index a550e30..15fe6eb 100644
--- a/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/Activator.java
+++ b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/Activator.java
@@ -18,6 +18,9 @@
  */
 package org.apache.felix.dm.itest.bundle;
 
+import java.util.Dictionary;
+import java.util.Hashtable;
+
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
 import org.osgi.framework.BundleContext;
@@ -28,11 +31,15 @@
 public class Activator extends DependencyActivatorBase {
 
 	@Override
-	public void init(BundleContext ctx, DependencyManager m)
-			throws Exception {
+	public void init(BundleContext ctx, DependencyManager m) throws Exception {
 		m.add(createComponent()
-				.setImplementation(TestComponent.class)
-				.setInterface(TestService.class.getName(), null));
+		    .setImplementation(TestComponent.class)
+		    .setInterface(TestService.class.getName(), null));
+		
+        Dictionary<String, Object> props = new Hashtable<>();
+        props.put("dm", "dm4");
+        m.add(createComponent().setInterface(HelloWorld.class.getName(), props)
+         .setImplementation(new HelloWorldServiceFactory()));
 	}
 
 }
diff --git a/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/HelloWorld.java b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/HelloWorld.java
new file mode 100644
index 0000000..f31693f
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/HelloWorld.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.itest.bundle;
+
+public interface HelloWorld {
+
+	String sayIt(String msg);
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/HelloWorldService.java b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/HelloWorldService.java
new file mode 100644
index 0000000..3c3aa6f
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/HelloWorldService.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.itest.bundle;
+
+public class HelloWorldService implements HelloWorld {
+
+	@Override
+	public String sayIt(String arg) {
+		return "Hello " + arg;
+	}
+}
diff --git a/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/HelloWorldServiceFactory.java b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/HelloWorldServiceFactory.java
new file mode 100644
index 0000000..3ee6a49
--- /dev/null
+++ b/dependencymanager/org.apache.felix.dependencymanager.itest/src/org/apache/felix/dm/itest/bundle/HelloWorldServiceFactory.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.dm.itest.bundle;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceRegistration;
+
+public class HelloWorldServiceFactory implements ServiceFactory {
+	private final Map<ServiceRegistration, HelloWorldService> m_services = new HashMap<>();
+
+	public void stop() {
+		synchronized (m_services) {
+			if (!m_services.isEmpty()) {
+				throw new IllegalStateException("All services should be closed");
+			}
+		}
+	}
+
+	@Override
+	public HelloWorld getService(Bundle bundle, ServiceRegistration registration) {
+		HelloWorldService service = new HelloWorldService();
+		synchronized (m_services) {
+			HelloWorldService old = m_services.put(registration, service);
+			assert old == null;
+		}
+		return service;
+	}
+
+	@Override
+	public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
+		synchronized (m_services) {
+			HelloWorldService old = m_services.remove(registration);
+			HelloWorldService serv = (HelloWorldService) service;
+			assert serv == old;
+		}
+	}
+}
