changeset 949:792ab05353ae

Make InformationService impls internal This commit moves the InformationService implementations used in each Thermostat plug-in to internal packages. Additionally, the commit modifies the respective Activators to track the associated ViewProviders which are then passed to the constructor of the InformationService implementation. This makes the dependency on the ViewProvider(s) explicit and removes several uses of OSGIUtils. Currently, an NPE is possible if the ViewProvider is not registered in time. This commit requires several changes to the Eclipse client. Since each Thermostat plug-in maps to an Eclipse view, the Eclipse view needs to know which InformationService it is responsible for. This change to make the InformationService implementations internal means Eclipse can no longer reference specific implementation classes (e.g. the Host CPU Eclipse view can't reference the HostCpuService). This commit adds an identifier when the service is registered, so the Eclipse views can query this identifier using an OSGi filter. This allows the Eclipse views to still obtain the specific service instances they need without referencing the implementation class. These changes have also allowed more code to be pulled up into RefViewPart so there is less duplication in the concrete classes. Reviewed-by: vanaltj, jerboaa Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2013-January/005296.html
author Elliott Baron <ebaron@redhat.com>
date Thu, 31 Jan 2013 14:42:17 -0500
parents 52eac263ab76
children f0a9458e2f8b
files client/core/src/main/java/com/redhat/thermostat/client/core/InformationService.java eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/Activator.java eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/HostCpuViewPart.java eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/HostMemoryViewPart.java eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/VmCpuViewPart.java eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/VmGcViewPart.java eclipse/com.redhat.thermostat.eclipse.chart.vmclassstat/src/com/redhat/thermostat/eclipse/chart/vmclassstat/Activator.java eclipse/com.redhat.thermostat.eclipse.chart.vmclassstat/src/com/redhat/thermostat/eclipse/chart/vmclassstat/VmClassStatViewPart.java eclipse/com.redhat.thermostat.eclipse.test/META-INF/MANIFEST.MF eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/AbstractRefViewPartTest.java eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostCpuViewPartTest.java eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostMemoryViewPartTest.java eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostOverviewViewPartTest.java eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/VmClassStatViewPartTest.java eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/VmCpuViewPartTest.java eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/VmGcViewPartTest.java eclipse/com.redhat.thermostat.eclipse/META-INF/MANIFEST.MF eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/Activator.java eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/views/HostOverviewViewPart.java eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/views/RefViewPart.java eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/views/HostRefViewPart.java eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/views/VmRefViewPart.java host-cpu/client-core/src/main/java/com/redhat/thermostat/host/cpu/client/core/HostCpuService.java host-cpu/client-core/src/main/java/com/redhat/thermostat/host/cpu/client/core/internal/Activator.java host-cpu/client-core/src/main/java/com/redhat/thermostat/host/cpu/client/core/internal/HostCpuServiceImpl.java host-cpu/client-core/src/test/java/com/redhat/thermostat/host/cpu/client/core/internal/ActivatorTest.java host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/HostMemoryService.java host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/internal/Activator.java host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/internal/HostMemoryServiceImpl.java host-memory/client-core/src/test/java/com/redhat/thermostat/host/memory/client/core/internal/ActivatorTest.java host-overview/client-core/src/main/java/com/redhat/thermostat/host/overview/client/core/HostOverviewService.java host-overview/client-core/src/main/java/com/redhat/thermostat/host/overview/client/core/internal/Activator.java host-overview/client-core/src/main/java/com/redhat/thermostat/host/overview/client/core/internal/HostOverviewServiceImpl.java host-overview/client-core/src/test/java/com/redhat/thermostat/host/overview/client/core/internal/ActivatorTest.java numa/client-core/src/main/java/com/redhat/thermostat/numa/client/core/NumaInformationService.java numa/client-core/src/main/java/com/redhat/thermostat/numa/client/core/internal/Activator.java numa/client-core/src/main/java/com/redhat/thermostat/numa/client/core/internal/NumaInformationServiceImpl.java numa/client-core/src/test/java/com/redhat/thermostat/numa/client/core/NumaInformationServiceTest.java numa/client-core/src/test/java/com/redhat/thermostat/numa/client/core/internal/ActivatorTest.java thread/client-controllers/pom.xml thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/ThreadInformationService.java thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/impl/ThreadInformationService.java thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/impl/ThreadInformationServiceImpl.java thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/osgi/Activator.java vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/VmClassStatService.java vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/internal/Activator.java vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/internal/VmClassStatServiceImpl.java vm-classstat/client-core/src/test/java/com/redhat/thermostat/vm/classstat/client/core/internal/ActivatorTest.java vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/VmCpuService.java vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/internal/Activator.java vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/internal/VmCpuServiceImpl.java vm-cpu/client-core/src/test/java/com/redhat/thermostat/vm/cpu/client/core/internal/ActivatorTest.java vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/VmGcService.java vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/Activator.java vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcServiceImpl.java vm-gc/client-core/src/test/java/com/redhat/thermostat/vm/gc/client/core/internal/ActivatorTest.java vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/HeapDumperService.java vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/Activator.java vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/HeapDumperServiceImpl.java vm-heap-analysis/client-core/src/test/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/ActivatorTest.java vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/MemoryStatsService.java vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/internal/Activator.java vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/internal/MemoryStatsServiceImpl.java vm-memory/client-core/src/test/java/com/redhat/thermostat/vm/memory/client/core/internal/ActivatorTest.java vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/VmOverviewService.java vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/internal/Activator.java vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/internal/VmOverviewServiceImpl.java vm-overview/client-core/src/test/java/com/redhat/thermostat/vm/overview/client/core/internal/ActivatorTest.java web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java
diffstat 69 files changed, 1511 insertions(+), 752 deletions(-) [+]
line wrap: on
line diff
--- a/client/core/src/main/java/com/redhat/thermostat/client/core/InformationService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/client/core/src/main/java/com/redhat/thermostat/client/core/InformationService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -50,13 +50,21 @@
  * <p>
  * To provide an implementation of {@link InformationService}, register an
  * instance of this interface as an OSGi service with the property
- * {@link Constants#GENERIC_SERVICE_CLASSNAME} set to the name of the Class
- * that this {@link InformationService} provides information for.
+ * {@link Constants#GENERIC_SERVICE_CLASSNAME} set to the name of the Class that
+ * this {@link InformationService} provides information for, and the property
+ * {@link #KEY_SERVICE_ID} set to a unique identifier for your implementation.
  */
 @ExtensionPoint
 public interface InformationService<T extends Ref> extends Ordered {
     
     /**
+     * Property key to be used when registering this service with the OSGi framework.
+     * The value of the property with this key should be an identifier that a client
+     * may use to differentiate this implementation of InformationService from another.
+     */
+    public static final String KEY_SERVICE_ID = InformationService.class.getName() + ".serviceID";
+    
+    /**
      * Returns a {@link Filter} that is used to determine if this information
      * source can provide information for a given target.
      */
--- a/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -39,7 +39,6 @@
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
 
-import com.redhat.thermostat.common.utils.OSGIUtils;
 import com.redhat.thermostat.host.cpu.client.core.HostCpuViewProvider;
 import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider;
 import com.redhat.thermostat.vm.cpu.client.core.VmCpuViewProvider;
@@ -64,10 +63,10 @@
         plugin = this;
         
         // Register our ViewProviders
-        OSGIUtils.getInstance().registerService(HostCpuViewProvider.class, new SWTHostCpuViewProvider());
-        OSGIUtils.getInstance().registerService(HostMemoryViewProvider.class, new SWTHostMemoryViewProvider());
-        OSGIUtils.getInstance().registerService(VmCpuViewProvider.class, new SWTVmCpuViewProvider());
-        OSGIUtils.getInstance().registerService(VmGcViewProvider.class, new SWTVmGcViewProvider());
+        context.registerService(HostCpuViewProvider.class, new SWTHostCpuViewProvider(), null);
+        context.registerService(HostMemoryViewProvider.class, new SWTHostMemoryViewProvider(), null);
+        context.registerService(VmCpuViewProvider.class, new SWTVmCpuViewProvider(), null);
+        context.registerService(VmGcViewProvider.class, new SWTVmGcViewProvider(), null);
     }
 
     /*
--- a/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/HostCpuViewPart.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/HostCpuViewPart.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,28 +36,31 @@
 
 package com.redhat.thermostat.eclipse.chart.common;
 
-import org.eclipse.swt.widgets.Composite;
+import org.osgi.framework.BundleContext;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.utils.OSGIUtils;
-import com.redhat.thermostat.eclipse.SWTComponent;
+import com.redhat.thermostat.client.core.views.ViewProvider;
 import com.redhat.thermostat.eclipse.views.HostRefViewPart;
 import com.redhat.thermostat.host.cpu.client.core.HostCpuService;
 import com.redhat.thermostat.host.cpu.client.core.HostCpuViewProvider;
-import com.redhat.thermostat.storage.core.HostRef;
 
 public class HostCpuViewPart extends HostRefViewPart {
+    
+    public HostCpuViewPart() {
+        this(Activator.getDefault().getBundle().getBundleContext());
+    }
+    
+    public HostCpuViewPart(BundleContext context) {
+        super(context);
+    }
 
     @Override
-    protected SWTComponent createControllerView(HostRef ref, Composite parent) {
-        SWTHostCpuViewProvider viewProvider = (SWTHostCpuViewProvider) OSGIUtils
-                .getInstance().getService(HostCpuViewProvider.class);
-        viewProvider.setParent(parent);
+    protected Class<? extends ViewProvider> getViewProviderClass() {
+        return HostCpuViewProvider.class;
+    }
 
-        HostCpuService service = OSGIUtils.getInstance().getService(HostCpuService.class);
-        InformationServiceController<HostRef> controller = service.getInformationServiceController(ref);
-        SWTComponent view = (SWTComponent) controller.getView();
-        return view;
+    @Override
+    protected String getInformationServiceID() {
+        return HostCpuService.SERVICE_ID;
     }
 
 }
--- a/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/HostMemoryViewPart.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/HostMemoryViewPart.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,29 +36,31 @@
 
 package com.redhat.thermostat.eclipse.chart.common;
 
-import org.eclipse.swt.widgets.Composite;
+import org.osgi.framework.BundleContext;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.utils.OSGIUtils;
-import com.redhat.thermostat.eclipse.SWTComponent;
+import com.redhat.thermostat.client.core.views.ViewProvider;
 import com.redhat.thermostat.eclipse.views.HostRefViewPart;
 import com.redhat.thermostat.host.memory.client.core.HostMemoryService;
 import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider;
-import com.redhat.thermostat.storage.core.HostRef;
 
 public class HostMemoryViewPart extends HostRefViewPart {
 
+    public HostMemoryViewPart() {
+        this(Activator.getDefault().getBundle().getBundleContext());
+    }
+    
+    public HostMemoryViewPart(BundleContext context) {
+        super(context);
+    }
+    
     @Override
-    protected SWTComponent createControllerView(HostRef ref, Composite parent) {
-        SWTHostMemoryViewProvider viewProvider = (SWTHostMemoryViewProvider) OSGIUtils
-                .getInstance().getService(HostMemoryViewProvider.class);
-        viewProvider.setParent(parent);
-        
-        HostMemoryService service = OSGIUtils.getInstance().getService(HostMemoryService.class);
-        InformationServiceController<HostRef> controller = service.getInformationServiceController(ref);
-        SWTComponent view = (SWTComponent) controller.getView();
-        return view;
+    protected Class<? extends ViewProvider> getViewProviderClass() {
+        return HostMemoryViewProvider.class;
     }
 
-}
+    @Override
+    protected String getInformationServiceID() {
+        return HostMemoryService.SERVICE_ID;
+    }
 
+}
\ No newline at end of file
--- a/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/VmCpuViewPart.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/VmCpuViewPart.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,29 +36,31 @@
 
 package com.redhat.thermostat.eclipse.chart.common;
 
-import org.eclipse.swt.widgets.Composite;
+import org.osgi.framework.BundleContext;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.utils.OSGIUtils;
-import com.redhat.thermostat.eclipse.SWTComponent;
+import com.redhat.thermostat.client.core.views.ViewProvider;
 import com.redhat.thermostat.eclipse.views.VmRefViewPart;
-import com.redhat.thermostat.storage.core.VmRef;
 import com.redhat.thermostat.vm.cpu.client.core.VmCpuService;
 import com.redhat.thermostat.vm.cpu.client.core.VmCpuViewProvider;
 
 public class VmCpuViewPart extends VmRefViewPart {
 
+    public VmCpuViewPart() {
+        this(Activator.getDefault().getBundle().getBundleContext());
+    }
+    
+    public VmCpuViewPart(BundleContext context) {
+        super(context);
+    }
+
     @Override
-    protected SWTComponent createControllerView(VmRef ref, Composite parent) {
-        SWTVmCpuViewProvider viewProvider = (SWTVmCpuViewProvider) OSGIUtils
-                .getInstance().getService(VmCpuViewProvider.class);
-        viewProvider.setParent(parent);
-        
-        VmCpuService service = OSGIUtils.getInstance().getService(VmCpuService.class);
-        InformationServiceController<VmRef> controller = service.getInformationServiceController(ref);
-        SWTComponent view = (SWTComponent) controller.getView();
-        return view;
+    protected Class<? extends ViewProvider> getViewProviderClass() {
+        return VmCpuViewProvider.class;
+    }
+
+    @Override
+    protected String getInformationServiceID() {
+        return VmCpuService.SERVICE_ID;
     }
 
 }
-
--- a/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/VmGcViewPart.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/VmGcViewPart.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,29 +36,31 @@
 
 package com.redhat.thermostat.eclipse.chart.common;
 
-import org.eclipse.swt.widgets.Composite;
+import org.osgi.framework.BundleContext;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.utils.OSGIUtils;
-import com.redhat.thermostat.eclipse.SWTComponent;
+import com.redhat.thermostat.client.core.views.ViewProvider;
 import com.redhat.thermostat.eclipse.views.VmRefViewPart;
-import com.redhat.thermostat.storage.core.VmRef;
 import com.redhat.thermostat.vm.gc.client.core.VmGcService;
 import com.redhat.thermostat.vm.gc.client.core.VmGcViewProvider;
 
 public class VmGcViewPart extends VmRefViewPart {
 
+    public VmGcViewPart() {
+        this(Activator.getDefault().getBundle().getBundleContext());
+    }
+    
+    public VmGcViewPart(BundleContext context) {
+        super(context);
+    }
+    
     @Override
-    protected SWTComponent createControllerView(VmRef ref, Composite parent) {
-        SWTVmGcViewProvider viewProvider = (SWTVmGcViewProvider) OSGIUtils.getInstance().getService(
-                VmGcViewProvider.class);
-        viewProvider.setParent(parent);
-        
-        VmGcService service = OSGIUtils.getInstance().getService(VmGcService.class);
-        InformationServiceController<VmRef> controller = service.getInformationServiceController(ref);
-        SWTComponent view = (SWTComponent) controller.getView();
-        return view;
+    protected Class<? extends ViewProvider> getViewProviderClass() {
+        return VmGcViewProvider.class;
+    }
+
+    @Override
+    protected String getInformationServiceID() {
+        return VmGcService.SERVICE_ID;
     }
 
 }
-
--- a/eclipse/com.redhat.thermostat.eclipse.chart.vmclassstat/src/com/redhat/thermostat/eclipse/chart/vmclassstat/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.chart.vmclassstat/src/com/redhat/thermostat/eclipse/chart/vmclassstat/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -39,7 +39,6 @@
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
 
-import com.redhat.thermostat.common.utils.OSGIUtils;
 import com.redhat.thermostat.vm.classstat.client.core.VmClassStatViewProvider;
 
 /**
@@ -73,7 +72,7 @@
         plugin = this;
 
         // Register view
-        OSGIUtils.getInstance().registerService(VmClassStatViewProvider.class,
+        context.registerService(VmClassStatViewProvider.class,
                 new SWTVmClassStatViewProvider(), null);
     }
 
--- a/eclipse/com.redhat.thermostat.eclipse.chart.vmclassstat/src/com/redhat/thermostat/eclipse/chart/vmclassstat/VmClassStatViewPart.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.chart.vmclassstat/src/com/redhat/thermostat/eclipse/chart/vmclassstat/VmClassStatViewPart.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,29 +36,31 @@
 
 package com.redhat.thermostat.eclipse.chart.vmclassstat;
 
-import org.eclipse.swt.widgets.Composite;
+import org.osgi.framework.BundleContext;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.utils.OSGIUtils;
-import com.redhat.thermostat.eclipse.SWTComponent;
+import com.redhat.thermostat.client.core.views.ViewProvider;
 import com.redhat.thermostat.eclipse.views.VmRefViewPart;
-import com.redhat.thermostat.storage.core.VmRef;
 import com.redhat.thermostat.vm.classstat.client.core.VmClassStatService;
 import com.redhat.thermostat.vm.classstat.client.core.VmClassStatViewProvider;
 
 public class VmClassStatViewPart extends VmRefViewPart {
 
+    public VmClassStatViewPart() {
+        this(Activator.getDefault().getBundle().getBundleContext());
+    }
+    
+    public VmClassStatViewPart(BundleContext context) {
+        super(context);
+    }
+    
     @Override
-    protected SWTComponent createControllerView(VmRef ref, Composite parent) {
-        SWTVmClassStatViewProvider viewProvider = (SWTVmClassStatViewProvider) OSGIUtils
-                .getInstance().getService(VmClassStatViewProvider.class);
-        viewProvider.setParent(parent);
-        
-        VmClassStatService service = OSGIUtils.getInstance().getService(VmClassStatService.class);
-        InformationServiceController<VmRef> controller = service.getInformationServiceController(ref);
-        SWTComponent view = (SWTComponent) controller.getView();
-        return view;
+    protected Class<? extends ViewProvider> getViewProviderClass() {
+        return VmClassStatViewProvider.class;
+    }
+
+    @Override
+    protected String getInformationServiceID() {
+        return VmClassStatService.SERVICE_ID;
     }
 
 }
-
--- a/eclipse/com.redhat.thermostat.eclipse.test/META-INF/MANIFEST.MF	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.test/META-INF/MANIFEST.MF	Thu Jan 31 14:42:17 2013 -0500
@@ -10,9 +10,13 @@
  org.junit;bundle-version="4.10.0",
  com.redhat.thermostat.bundles.org.hamcrest.core;resolution:=optional,
  com.redhat.thermostat.bundles.org.objenesis;resolution:=optional,
- com.redhat.thermostat.bundles.org.mockito.mockito-core;resolution:=optional
+ com.redhat.thermostat.bundles.org.mockito.mockito-core;resolution:=optional,
+ com.redhat.thermostat.eclipse,
+ com.redhat.thermostat.eclipse.chart.common,
+ com.redhat.thermostat.eclipse.chart.vmclassstat
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
-Import-Package: com.redhat.thermostat.client.core.controllers,
+Import-Package: com.redhat.thermostat.client.core,
+ com.redhat.thermostat.client.core.controllers,
  com.redhat.thermostat.client.core.views,
  com.redhat.thermostat.client.osgi.service,
  com.redhat.thermostat.client.ui,
--- a/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/AbstractRefViewPartTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/AbstractRefViewPartTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,6 +36,9 @@
 
 package com.redhat.thermostat.eclipse.test.views;
 
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.isNull;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
@@ -46,12 +49,18 @@
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.IViewSite;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchPartSite;
 import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
 import org.junit.Before;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
 
-import com.redhat.thermostat.common.utils.OSGIUtils;
+import com.redhat.thermostat.client.core.InformationService;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
 import com.redhat.thermostat.eclipse.SWTComponent;
 import com.redhat.thermostat.eclipse.ThermostatConstants;
 import com.redhat.thermostat.eclipse.internal.views.HostsVmsTreeViewPart;
@@ -64,27 +73,34 @@
     protected RefViewPart<T> view;
     protected SWTComponent thermoView;
     protected HostsVmsTreeViewPart hostVMView;
+    protected BundleContext context;
+    protected InformationServiceController<T> controller;
     private ISelectionProvider provider;
-    protected OSGIUtils osgi;
 
     public AbstractRefViewPartTest() {
         super();
     }
 
+    @SuppressWarnings("unchecked")
     @Before
-    public void before() {
+    public void before() throws InvalidSyntaxException, PartInitException {
         parent = spy(new Shell(Display.getCurrent()));
         
-        view = spy(createViewPart());
+        context = mock(BundleContext.class);
+        view = spy(createViewPart(context));
         hostVMView = mock(HostsVmsTreeViewPart.class);
-        osgi = mock(OSGIUtils.class);
-        OSGIUtils.setInstance(osgi);
+        ServiceReference<InformationService<T>> ref = (ServiceReference<InformationService<T>>) mock(ServiceReference.class);
+        InformationService<T> infoService = (InformationService<T>) mock(InformationService.class);
+        controller = (InformationServiceController<T>) mock(InformationServiceController.class);
+        when(infoService.getInformationServiceController((T) any(Ref.class))).thenReturn(controller);
+        when(context.getService(ref)).thenReturn(infoService);
+        when(context.getServiceReferences((String) isNull(), anyString())).thenReturn(new ServiceReference<?>[] { ref });
     
         // Workbench mocks
         IWorkbenchWindow window = mock(IWorkbenchWindow.class);
         IWorkbenchPage page = mock(IWorkbenchPage.class);
         ISelectionService service = mock(ISelectionService.class);
-        IWorkbenchPartSite site = mock(IWorkbenchPartSite.class);
+        IViewSite site = mock(IViewSite.class);
         
         when(page.findView(ThermostatConstants.VIEW_ID_HOST_VM)).thenReturn(hostVMView);
         when(window.getSelectionService()).thenReturn(service);
@@ -93,8 +109,8 @@
         when(site.getId()).thenReturn(getViewID());
         when(view.getSite()).thenReturn(site);
         
-        // Controller mock
-        mockController();
+        // ViewProvider mock
+        mockViewProvider();
         
         // Selection mocks
         IWorkbenchPartSite hostVMSite = mock(IWorkbenchPartSite.class);
@@ -103,11 +119,13 @@
         when(hostVMSite.getId()).thenReturn(ThermostatConstants.VIEW_ID_HOST_VM);
         when(hostVMSite.getSelectionProvider()).thenReturn(provider);
         when(hostVMView.getSite()).thenReturn(hostVMSite);
+        
+        view.init(site);
     }
 
-    protected abstract void mockController();
+    protected abstract void mockViewProvider();
 
-    protected abstract RefViewPart<T> createViewPart();
+    protected abstract RefViewPart<T> createViewPart(BundleContext context);
     
     protected abstract String getViewID();
 
--- a/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostCpuViewPartTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostCpuViewPartTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -47,15 +47,13 @@
 import org.eclipse.swt.widgets.Composite;
 import org.junit.Test;
 import org.mockito.InOrder;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.client.core.views.UIComponent;
 import com.redhat.thermostat.eclipse.ThermostatConstants;
 import com.redhat.thermostat.eclipse.chart.common.HostCpuViewPart;
-import com.redhat.thermostat.eclipse.chart.common.SWTHostCpuView;
 import com.redhat.thermostat.eclipse.chart.common.SWTHostCpuViewProvider;
 import com.redhat.thermostat.eclipse.internal.views.RefViewPart;
-import com.redhat.thermostat.host.cpu.client.core.HostCpuService;
 import com.redhat.thermostat.host.cpu.client.core.HostCpuViewProvider;
 import com.redhat.thermostat.storage.core.HostRef;
 import com.redhat.thermostat.storage.core.VmRef;
@@ -63,7 +61,6 @@
 public class HostCpuViewPartTest extends AbstractRefViewPartTest<HostRef> {
     
     private SWTHostCpuViewProvider viewProvider;
-    private InformationServiceController<HostRef> controller;
 
     @Test
     public void testSetFocus() throws Exception {
@@ -127,23 +124,18 @@
     }
 
     @Override
-    protected RefViewPart<HostRef> createViewPart() {
-        return new HostCpuViewPart();
+    protected RefViewPart<HostRef> createViewPart(BundleContext context) {
+        return new HostCpuViewPart(context);
     }
 
     @Override
-    protected void mockController() {
-        HostCpuService service = mock(HostCpuService.class);
-        controller = mock(InformationServiceController.class);
-        thermoView = mock(SWTHostCpuView.class);
-        
-        when(osgi.getService(HostCpuService.class)).thenReturn(service);
-        when(service.getInformationServiceController(any(HostRef.class))).thenReturn(controller);
-        when(controller.getView()).thenReturn((UIComponent) thermoView);
-        
+    protected void mockViewProvider() {
         viewProvider = mock(SWTHostCpuViewProvider.class);
-        when(osgi.getService(HostCpuViewProvider.class)).thenReturn(
-                viewProvider);
+        @SuppressWarnings("unchecked")
+        ServiceReference<HostCpuViewProvider> ref = (ServiceReference<HostCpuViewProvider>) mock(ServiceReference.class);
+        when(context.getService(ref)).thenReturn(viewProvider);
+        when(context.getServiceReference(HostCpuViewProvider.class)).thenReturn(
+                ref);
     }
 
     @Override
--- a/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostMemoryViewPartTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostMemoryViewPartTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -45,22 +45,19 @@
 import org.eclipse.swt.widgets.Composite;
 import org.junit.Test;
 import org.mockito.InOrder;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.client.core.views.UIComponent;
 import com.redhat.thermostat.eclipse.ThermostatConstants;
 import com.redhat.thermostat.eclipse.chart.common.HostMemoryViewPart;
-import com.redhat.thermostat.eclipse.chart.common.SWTHostMemoryView;
 import com.redhat.thermostat.eclipse.chart.common.SWTHostMemoryViewProvider;
 import com.redhat.thermostat.eclipse.internal.views.RefViewPart;
-import com.redhat.thermostat.host.memory.client.core.HostMemoryService;
 import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider;
 import com.redhat.thermostat.storage.core.HostRef;
 
 public class HostMemoryViewPartTest extends AbstractRefViewPartTest<HostRef> {
 
     private SWTHostMemoryViewProvider viewProvider;
-    private InformationServiceController<HostRef> controller;
 
     @Test
     public void testSelectionAfter() throws Exception {
@@ -80,23 +77,17 @@
     }
 
     @Override
-    protected void mockController() {
-        HostMemoryService service = mock(HostMemoryService.class);
-        controller = mock(InformationServiceController.class);
-        thermoView = mock(SWTHostMemoryView.class);
-
-        when(osgi.getService(HostMemoryService.class)).thenReturn(service);
-        when(service.getInformationServiceController(any(HostRef.class))).thenReturn(controller);
-        when(controller.getView()).thenReturn((UIComponent) thermoView);
-        
+    protected void mockViewProvider() {
         viewProvider = mock(SWTHostMemoryViewProvider.class);
-        when(osgi.getService(HostMemoryViewProvider.class)).thenReturn(
-                viewProvider);
+        @SuppressWarnings("unchecked")
+        ServiceReference<HostMemoryViewProvider> ref = (ServiceReference<HostMemoryViewProvider>) mock(ServiceReference.class);
+        when(context.getService(ref)).thenReturn(viewProvider);
+        when(context.getServiceReference(HostMemoryViewProvider.class)).thenReturn(ref);
     }
 
     @Override
-    protected RefViewPart<HostRef> createViewPart() {
-        return new HostMemoryViewPart();
+    protected RefViewPart<HostRef> createViewPart(BundleContext context) {
+        return new HostMemoryViewPart(context);
     }
 
     @Override
--- a/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostOverviewViewPartTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostOverviewViewPartTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -45,21 +45,18 @@
 import org.eclipse.swt.widgets.Composite;
 import org.junit.Test;
 import org.mockito.InOrder;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.client.core.views.UIComponent;
 import com.redhat.thermostat.eclipse.ThermostatConstants;
 import com.redhat.thermostat.eclipse.internal.views.HostOverviewViewPart;
 import com.redhat.thermostat.eclipse.internal.views.RefViewPart;
-import com.redhat.thermostat.eclipse.internal.views.SWTHostOverviewView;
 import com.redhat.thermostat.eclipse.internal.views.SWTHostOverviewViewProvider;
-import com.redhat.thermostat.host.overview.client.core.HostOverviewService;
 import com.redhat.thermostat.host.overview.client.core.HostOverviewViewProvider;
 import com.redhat.thermostat.storage.core.HostRef;
 
 public class HostOverviewViewPartTest extends AbstractRefViewPartTest<HostRef> {
 
-    private InformationServiceController<HostRef> controller;
     private SWTHostOverviewViewProvider viewProvider;
     
     @Test
@@ -80,23 +77,18 @@
     }
 
     @Override
-    protected void mockController() {
-        HostOverviewService service = mock(HostOverviewService.class);
-        controller = mock(InformationServiceController.class);
-        thermoView = mock(SWTHostOverviewView.class);
-
-        when(osgi.getService(HostOverviewService.class)).thenReturn(service);
-        when(service.getInformationServiceController(any(HostRef.class))).thenReturn(controller);
-        when(controller.getView()).thenReturn((UIComponent) thermoView);
-        
+    protected void mockViewProvider() {
         viewProvider = mock(SWTHostOverviewViewProvider.class);
-        when(osgi.getService(HostOverviewViewProvider.class)).thenReturn(
-                viewProvider);
+        @SuppressWarnings("unchecked")
+        ServiceReference<HostOverviewViewProvider> ref = (ServiceReference<HostOverviewViewProvider>) mock(ServiceReference.class);
+        when(context.getService(ref)).thenReturn(viewProvider);
+        when(context.getServiceReference(HostOverviewViewProvider.class)).thenReturn(
+                ref);
     }
 
     @Override
-    protected RefViewPart<HostRef> createViewPart() {
-        return new HostOverviewViewPart();
+    protected RefViewPart<HostRef> createViewPart(BundleContext context) {
+        return new HostOverviewViewPart(context);
     }
 
     @Override
--- a/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/VmClassStatViewPartTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/VmClassStatViewPartTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -45,22 +45,20 @@
 import org.eclipse.swt.widgets.Composite;
 import org.junit.Test;
 import org.mockito.InOrder;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
 import com.redhat.thermostat.eclipse.chart.vmclassstat.Activator;
-import com.redhat.thermostat.eclipse.chart.vmclassstat.SWTVmClassStatView;
 import com.redhat.thermostat.eclipse.chart.vmclassstat.SWTVmClassStatViewProvider;
 import com.redhat.thermostat.eclipse.chart.vmclassstat.VmClassStatViewPart;
 import com.redhat.thermostat.eclipse.internal.views.RefViewPart;
 import com.redhat.thermostat.storage.core.HostRef;
 import com.redhat.thermostat.storage.core.VmRef;
-import com.redhat.thermostat.vm.classstat.client.core.VmClassStatService;
 import com.redhat.thermostat.vm.classstat.client.core.VmClassStatViewProvider;
 
 public class VmClassStatViewPartTest extends AbstractRefViewPartTest<VmRef> {
 
     private SWTVmClassStatViewProvider viewProvider;
-    private InformationServiceController<VmRef> controller;
 
     @Test
     public void testSelectionAfter() throws Exception {
@@ -81,22 +79,18 @@
     }
 
     @Override
-    protected void mockController() {
-        VmClassStatService service = mock(VmClassStatService.class);
-        controller = mock(InformationServiceController.class);
-        thermoView = mock(SWTVmClassStatView.class);
-
-        when(osgi.getService(VmClassStatService.class)).thenReturn(service);
-        when(service.getInformationServiceController(any(VmRef.class))).thenReturn(controller);
-        when(controller.getView()).thenReturn(thermoView);
-        
+    protected void mockViewProvider() {
         viewProvider = mock(SWTVmClassStatViewProvider.class);
-        when(osgi.getService(VmClassStatViewProvider.class)).thenReturn(viewProvider);
+        @SuppressWarnings("unchecked")
+        ServiceReference<VmClassStatViewProvider> ref = (ServiceReference<VmClassStatViewProvider>) mock(ServiceReference.class);
+        when(context.getService(ref)).thenReturn(viewProvider);
+        when(context.getServiceReference(VmClassStatViewProvider.class)).thenReturn(
+                ref);
     }
 
     @Override
-    protected RefViewPart<VmRef> createViewPart() {
-        return new VmClassStatViewPart();
+    protected RefViewPart<VmRef> createViewPart(BundleContext context) {
+        return new VmClassStatViewPart(context);
     }
 
     @Override
--- a/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/VmCpuViewPartTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/VmCpuViewPartTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -47,22 +47,20 @@
 import org.eclipse.swt.widgets.Composite;
 import org.junit.Test;
 import org.mockito.InOrder;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
 import com.redhat.thermostat.eclipse.ThermostatConstants;
-import com.redhat.thermostat.eclipse.chart.common.SWTVmCpuView;
 import com.redhat.thermostat.eclipse.chart.common.SWTVmCpuViewProvider;
 import com.redhat.thermostat.eclipse.chart.common.VmCpuViewPart;
 import com.redhat.thermostat.eclipse.internal.views.RefViewPart;
 import com.redhat.thermostat.storage.core.HostRef;
 import com.redhat.thermostat.storage.core.VmRef;
-import com.redhat.thermostat.vm.cpu.client.core.VmCpuService;
 import com.redhat.thermostat.vm.cpu.client.core.VmCpuViewProvider;
 
 public class VmCpuViewPartTest extends AbstractRefViewPartTest<VmRef> {
 
     private SWTVmCpuViewProvider viewProvider;
-    private InformationServiceController<VmRef> controller;
 
     @Test
     public void testSelectionHostRef() throws Exception {
@@ -109,22 +107,18 @@
     }
 
     @Override
-    protected void mockController() {
-        VmCpuService service = mock(VmCpuService.class);
-        controller = mock(InformationServiceController.class);
-        thermoView = mock(SWTVmCpuView.class);
-        
-        when(osgi.getService(VmCpuService.class)).thenReturn(service);
-        when(service.getInformationServiceController(any(VmRef.class))).thenReturn(controller);
-        when(controller.getView()).thenReturn(thermoView);
-
+    protected void mockViewProvider() {
         viewProvider = mock(SWTVmCpuViewProvider.class);
-        when(osgi.getService(VmCpuViewProvider.class)).thenReturn(viewProvider);
+        @SuppressWarnings("unchecked")
+        ServiceReference<VmCpuViewProvider> ref = (ServiceReference<VmCpuViewProvider>) mock(ServiceReference.class);
+        when(context.getService(ref)).thenReturn(viewProvider);
+        when(context.getServiceReference(VmCpuViewProvider.class)).thenReturn(
+                ref);
     }
 
     @Override
-    protected RefViewPart<VmRef> createViewPart() {
-        return new VmCpuViewPart();
+    protected RefViewPart<VmRef> createViewPart(BundleContext context) {
+        return new VmCpuViewPart(context);
     }
 
     @Override
--- a/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/VmGcViewPartTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/VmGcViewPartTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -45,22 +45,20 @@
 import org.eclipse.swt.widgets.Composite;
 import org.junit.Test;
 import org.mockito.InOrder;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
 import com.redhat.thermostat.eclipse.ThermostatConstants;
-import com.redhat.thermostat.eclipse.chart.common.SWTVmGcView;
 import com.redhat.thermostat.eclipse.chart.common.SWTVmGcViewProvider;
 import com.redhat.thermostat.eclipse.chart.common.VmGcViewPart;
 import com.redhat.thermostat.eclipse.internal.views.RefViewPart;
 import com.redhat.thermostat.storage.core.HostRef;
 import com.redhat.thermostat.storage.core.VmRef;
-import com.redhat.thermostat.vm.gc.client.core.VmGcService;
 import com.redhat.thermostat.vm.gc.client.core.VmGcViewProvider;
 
 public class VmGcViewPartTest extends AbstractRefViewPartTest<VmRef> {
 
     private SWTVmGcViewProvider viewProvider;
-    private InformationServiceController<VmRef> controller;
 
     @Test
     public void testSelectionAfter() throws Exception {
@@ -81,22 +79,18 @@
     }
 
     @Override
-    protected void mockController() {
-        VmGcService service = mock(VmGcService.class);
-        controller = mock(InformationServiceController.class);
-        thermoView = mock(SWTVmGcView.class);
-
-        when(osgi.getService(VmGcService.class)).thenReturn(service);
-        when(service.getInformationServiceController(any(VmRef.class))).thenReturn(controller);
-        when(controller.getView()).thenReturn(thermoView);
-
+    protected void mockViewProvider() {
         viewProvider = mock(SWTVmGcViewProvider.class);
-        when(osgi.getService(VmGcViewProvider.class)).thenReturn(viewProvider);
+        @SuppressWarnings("unchecked")
+        ServiceReference<VmGcViewProvider> ref = (ServiceReference<VmGcViewProvider>) mock(ServiceReference.class);
+        when(context.getService(ref)).thenReturn(viewProvider);
+        when(context.getServiceReference(VmGcViewProvider.class)).thenReturn(
+                ref);
     }
 
     @Override
-    protected RefViewPart<VmRef> createViewPart() {
-        return new VmGcViewPart();
+    protected RefViewPart<VmRef> createViewPart(BundleContext context) {
+        return new VmGcViewPart(context);
     }
 
     @Override
--- a/eclipse/com.redhat.thermostat.eclipse/META-INF/MANIFEST.MF	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse/META-INF/MANIFEST.MF	Thu Jan 31 14:42:17 2013 -0500
@@ -9,7 +9,8 @@
 Bundle-ActivationPolicy: lazy
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.ui
-Import-Package: com.redhat.thermostat.client.core.controllers,
+Import-Package: com.redhat.thermostat.client.core,
+ com.redhat.thermostat.client.core.controllers,
  com.redhat.thermostat.client.core.views,
  com.redhat.thermostat.client.locale,
  com.redhat.thermostat.client.ui,
--- a/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -43,6 +43,7 @@
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 
 import com.redhat.thermostat.common.utils.OSGIUtils;
 import com.redhat.thermostat.eclipse.LoggerFacility;
@@ -80,8 +81,8 @@
         plugin = this;
 
         // Register ViewProvider
-        OSGIUtils.getInstance().registerService(HostOverviewViewProvider.class,
-                new SWTHostOverviewViewProvider());
+        context.registerService(HostOverviewViewProvider.class,
+                new SWTHostOverviewViewProvider(), null);
     }
 
     /*
@@ -92,14 +93,17 @@
      * )
      */
     public void stop(BundleContext context) throws Exception {
-        DbService dbService = OSGIUtils.getInstance().getServiceAllowNull(
-                DbService.class);
-        if (dbService != null) {
-            try {
-                dbService.disconnect();
-            } catch (ConnectionException e) {
-                LoggerFacility.getInstance().log(IStatus.ERROR,
-                        "Error disconnecting from database", e);
+        ServiceReference<DbService> dbServiceRef = context.getServiceReference(DbService.class);
+        if (dbServiceRef != null) {
+            DbService dbService = context.getService(dbServiceRef);
+            if (dbService != null) {
+                try {
+                    dbService.disconnect();
+                    context.ungetService(dbServiceRef);
+                } catch (ConnectionException e) {
+                    LoggerFacility.getInstance().log(IStatus.ERROR,
+                            "Error disconnecting from database", e);
+                }
             }
         }
         plugin = null;
--- a/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/views/HostOverviewViewPart.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/views/HostOverviewViewPart.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,27 +36,32 @@
 
 package com.redhat.thermostat.eclipse.internal.views;
 
-import org.eclipse.swt.widgets.Composite;
+import org.osgi.framework.BundleContext;
 
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.utils.OSGIUtils;
-import com.redhat.thermostat.eclipse.SWTComponent;
+import com.redhat.thermostat.client.core.views.ViewProvider;
+import com.redhat.thermostat.eclipse.internal.Activator;
 import com.redhat.thermostat.eclipse.views.HostRefViewPart;
 import com.redhat.thermostat.host.overview.client.core.HostOverviewService;
 import com.redhat.thermostat.host.overview.client.core.HostOverviewViewProvider;
-import com.redhat.thermostat.storage.core.HostRef;
 
 public class HostOverviewViewPart extends HostRefViewPart {
+    
+    public HostOverviewViewPart() {
+        this(Activator.getDefault().getBundle().getBundleContext());
+    }
+    
+    public HostOverviewViewPart(BundleContext context) {
+        super(context);
+    }
 
     @Override
-    protected SWTComponent createControllerView(HostRef ref, Composite top) {
-        SWTHostOverviewViewProvider provider = (SWTHostOverviewViewProvider) OSGIUtils
-                .getInstance().getService(HostOverviewViewProvider.class);
-        provider.setParent(top);
+    protected Class<? extends ViewProvider> getViewProviderClass() {
+        return HostOverviewViewProvider.class;
+    }
 
-        HostOverviewService service = OSGIUtils.getInstance().getService(HostOverviewService.class);
-        InformationServiceController<HostRef> controller = service.getInformationServiceController(ref);
-        return (SWTComponent) controller.getView();
+    @Override
+    protected String getInformationServiceID() {
+        return HostOverviewService.SERVICE_ID;
     }
 
 }
--- a/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/views/RefViewPart.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/internal/views/RefViewPart.java	Thu Jan 31 14:42:17 2013 -0500
@@ -45,12 +45,26 @@
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.ui.ISelectionListener;
 import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewSite;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.part.ViewPart;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
 
+import com.redhat.thermostat.client.core.InformationService;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.client.core.views.View;
+import com.redhat.thermostat.client.core.views.ViewProvider;
 import com.redhat.thermostat.eclipse.SWTComponent;
+import com.redhat.thermostat.eclipse.SWTViewProvider;
 import com.redhat.thermostat.eclipse.ThermostatConstants;
 import com.redhat.thermostat.storage.core.Ref;
 
@@ -62,8 +76,39 @@
     private Composite parent;
     private IStructuredSelection currentSelection;
 
-    public RefViewPart() {
+    private ServiceTracker<InformationService<T>, InformationService<T>> tracker;
+    private InformationService<T> infoService;
+    private BundleContext context;
+
+    public RefViewPart(BundleContext context) {
         super();
+        this.context = context;
+    }
+    
+    @Override
+    public void init(IViewSite site) throws PartInitException {
+        super.init(site);
+        
+        try {
+            tracker = new ServiceTracker<InformationService<T>, InformationService<T>>(context, createFilter(), null) {
+                @Override
+                public InformationService<T> addingService(
+                        ServiceReference<InformationService<T>> reference) {
+                    infoService = super.addingService(reference);
+                    return infoService;
+                }
+                @Override
+                public void removedService(
+                        ServiceReference<InformationService<T>> reference,
+                        InformationService<T> service) {
+                    infoService = null;
+                    super.removedService(reference, service);
+                }
+            };
+        } catch (InvalidSyntaxException e) {
+            throw new PartInitException("Bad OSGi filter", e);
+        }
+        tracker.open();
     }
 
     @Override
@@ -95,6 +140,12 @@
             createNoSelectionLabel();
         }
     }
+    
+    @Override
+    public void dispose() {
+        tracker.close();
+        super.dispose();
+    }
 
     public void createNoSelectionLabel() {
         Label noHost = new Label(top, SWT.NONE);
@@ -110,12 +161,41 @@
         parent.setFocus();
     }
     
-    protected abstract SWTComponent createControllerView(T ref, Composite parent);
+    /**
+     * Returns the {@link ViewProvider} class for the root {@link View}
+     * whose controls will be placed in this ViewPart.
+     * @return the {@link ViewProvider} class
+     */
+    protected abstract Class<? extends ViewProvider> getViewProviderClass();
 
+    /**
+     * Parses the given selection and returns a {@link Ref} suitable as input for
+     * this view, if one can be found.
+     * @param selection a selected element from the Hosts/VMs view
+     * @return a {@link Ref} parsed from selection
+     */
     protected abstract T getRefFromSelection(Object selection);
 
+    /**
+     * Returns a helpful message when the current selection in the Hosts/VMs
+     * view does not contain a {@link Ref} that this view can provide
+     * information for. This message should inform the user what they should
+     * select to receive data in this view.
+     * @return a message prompting the user to make a selection in the 
+     * Hosts/VMs view
+     */
     protected abstract String getNoSelectionMessage();
 
+    /**
+     * Returns the identifier for the {@link InformationService} that this
+     * ViewPart corresponds to. This identifier must have been set as a
+     * property with key {@link InformationService#KEY_SERVICE_ID} when the
+     * service was registered.
+     * @return the unique service ID for a specific implementation of
+     * {@link InformationService}
+     */
+    protected abstract String getInformationServiceID();
+
     @Override
     public void selectionChanged(IWorkbenchPart part, ISelection selection) {
         // We must have received createPartControl
@@ -157,12 +237,30 @@
     }
 
     private void createView(T ref) {
-        SWTComponent view = createControllerView(ref, top);
-        ViewVisibilityWatcher watcher = new ViewVisibilityWatcher(view);
-        watcher.watch(top, getSite().getId());
+        if (infoService != null) {
+            // Get the ViewProvider and set its parent Composite
+            Class<? extends ViewProvider> viewProviderClazz = getViewProviderClass();
+            ServiceReference<? extends ViewProvider> serviceRef = context.getServiceReference(viewProviderClazz);
+            SWTViewProvider viewProvider = (SWTViewProvider) context.getService(serviceRef);
+            viewProvider.setParent(top);
+            
+            // Instantiate the service's controller and view
+            InformationServiceController<T> controller = infoService.getInformationServiceController(ref);
+            SWTComponent view = (SWTComponent) controller.getView();
+            
+            // Register for view visibility updates
+            ViewVisibilityWatcher watcher = new ViewVisibilityWatcher(view);
+            watcher.watch(top, getSite().getId());
+            
+            context.ungetService(serviceRef);
+        }
     }
     
-    
+    private Filter createFilter() throws InvalidSyntaxException {
+        String filter = "(&(" + Constants.OBJECTCLASS + "="
+                + InformationService.class.getName() + ")("
+                + InformationService.KEY_SERVICE_ID + "=" + getInformationServiceID() + "))";
+        return FrameworkUtil.createFilter(filter);
+    }
 
 }
-
--- a/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/views/HostRefViewPart.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/views/HostRefViewPart.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,14 +36,16 @@
 
 package com.redhat.thermostat.eclipse.views;
 
+import org.osgi.framework.BundleContext;
+
 import com.redhat.thermostat.eclipse.internal.views.RefViewPart;
 import com.redhat.thermostat.storage.core.HostRef;
 import com.redhat.thermostat.storage.core.VmRef;
 
 public abstract class HostRefViewPart extends RefViewPart<HostRef> {
 
-    public HostRefViewPart() {
-        super();
+    public HostRefViewPart(BundleContext context) {
+        super(context);
     }
 
     @Override
--- a/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/views/VmRefViewPart.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/eclipse/com.redhat.thermostat.eclipse/src/com/redhat/thermostat/eclipse/views/VmRefViewPart.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,13 +36,15 @@
 
 package com.redhat.thermostat.eclipse.views;
 
+import org.osgi.framework.BundleContext;
+
 import com.redhat.thermostat.eclipse.internal.views.RefViewPart;
 import com.redhat.thermostat.storage.core.VmRef;
 
 public abstract class VmRefViewPart extends RefViewPart<VmRef> {
 
-    public VmRefViewPart() {
-        super();
+    public VmRefViewPart(BundleContext context) {
+        super(context);
     }
 
     @Override
--- a/host-cpu/client-core/src/main/java/com/redhat/thermostat/host/cpu/client/core/HostCpuService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/host-cpu/client-core/src/main/java/com/redhat/thermostat/host/cpu/client/core/HostCpuService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,48 +36,11 @@
 
 package com.redhat.thermostat.host.cpu.client.core;
 
-import com.redhat.thermostat.client.core.Filter;
 import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.common.utils.OSGIUtils;
-import com.redhat.thermostat.host.cpu.client.core.internal.HostCpuController;
-import com.redhat.thermostat.host.cpu.common.CpuStatDAO;
 import com.redhat.thermostat.storage.core.HostRef;
-import com.redhat.thermostat.storage.dao.HostInfoDAO;
-
-public class HostCpuService implements InformationService<HostRef> {
-    
-    private static final int ORDER = ORDER_CPU_GROUP;
-    private static final Filter<HostRef> FILTER = new NameMatchingRefFilter<>();
 
-    private ApplicationService appSvc;
-    private HostInfoDAO hostInfoDAO;
-    private CpuStatDAO cpuStatDAO;
-    
-    public HostCpuService(ApplicationService appSvc, HostInfoDAO hostInfoDAO, CpuStatDAO cpuStatDAO) {
-        this.appSvc = appSvc;
-        this.hostInfoDAO = hostInfoDAO;
-        this.cpuStatDAO = cpuStatDAO;
-    }
-
-    @Override
-    public Filter<HostRef> getFilter() {
-        return FILTER;
-    }
+public interface HostCpuService extends InformationService<HostRef> {
 
-    @Override
-    public InformationServiceController<HostRef> getInformationServiceController(
-            HostRef ref) {
-        HostCpuViewProvider provider = OSGIUtils.getInstance().getService(HostCpuViewProvider.class);
-        return new HostCpuController(appSvc, hostInfoDAO, cpuStatDAO, ref, provider);
-    }
+    public static final String SERVICE_ID = "com.redhat.thermostat.host.cpu";
 
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
-
-}
-
+}
\ No newline at end of file
--- a/host-cpu/client-core/src/main/java/com/redhat/thermostat/host/cpu/client/core/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/host-cpu/client-core/src/main/java/com/redhat/thermostat/host/cpu/client/core/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -51,6 +51,7 @@
 import com.redhat.thermostat.common.MultipleServiceTracker;
 import com.redhat.thermostat.common.MultipleServiceTracker.Action;
 import com.redhat.thermostat.host.cpu.client.core.HostCpuService;
+import com.redhat.thermostat.host.cpu.client.core.HostCpuViewProvider;
 import com.redhat.thermostat.host.cpu.common.CpuStatDAO;
 import com.redhat.thermostat.storage.core.HostRef;
 import com.redhat.thermostat.storage.dao.HostInfoDAO;
@@ -65,7 +66,8 @@
         Class<?>[] deps = new Class<?>[] {
             HostInfoDAO.class,
             CpuStatDAO.class,
-            ApplicationService.class
+            ApplicationService.class,
+            HostCpuViewProvider.class
         };
 
         tracker = new MultipleServiceTracker(context, deps, new Action() {
@@ -78,9 +80,13 @@
                 Objects.requireNonNull(cpuStatDAO);
                 ApplicationService appSvc = (ApplicationService) services.get(ApplicationService.class.getName());
                 Objects.requireNonNull(appSvc);
-                HostCpuService service = new HostCpuService(appSvc, hostInfoDAO, cpuStatDAO);
+                HostCpuViewProvider viewProvider = (HostCpuViewProvider) services.get(HostCpuViewProvider.class.getName());
+                Objects.requireNonNull(viewProvider);
+                
+                HostCpuService service = new HostCpuServiceImpl(appSvc, hostInfoDAO, cpuStatDAO, viewProvider);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, HostRef.class.getName());
+                properties.put(InformationService.KEY_SERVICE_ID, HostCpuService.SERVICE_ID);
                 reg = context.registerService(InformationService.class.getName(), service, properties);
             }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/host-cpu/client-core/src/main/java/com/redhat/thermostat/host/cpu/client/core/internal/HostCpuServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.host.cpu.client.core.internal;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.host.cpu.client.core.HostCpuService;
+import com.redhat.thermostat.host.cpu.client.core.HostCpuViewProvider;
+import com.redhat.thermostat.host.cpu.common.CpuStatDAO;
+import com.redhat.thermostat.storage.core.HostRef;
+import com.redhat.thermostat.storage.dao.HostInfoDAO;
+
+public class HostCpuServiceImpl implements HostCpuService {
+    
+    private static final int ORDER = ORDER_CPU_GROUP;
+    private static final Filter<HostRef> FILTER = new NameMatchingRefFilter<>();
+
+    private ApplicationService appSvc;
+    private HostInfoDAO hostInfoDAO;
+    private CpuStatDAO cpuStatDAO;
+    private HostCpuViewProvider viewProvider;
+    
+    public HostCpuServiceImpl(ApplicationService appSvc, HostInfoDAO hostInfoDAO,
+            CpuStatDAO cpuStatDAO, HostCpuViewProvider viewProvider) {
+        this.appSvc = appSvc;
+        this.hostInfoDAO = hostInfoDAO;
+        this.cpuStatDAO = cpuStatDAO;
+        this.viewProvider = viewProvider;
+    }
+
+    @Override
+    public Filter<HostRef> getFilter() {
+        return FILTER;
+    }
+
+    @Override
+    public InformationServiceController<HostRef> getInformationServiceController(
+            HostRef ref) {
+        return new HostCpuController(appSvc, hostInfoDAO, cpuStatDAO, ref, viewProvider);
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+
+}
+
--- a/host-cpu/client-core/src/test/java/com/redhat/thermostat/host/cpu/client/core/internal/ActivatorTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/host-cpu/client-core/src/test/java/com/redhat/thermostat/host/cpu/client/core/internal/ActivatorTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -45,7 +45,7 @@
 
 import com.redhat.thermostat.client.core.InformationService;
 import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.host.cpu.client.core.HostCpuService;
+import com.redhat.thermostat.host.cpu.client.core.HostCpuViewProvider;
 import com.redhat.thermostat.host.cpu.common.CpuStatDAO;
 import com.redhat.thermostat.storage.dao.HostInfoDAO;
 import com.redhat.thermostat.testutils.StubBundleContext;
@@ -72,21 +72,23 @@
         HostInfoDAO hostInfoDAO = mock(HostInfoDAO.class);
         CpuStatDAO cpuStatDAO = mock(CpuStatDAO.class);
         ApplicationService appSvc = mock(ApplicationService.class);
+        HostCpuViewProvider viewProvider = mock(HostCpuViewProvider.class);
 
         context.registerService(HostInfoDAO.class, hostInfoDAO, null);
         context.registerService(CpuStatDAO.class, cpuStatDAO, null);
         context.registerService(ApplicationService.class, appSvc, null);
+        context.registerService(HostCpuViewProvider.class, viewProvider, null);
 
         Activator activator = new Activator();
 
         activator.start(context);
 
-        assertTrue(context.isServiceRegistered(InformationService.class.getName(), HostCpuService.class));
+        assertTrue(context.isServiceRegistered(InformationService.class.getName(), HostCpuServiceImpl.class));
 
         activator.stop(context);
 
         assertEquals(0, context.getServiceListeners().size());
-        assertEquals(3, context.getAllServices().size());
+        assertEquals(4, context.getAllServices().size());
     }
 
 }
--- a/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/HostMemoryService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/HostMemoryService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,48 +36,11 @@
 
 package com.redhat.thermostat.host.memory.client.core;
 
-import com.redhat.thermostat.client.core.Filter;
 import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.common.utils.OSGIUtils;
-import com.redhat.thermostat.host.memory.client.core.internal.HostMemoryController;
-import com.redhat.thermostat.host.memory.common.MemoryStatDAO;
 import com.redhat.thermostat.storage.core.HostRef;
-import com.redhat.thermostat.storage.dao.HostInfoDAO;
-
-public class HostMemoryService implements InformationService<HostRef> {
-    
-    private static final int ORDER = ORDER_MEMORY_GROUP;
-    private static final Filter<HostRef> FILTER = new NameMatchingRefFilter<>();
 
-    private ApplicationService appSvc;
-    private HostInfoDAO hostInfoDAO;
-    private MemoryStatDAO memoryStatDAO;
-    
-    public HostMemoryService(ApplicationService appSvc, HostInfoDAO hostInfoDAO, MemoryStatDAO memoryStatDAO) {
-        this.appSvc = appSvc;
-        this.hostInfoDAO = hostInfoDAO;
-        this.memoryStatDAO = memoryStatDAO;
-    }
+public interface HostMemoryService extends InformationService<HostRef> {
 
-    @Override
-    public Filter<HostRef> getFilter() {
-        return FILTER;
-    }
-
-    @Override
-    public InformationServiceController<HostRef> getInformationServiceController(
-            HostRef ref) {
-        HostMemoryViewProvider provider = OSGIUtils.getInstance().getService(HostMemoryViewProvider.class);
-        return new HostMemoryController(appSvc, hostInfoDAO, memoryStatDAO, ref, provider);
-    }
-
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
+    public static final String SERVICE_ID = "com.redhat.thermostat.host.memory";
 
 }
-
--- a/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -51,6 +51,7 @@
 import com.redhat.thermostat.common.MultipleServiceTracker;
 import com.redhat.thermostat.common.MultipleServiceTracker.Action;
 import com.redhat.thermostat.host.memory.client.core.HostMemoryService;
+import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider;
 import com.redhat.thermostat.host.memory.common.MemoryStatDAO;
 import com.redhat.thermostat.storage.core.HostRef;
 import com.redhat.thermostat.storage.dao.HostInfoDAO;
@@ -65,7 +66,8 @@
         Class<?>[] deps = new Class<?>[] {
             HostInfoDAO.class,
             MemoryStatDAO.class,
-            ApplicationService.class
+            ApplicationService.class,
+            HostMemoryViewProvider.class
         };
 
         tracker = new MultipleServiceTracker(context, deps, new Action() {
@@ -78,9 +80,13 @@
                 Objects.requireNonNull(memoryStatDAO);
                 ApplicationService appSvc = (ApplicationService) services.get(ApplicationService.class.getName());
                 Objects.requireNonNull(appSvc);
-                HostMemoryService service = new HostMemoryService(appSvc, hostInfoDAO, memoryStatDAO);
+                HostMemoryViewProvider viewProvider = (HostMemoryViewProvider) services.get(HostMemoryViewProvider.class.getName());
+                Objects.requireNonNull(viewProvider);
+                
+                HostMemoryService service = new HostMemoryServiceImpl(appSvc, hostInfoDAO, memoryStatDAO, viewProvider);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, HostRef.class.getName());
+                properties.put(InformationService.KEY_SERVICE_ID, HostMemoryService.SERVICE_ID);
                 reg = context.registerService(InformationService.class.getName(), service, properties);
             }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/internal/HostMemoryServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.host.memory.client.core.internal;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.host.memory.client.core.HostMemoryService;
+import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider;
+import com.redhat.thermostat.host.memory.common.MemoryStatDAO;
+import com.redhat.thermostat.storage.core.HostRef;
+import com.redhat.thermostat.storage.dao.HostInfoDAO;
+
+public class HostMemoryServiceImpl implements HostMemoryService {
+    
+    private static final int ORDER = ORDER_MEMORY_GROUP;
+    private static final Filter<HostRef> FILTER = new NameMatchingRefFilter<>();
+
+    private ApplicationService appSvc;
+    private HostInfoDAO hostInfoDAO;
+    private MemoryStatDAO memoryStatDAO;
+    private HostMemoryViewProvider viewProvider;
+    
+    public HostMemoryServiceImpl(ApplicationService appSvc,
+            HostInfoDAO hostInfoDAO, MemoryStatDAO memoryStatDAO,
+            HostMemoryViewProvider viewProvider) {
+        this.appSvc = appSvc;
+        this.hostInfoDAO = hostInfoDAO;
+        this.memoryStatDAO = memoryStatDAO;
+        this.viewProvider = viewProvider;
+    }
+
+    @Override
+    public Filter<HostRef> getFilter() {
+        return FILTER;
+    }
+
+    @Override
+    public InformationServiceController<HostRef> getInformationServiceController(
+            HostRef ref) {
+        return new HostMemoryController(appSvc, hostInfoDAO, memoryStatDAO, ref, viewProvider);
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+
+}
+
--- a/host-memory/client-core/src/test/java/com/redhat/thermostat/host/memory/client/core/internal/ActivatorTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/host-memory/client-core/src/test/java/com/redhat/thermostat/host/memory/client/core/internal/ActivatorTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -45,7 +45,7 @@
 
 import com.redhat.thermostat.client.core.InformationService;
 import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.host.memory.client.core.HostMemoryService;
+import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider;
 import com.redhat.thermostat.host.memory.common.MemoryStatDAO;
 import com.redhat.thermostat.storage.dao.HostInfoDAO;
 import com.redhat.thermostat.testutils.StubBundleContext;
@@ -74,21 +74,23 @@
         HostInfoDAO hostInfoDAO = mock(HostInfoDAO.class);
         MemoryStatDAO memoryStatDAO = mock(MemoryStatDAO.class);
         ApplicationService appSvc = mock(ApplicationService.class);
+        HostMemoryViewProvider viewProvider = mock(HostMemoryViewProvider.class);
 
         context.registerService(HostInfoDAO.class, hostInfoDAO, null);
         context.registerService(MemoryStatDAO.class, memoryStatDAO, null);
         context.registerService(ApplicationService.class, appSvc, null);
+        context.registerService(HostMemoryViewProvider.class, viewProvider, null);
 
         Activator activator = new Activator();
 
         activator.start(context);
 
-        assertTrue(context.isServiceRegistered(InformationService.class.getName(), HostMemoryService.class));
+        assertTrue(context.isServiceRegistered(InformationService.class.getName(), HostMemoryServiceImpl.class));
 
         activator.stop(context);
 
         assertEquals(0, context.getServiceListeners().size());
-        assertEquals(3, context.getAllServices().size());
+        assertEquals(4, context.getAllServices().size());
     }
 
 }
--- a/host-overview/client-core/src/main/java/com/redhat/thermostat/host/overview/client/core/HostOverviewService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/host-overview/client-core/src/main/java/com/redhat/thermostat/host/overview/client/core/HostOverviewService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,48 +36,11 @@
 
 package com.redhat.thermostat.host.overview.client.core;
 
-import com.redhat.thermostat.client.core.Filter;
 import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.common.utils.OSGIUtils;
-import com.redhat.thermostat.host.overview.client.core.internal.HostOverviewController;
 import com.redhat.thermostat.storage.core.HostRef;
-import com.redhat.thermostat.storage.dao.HostInfoDAO;
-import com.redhat.thermostat.storage.dao.NetworkInterfaceInfoDAO;
-
-public class HostOverviewService implements InformationService<HostRef> {
-    
-    private static final int ORDER = ORDER_DEFAULT_GROUP;
-    private static final Filter<HostRef> FILTER = new NameMatchingRefFilter<>();
 
-    private ApplicationService appSvc;
-    private HostInfoDAO hostInfoDAO;
-    private NetworkInterfaceInfoDAO networkInfoDAO;
-    
-    public HostOverviewService(ApplicationService appSvc, HostInfoDAO hostInfoDAO, NetworkInterfaceInfoDAO networkInfoDAO) {
-        this.appSvc = appSvc;
-        this.hostInfoDAO = hostInfoDAO;
-        this.networkInfoDAO = networkInfoDAO;
-    }
-
-    @Override
-    public Filter<HostRef> getFilter() {
-        return FILTER;
-    }
+public interface HostOverviewService extends InformationService<HostRef> {
 
-    @Override
-    public InformationServiceController<HostRef> getInformationServiceController(
-            HostRef ref) {
-        HostOverviewViewProvider provider = OSGIUtils.getInstance().getService(HostOverviewViewProvider.class);
-        return new HostOverviewController(appSvc, hostInfoDAO, networkInfoDAO, ref, provider);
-    }
+    public static final String SERVICE_ID = "com.redhat.thermostat.host.overview";
 
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
-
-}
-
+}
\ No newline at end of file
--- a/host-overview/client-core/src/main/java/com/redhat/thermostat/host/overview/client/core/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/host-overview/client-core/src/main/java/com/redhat/thermostat/host/overview/client/core/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -51,6 +51,7 @@
 import com.redhat.thermostat.common.MultipleServiceTracker;
 import com.redhat.thermostat.common.MultipleServiceTracker.Action;
 import com.redhat.thermostat.host.overview.client.core.HostOverviewService;
+import com.redhat.thermostat.host.overview.client.core.HostOverviewViewProvider;
 import com.redhat.thermostat.storage.core.HostRef;
 import com.redhat.thermostat.storage.dao.HostInfoDAO;
 import com.redhat.thermostat.storage.dao.NetworkInterfaceInfoDAO;
@@ -65,7 +66,8 @@
         Class<?>[] deps = new Class<?>[] {
             HostInfoDAO.class,
             NetworkInterfaceInfoDAO.class,
-            ApplicationService.class
+            ApplicationService.class,
+            HostOverviewViewProvider.class
         };
 
         tracker = new MultipleServiceTracker(context, deps, new Action() {
@@ -79,9 +81,14 @@
                 Objects.requireNonNull(networkInfoDAO);
                 ApplicationService appSvc = (ApplicationService) services.get(ApplicationService.class.getName());
                 Objects.requireNonNull(appSvc);
-                HostOverviewService service = new HostOverviewService(appSvc, hostInfoDAO, networkInfoDAO);
+                HostOverviewViewProvider viewProvider = (HostOverviewViewProvider) services
+                        .get(HostOverviewViewProvider.class.getName());
+                Objects.requireNonNull(viewProvider);
+                
+                HostOverviewService service = new HostOverviewServiceImpl(appSvc, hostInfoDAO, networkInfoDAO, viewProvider);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, HostRef.class.getName());
+                properties.put(InformationService.KEY_SERVICE_ID, HostOverviewService.SERVICE_ID);
                 reg = context.registerService(InformationService.class.getName(), service, properties);
             }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/host-overview/client-core/src/main/java/com/redhat/thermostat/host/overview/client/core/internal/HostOverviewServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.host.overview.client.core.internal;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.host.overview.client.core.HostOverviewService;
+import com.redhat.thermostat.host.overview.client.core.HostOverviewViewProvider;
+import com.redhat.thermostat.storage.core.HostRef;
+import com.redhat.thermostat.storage.dao.HostInfoDAO;
+import com.redhat.thermostat.storage.dao.NetworkInterfaceInfoDAO;
+
+public class HostOverviewServiceImpl implements HostOverviewService {
+    
+    private static final int ORDER = ORDER_DEFAULT_GROUP;
+    private static final Filter<HostRef> FILTER = new NameMatchingRefFilter<>();
+
+    private ApplicationService appSvc;
+    private HostInfoDAO hostInfoDAO;
+    private NetworkInterfaceInfoDAO networkInfoDAO;
+    private HostOverviewViewProvider viewProvider;
+    
+    public HostOverviewServiceImpl(ApplicationService appSvc,
+            HostInfoDAO hostInfoDAO, NetworkInterfaceInfoDAO networkInfoDAO,
+            HostOverviewViewProvider viewProvider) {
+        this.appSvc = appSvc;
+        this.hostInfoDAO = hostInfoDAO;
+        this.networkInfoDAO = networkInfoDAO;
+        this.viewProvider = viewProvider;
+    }
+
+    @Override
+    public Filter<HostRef> getFilter() {
+        return FILTER;
+    }
+
+    @Override
+    public InformationServiceController<HostRef> getInformationServiceController(
+            HostRef ref) {
+        return new HostOverviewController(appSvc, hostInfoDAO, networkInfoDAO, ref, viewProvider);
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+
+}
+
--- a/host-overview/client-core/src/test/java/com/redhat/thermostat/host/overview/client/core/internal/ActivatorTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/host-overview/client-core/src/test/java/com/redhat/thermostat/host/overview/client/core/internal/ActivatorTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -45,7 +45,7 @@
 
 import com.redhat.thermostat.client.core.InformationService;
 import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.host.overview.client.core.HostOverviewService;
+import com.redhat.thermostat.host.overview.client.core.HostOverviewViewProvider;
 import com.redhat.thermostat.storage.dao.HostInfoDAO;
 import com.redhat.thermostat.storage.dao.NetworkInterfaceInfoDAO;
 import com.redhat.thermostat.testutils.StubBundleContext;
@@ -72,21 +72,23 @@
         HostInfoDAO hostInfoDAO = mock(HostInfoDAO.class);
         NetworkInterfaceInfoDAO networkInfoDAO = mock(NetworkInterfaceInfoDAO.class);
         ApplicationService appSvc = mock(ApplicationService.class);
+        HostOverviewViewProvider viewProvider = mock(HostOverviewViewProvider.class);
 
         context.registerService(HostInfoDAO.class, hostInfoDAO, null);
         context.registerService(NetworkInterfaceInfoDAO.class, networkInfoDAO, null);
         context.registerService(ApplicationService.class, appSvc, null);
+        context.registerService(HostOverviewViewProvider.class, viewProvider, null);
 
         Activator activator = new Activator();
 
         activator.start(context);
 
-        assertTrue(context.isServiceRegistered(InformationService.class.getName(), HostOverviewService.class));
+        assertTrue(context.isServiceRegistered(InformationService.class.getName(), HostOverviewServiceImpl.class));
 
         activator.stop(context);
 
         assertEquals(0, context.getServiceListeners().size());
-        assertEquals(3, context.getAllServices().size());
+        assertEquals(4, context.getAllServices().size());
     }
 
 }
--- a/numa/client-core/src/main/java/com/redhat/thermostat/numa/client/core/NumaInformationService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/numa/client-core/src/main/java/com/redhat/thermostat/numa/client/core/NumaInformationService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,44 +36,11 @@
 
 package com.redhat.thermostat.numa.client.core;
 
-import com.redhat.thermostat.client.core.Filter;
 import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.numa.client.core.internal.NumaController;
-import com.redhat.thermostat.numa.common.NumaDAO;
 import com.redhat.thermostat.storage.core.HostRef;
 
-public class NumaInformationService implements InformationService<HostRef> {
+public interface NumaInformationService extends InformationService<HostRef> {
     
-    private static final int ORDER = ORDER_MEMORY_GROUP;
-    private static final Filter<HostRef> FILTER = new NameMatchingRefFilter<>();
-
-    private ApplicationService appSvc;
-    private NumaDAO numaDAO;
-    private NumaViewProvider numaViewProvider;
-
-    public NumaInformationService(ApplicationService appSvc, NumaDAO numaDAO, NumaViewProvider numaViewProvider) {
-        this.appSvc = appSvc;
-        this.numaDAO = numaDAO;
-        this.numaViewProvider = numaViewProvider;
-    }
-
-    @Override
-    public Filter<HostRef> getFilter() {
-        return FILTER;
-    }
-
-    @Override
-    public InformationServiceController<HostRef> getInformationServiceController(HostRef ref) {
-        return new NumaController(appSvc, numaDAO, ref, numaViewProvider);
-    }
-
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
+    public static final String SERVICE_ID = "com.redhat.thermostat.host.numa";
 
 }
-
--- a/numa/client-core/src/main/java/com/redhat/thermostat/numa/client/core/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/numa/client-core/src/main/java/com/redhat/thermostat/numa/client/core/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -78,9 +78,10 @@
                 Objects.requireNonNull(appSvc);
                 NumaViewProvider numaViewProvider = (NumaViewProvider) services.get(NumaViewProvider.class.getName());
                 Objects.requireNonNull(numaViewProvider);
-                NumaInformationService service = new NumaInformationService(appSvc, numaDAO, numaViewProvider);
+                NumaInformationServiceImpl service = new NumaInformationServiceImpl(appSvc, numaDAO, numaViewProvider);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, HostRef.class.getName());
+                properties.put(InformationService.KEY_SERVICE_ID, NumaInformationService.SERVICE_ID);
                 reg = context.registerService(InformationService.class.getName(), service, properties);
             }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/numa/client-core/src/main/java/com/redhat/thermostat/numa/client/core/internal/NumaInformationServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.numa.client.core.internal;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.numa.client.core.NumaInformationService;
+import com.redhat.thermostat.numa.client.core.NumaViewProvider;
+import com.redhat.thermostat.numa.common.NumaDAO;
+import com.redhat.thermostat.storage.core.HostRef;
+
+public class NumaInformationServiceImpl implements NumaInformationService {
+    
+    private static final int ORDER = ORDER_MEMORY_GROUP;
+    private static final Filter<HostRef> FILTER = new NameMatchingRefFilter<>();
+
+    private ApplicationService appSvc;
+    private NumaDAO numaDAO;
+    private NumaViewProvider numaViewProvider;
+
+    public NumaInformationServiceImpl(ApplicationService appSvc, NumaDAO numaDAO, NumaViewProvider numaViewProvider) {
+        this.appSvc = appSvc;
+        this.numaDAO = numaDAO;
+        this.numaViewProvider = numaViewProvider;
+    }
+
+    @Override
+    public Filter<HostRef> getFilter() {
+        return FILTER;
+    }
+
+    @Override
+    public InformationServiceController<HostRef> getInformationServiceController(HostRef ref) {
+        return new NumaController(appSvc, numaDAO, ref, numaViewProvider);
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+
+}
+
--- a/numa/client-core/src/test/java/com/redhat/thermostat/numa/client/core/NumaInformationServiceTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/numa/client-core/src/test/java/com/redhat/thermostat/numa/client/core/NumaInformationServiceTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -45,6 +45,7 @@
 import com.redhat.thermostat.common.Timer;
 import com.redhat.thermostat.common.TimerFactory;
 import com.redhat.thermostat.numa.client.core.internal.NumaController;
+import com.redhat.thermostat.numa.client.core.internal.NumaInformationServiceImpl;
 import com.redhat.thermostat.numa.common.NumaDAO;
 import com.redhat.thermostat.storage.core.HostRef;
 
@@ -64,7 +65,7 @@
         NumaView view = mock(NumaView.class);
         when(numaViewProvider.createView()).thenReturn(view);
 
-        NumaInformationService numaInfoService = new NumaInformationService(appSvc, numaDAO, numaViewProvider);
+        NumaInformationServiceImpl numaInfoService = new NumaInformationServiceImpl(appSvc, numaDAO, numaViewProvider);
 
         int order = numaInfoService.getOrderValue();
         assertEquals(Ordered.ORDER_MEMORY_GROUP, order);
--- a/numa/client-core/src/test/java/com/redhat/thermostat/numa/client/core/internal/ActivatorTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/numa/client-core/src/test/java/com/redhat/thermostat/numa/client/core/internal/ActivatorTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -45,7 +45,6 @@
 
 import com.redhat.thermostat.client.core.InformationService;
 import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.numa.client.core.NumaInformationService;
 import com.redhat.thermostat.numa.client.core.NumaViewProvider;
 import com.redhat.thermostat.numa.common.NumaDAO;
 import com.redhat.thermostat.testutils.StubBundleContext;
@@ -83,7 +82,7 @@
 
         activator.start(context);
 
-        assertTrue(context.isServiceRegistered(InformationService.class.getName(), NumaInformationService.class));
+        assertTrue(context.isServiceRegistered(InformationService.class.getName(), NumaInformationServiceImpl.class));
 
         activator.stop(context);
 
--- a/thread/client-controllers/pom.xml	Thu Jan 31 14:40:22 2013 -0500
+++ b/thread/client-controllers/pom.xml	Thu Jan 31 14:42:17 2013 -0500
@@ -120,6 +120,9 @@
             <Bundle-Vendor>Red Hat, Inc.</Bundle-Vendor>
             <Bundle-Activator>com.redhat.thermostat.thread.client.controller.osgi.Activator</Bundle-Activator>
             <Bundle-SymbolicName>com.redhat.thermostat.thread.client.controller</Bundle-SymbolicName>
+            <Export-Package>
+              com.redhat.thermostat.thread.client.controller
+            </Export-Package>
             <Private-Package>
               com.redhat.thermostat.thread.client.controller.osgi,
               com.redhat.thermostat.thread.client.controller.impl,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/ThreadInformationService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.thread.client.controller;
+
+import com.redhat.thermostat.client.core.InformationService;
+import com.redhat.thermostat.storage.core.VmRef;
+
+public interface ThreadInformationService extends InformationService<VmRef> {
+
+    public static final String SERVICE_ID = "com.redhat.thermostat.vm.thread";
+
+}
--- a/thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/impl/ThreadInformationService.java	Thu Jan 31 14:40:22 2013 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/*
- * Copyright 2012, 2013 Red Hat, Inc.
- *
- * This file is part of Thermostat.
- *
- * Thermostat is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published
- * by the Free Software Foundation; either version 2, or (at your
- * option) any later version.
- *
- * Thermostat is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Thermostat; see the file COPYING.  If not see
- * <http://www.gnu.org/licenses/>.
- *
- * Linking this code with other modules is making a combined work
- * based on this code.  Thus, the terms and conditions of the GNU
- * General Public License cover the whole combination.
- *
- * As a special exception, the copyright holders of this code give
- * you permission to link this code with independent modules to
- * produce an executable, regardless of the license terms of these
- * independent modules, and to copy and distribute the resulting
- * executable under terms of your choice, provided that you also
- * meet, for each linked independent module, the terms and conditions
- * of the license of that module.  An independent module is a module
- * which is not derived from or based on this code.  If you modify
- * this code, you may extend this exception to your version of the
- * library, but you are not obligated to do so.  If you do not wish
- * to do so, delete this exception statement from your version.
- */
-
-package com.redhat.thermostat.thread.client.controller.impl;
-
-import com.redhat.thermostat.client.core.Filter;
-import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.storage.core.VmRef;
-import com.redhat.thermostat.storage.dao.VmInfoDAO;
-import com.redhat.thermostat.thread.client.common.ThreadViewProvider;
-import com.redhat.thermostat.thread.client.common.collector.ThreadCollectorFactory;
-
-public class ThreadInformationService implements InformationService<VmRef> {
-
-    private static final int ORDER = ORDER_THREAD_GROUP;
-    
-    private Filter<VmRef> filter = new NameMatchingRefFilter<>();
-    private ApplicationService service;
-    private VmInfoDAO vmInfoDao;
-    private ThreadCollectorFactory collectorFactory;
-    private ThreadViewProvider viewFactory;
-    
-    public ThreadInformationService(ApplicationService appService, VmInfoDAO vmInfoDao,
-                                    ThreadCollectorFactory collectorFactory,
-                                    ThreadViewProvider viewFactory)
-    {
-        this.service = appService;
-        this.vmInfoDao = vmInfoDao;
-        this.collectorFactory = collectorFactory;
-        this.viewFactory = viewFactory;
-    }
-    
-    @Override
-    public Filter<VmRef> getFilter() {
-        return filter;
-    }
-
-    @Override
-    public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        return new ThreadInformationController(ref, service, vmInfoDao, collectorFactory, viewFactory);
-    }
-
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
-
-}
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/impl/ThreadInformationServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.thread.client.controller.impl;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.storage.core.VmRef;
+import com.redhat.thermostat.storage.dao.VmInfoDAO;
+import com.redhat.thermostat.thread.client.common.ThreadViewProvider;
+import com.redhat.thermostat.thread.client.common.collector.ThreadCollectorFactory;
+import com.redhat.thermostat.thread.client.controller.ThreadInformationService;
+
+public class ThreadInformationServiceImpl implements ThreadInformationService {
+    
+    private static final int ORDER = ORDER_THREAD_GROUP;
+    
+    private Filter<VmRef> filter = new NameMatchingRefFilter<>();
+    private ApplicationService service;
+    private VmInfoDAO vmInfoDao;
+    private ThreadCollectorFactory collectorFactory;
+    private ThreadViewProvider viewFactory;
+    
+    public ThreadInformationServiceImpl(ApplicationService appService, VmInfoDAO vmInfoDao,
+                                    ThreadCollectorFactory collectorFactory,
+                                    ThreadViewProvider viewFactory)
+    {
+        this.service = appService;
+        this.vmInfoDao = vmInfoDao;
+        this.collectorFactory = collectorFactory;
+        this.viewFactory = viewFactory;
+    }
+    
+    @Override
+    public Filter<VmRef> getFilter() {
+        return filter;
+    }
+
+    @Override
+    public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
+        return new ThreadInformationController(ref, service, vmInfoDao, collectorFactory, viewFactory);
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+
+}
+
--- a/thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/osgi/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/thread/client-controllers/src/main/java/com/redhat/thermostat/thread/client/controller/osgi/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -54,7 +54,8 @@
 import com.redhat.thermostat.storage.dao.VmInfoDAO;
 import com.redhat.thermostat.thread.client.common.ThreadViewProvider;
 import com.redhat.thermostat.thread.client.common.collector.ThreadCollectorFactory;
-import com.redhat.thermostat.thread.client.controller.impl.ThreadInformationService;
+import com.redhat.thermostat.thread.client.controller.ThreadInformationService;
+import com.redhat.thermostat.thread.client.controller.impl.ThreadInformationServiceImpl;
 
 public class Activator implements BundleActivator {
 
@@ -80,9 +81,10 @@
                 VmInfoDAO vmInfoDao = Objects.requireNonNull((VmInfoDAO) services.get(VmInfoDAO.class.getName()));
                 ThreadViewProvider viewFactory = (ThreadViewProvider) services.get(ThreadViewProvider.class.getName());
                 
-                InformationService<VmRef> vmInfoService = new ThreadInformationService(applicationService, vmInfoDao, collectorFactory, viewFactory);
+                ThreadInformationService vmInfoService = new ThreadInformationServiceImpl(applicationService, vmInfoDao, collectorFactory, viewFactory);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, VmRef.class.getName());
+                properties.put(InformationService.KEY_SERVICE_ID, ThreadInformationService.SERVICE_ID);
                 registration = context.registerService(InformationService.class.getName(), vmInfoService, properties);
             }
 
--- a/vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/VmClassStatService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/VmClassStatService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,43 +36,11 @@
 
 package com.redhat.thermostat.vm.classstat.client.core;
 
-import com.redhat.thermostat.client.core.Filter;
 import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.common.utils.OSGIUtils;
 import com.redhat.thermostat.storage.core.VmRef;
-import com.redhat.thermostat.vm.classstat.client.core.internal.VmClassStatController;
-import com.redhat.thermostat.vm.classstat.common.VmClassStatDAO;
-
-public class VmClassStatService implements InformationService<VmRef> {
-
-    private static final int ORDER = ORDER_MEMORY_GROUP + 20;
-    private Filter<VmRef> filter = new NameMatchingRefFilter<>();
-
-    private ApplicationService appSvc;
-    private VmClassStatDAO vmClassStatDao;
 
-    public VmClassStatService(ApplicationService appSvc, VmClassStatDAO vmClassStatDao) {
-        this.appSvc = appSvc;
-        this.vmClassStatDao = vmClassStatDao;
-    }
-    
-    @Override
-    public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        VmClassStatViewProvider viewProvider = OSGIUtils.getInstance().getService(VmClassStatViewProvider.class);
-        return new VmClassStatController(appSvc, vmClassStatDao, ref, viewProvider);
-    }
+public interface VmClassStatService extends InformationService<VmRef> {
 
-    @Override
-    public Filter<VmRef> getFilter() {
-        return filter;
-    }
+    public static final String SERVICE_ID = "com.redhat.thermostat.vm.classstat";
 
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
 }
-
--- a/vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -52,6 +52,7 @@
 import com.redhat.thermostat.common.MultipleServiceTracker.Action;
 import com.redhat.thermostat.storage.core.VmRef;
 import com.redhat.thermostat.vm.classstat.client.core.VmClassStatService;
+import com.redhat.thermostat.vm.classstat.client.core.VmClassStatViewProvider;
 import com.redhat.thermostat.vm.classstat.common.VmClassStatDAO;
 
 public class Activator implements BundleActivator {
@@ -64,6 +65,7 @@
         Class<?>[] deps = new Class<?>[] {
             ApplicationService.class,
             VmClassStatDAO.class,
+            VmClassStatViewProvider.class
         };
 
         tracker = new MultipleServiceTracker(context, deps, new Action() {
@@ -74,9 +76,13 @@
                 Objects.requireNonNull(dao);
                 ApplicationService appSvc = (ApplicationService) services.get(ApplicationService.class.getName());
                 Objects.requireNonNull(appSvc);
-                VmClassStatService service = new VmClassStatService(appSvc, dao);
+                VmClassStatViewProvider viewProvider = (VmClassStatViewProvider) services.get(VmClassStatViewProvider.class.getName());
+                Objects.requireNonNull(viewProvider);
+                
+                VmClassStatService service = new VmClassStatServiceImpl(appSvc, dao, viewProvider);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, VmRef.class.getName());
+                properties.put(InformationService.KEY_SERVICE_ID, VmClassStatService.SERVICE_ID);
                 reg = context.registerService(InformationService.class.getName(), service, properties);
             }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vm-classstat/client-core/src/main/java/com/redhat/thermostat/vm/classstat/client/core/internal/VmClassStatServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.vm.classstat.client.core.internal;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.storage.core.VmRef;
+import com.redhat.thermostat.vm.classstat.client.core.VmClassStatService;
+import com.redhat.thermostat.vm.classstat.client.core.VmClassStatViewProvider;
+import com.redhat.thermostat.vm.classstat.common.VmClassStatDAO;
+
+public class VmClassStatServiceImpl implements VmClassStatService {
+    
+    private static final int ORDER = ORDER_MEMORY_GROUP + 20;
+    private Filter<VmRef> filter = new NameMatchingRefFilter<>();
+
+    private ApplicationService appSvc;
+    private VmClassStatDAO vmClassStatDao;
+    private VmClassStatViewProvider viewProvider;
+
+    public VmClassStatServiceImpl(ApplicationService appSvc,
+            VmClassStatDAO vmClassStatDao, VmClassStatViewProvider viewProvider) {
+        this.appSvc = appSvc;
+        this.vmClassStatDao = vmClassStatDao;
+        this.viewProvider = viewProvider;
+    }
+    
+    @Override
+    public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
+        return new VmClassStatController(appSvc, vmClassStatDao, ref, viewProvider);
+    }
+
+    @Override
+    public Filter<VmRef> getFilter() {
+        return filter;
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+}
+
--- a/vm-classstat/client-core/src/test/java/com/redhat/thermostat/vm/classstat/client/core/internal/ActivatorTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-classstat/client-core/src/test/java/com/redhat/thermostat/vm/classstat/client/core/internal/ActivatorTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -46,7 +46,7 @@
 import com.redhat.thermostat.client.core.InformationService;
 import com.redhat.thermostat.common.ApplicationService;
 import com.redhat.thermostat.testutils.StubBundleContext;
-import com.redhat.thermostat.vm.classstat.client.core.VmClassStatService;
+import com.redhat.thermostat.vm.classstat.client.core.VmClassStatViewProvider;
 import com.redhat.thermostat.vm.classstat.common.VmClassStatDAO;
 
 public class ActivatorTest {
@@ -72,20 +72,22 @@
         StubBundleContext context = new StubBundleContext();
         ApplicationService appService = mock(ApplicationService.class);
         VmClassStatDAO daoService = mock(VmClassStatDAO.class);
+        VmClassStatViewProvider viewProvider = mock(VmClassStatViewProvider.class);
 
         context.registerService(ApplicationService.class, appService, null);
         context.registerService(VmClassStatDAO.class, daoService, null);
+        context.registerService(VmClassStatViewProvider.class, viewProvider, null);
 
         Activator activator = new Activator();
 
         activator.start(context);
 
-        assertTrue(context.isServiceRegistered(InformationService.class.getName(), VmClassStatService.class));
+        assertTrue(context.isServiceRegistered(InformationService.class.getName(), VmClassStatServiceImpl.class));
 
         activator.stop(context);
 
         assertEquals(0, context.getServiceListeners().size());
-        assertEquals(2, context.getAllServices().size());
+        assertEquals(3, context.getAllServices().size());
     }
 
 }
--- a/vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/VmCpuService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/VmCpuService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,45 +36,11 @@
 
 package com.redhat.thermostat.vm.cpu.client.core;
 
-import com.redhat.thermostat.client.core.Filter;
 import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.common.utils.OSGIUtils;
 import com.redhat.thermostat.storage.core.VmRef;
-import com.redhat.thermostat.vm.cpu.client.core.internal.VmCpuController;
-import com.redhat.thermostat.vm.cpu.common.VmCpuStatDAO;
-
-public class VmCpuService implements InformationService<VmRef> {
-    
-    private static final int ORDER = ORDER_CPU_GROUP;
-    private static final Filter<VmRef> FILTER = new NameMatchingRefFilter<>();
 
-    private ApplicationService appSvc;
-    private VmCpuStatDAO vmCpuStatDAO;
-    
-    public VmCpuService(ApplicationService appSvc, VmCpuStatDAO vmCpuStatDAO) {
-        this.appSvc = appSvc;
-        this.vmCpuStatDAO = vmCpuStatDAO;
-    }
+public interface VmCpuService extends InformationService<VmRef> {
 
-    @Override
-    public InformationServiceController<VmRef> getInformationServiceController(
-            VmRef ref) {
-        VmCpuViewProvider provider = OSGIUtils.getInstance().getService(VmCpuViewProvider.class);
-        return new VmCpuController(appSvc, vmCpuStatDAO, ref, provider);
-    }
-
-    @Override
-    public Filter<VmRef> getFilter() {
-        return FILTER;
-    }
-
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
+    public static final String SERVICE_ID = "com.redhat.thermostat.vm.cpu";
 
 }
-
--- a/vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -52,6 +52,7 @@
 import com.redhat.thermostat.common.MultipleServiceTracker.Action;
 import com.redhat.thermostat.storage.core.VmRef;
 import com.redhat.thermostat.vm.cpu.client.core.VmCpuService;
+import com.redhat.thermostat.vm.cpu.client.core.VmCpuViewProvider;
 import com.redhat.thermostat.vm.cpu.common.VmCpuStatDAO;
 
 public class Activator implements BundleActivator {
@@ -63,7 +64,8 @@
     public void start(final BundleContext context) throws Exception {
         Class<?>[] deps = new Class<?>[] {
                 VmCpuStatDAO.class,
-                ApplicationService.class
+                ApplicationService.class,
+                VmCpuViewProvider.class
         };
 
         tracker = new MultipleServiceTracker(context, deps , new Action() {
@@ -74,9 +76,13 @@
                 Objects.requireNonNull(vmCpuStatDAO);
                 ApplicationService appSvc = (ApplicationService) services.get(ApplicationService.class.getName());
                 Objects.requireNonNull(appSvc);
-                VmCpuService service = new VmCpuService(appSvc, vmCpuStatDAO);
+                VmCpuViewProvider viewProvider = (VmCpuViewProvider) services.get(VmCpuViewProvider.class.getName());
+                Objects.requireNonNull(viewProvider);
+                
+                VmCpuService service = new VmCpuServiceImpl(appSvc, vmCpuStatDAO, viewProvider);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, VmRef.class.getName());
+                properties.put(InformationService.KEY_SERVICE_ID, VmCpuService.SERVICE_ID);
                 reg = context.registerService(InformationService.class.getName(), service, properties);
             }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vm-cpu/client-core/src/main/java/com/redhat/thermostat/vm/cpu/client/core/internal/VmCpuServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.vm.cpu.client.core.internal;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.storage.core.VmRef;
+import com.redhat.thermostat.vm.cpu.client.core.VmCpuService;
+import com.redhat.thermostat.vm.cpu.client.core.VmCpuViewProvider;
+import com.redhat.thermostat.vm.cpu.common.VmCpuStatDAO;
+
+public class VmCpuServiceImpl implements VmCpuService {
+    
+    private static final int ORDER = ORDER_CPU_GROUP;
+    private static final Filter<VmRef> FILTER = new NameMatchingRefFilter<>();
+
+    private ApplicationService appSvc;
+    private VmCpuStatDAO vmCpuStatDAO;
+    private VmCpuViewProvider viewProvider;
+    
+    public VmCpuServiceImpl(ApplicationService appSvc, VmCpuStatDAO vmCpuStatDAO,
+            VmCpuViewProvider viewProvider) {
+        this.appSvc = appSvc;
+        this.vmCpuStatDAO = vmCpuStatDAO;
+        this.viewProvider = viewProvider;
+    }
+
+    @Override
+    public InformationServiceController<VmRef> getInformationServiceController(
+            VmRef ref) {
+        return new VmCpuController(appSvc, vmCpuStatDAO, ref, viewProvider);
+    }
+
+    @Override
+    public Filter<VmRef> getFilter() {
+        return FILTER;
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+
+}
+
--- a/vm-cpu/client-core/src/test/java/com/redhat/thermostat/vm/cpu/client/core/internal/ActivatorTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-cpu/client-core/src/test/java/com/redhat/thermostat/vm/cpu/client/core/internal/ActivatorTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -46,7 +46,7 @@
 import com.redhat.thermostat.client.core.InformationService;
 import com.redhat.thermostat.common.ApplicationService;
 import com.redhat.thermostat.testutils.StubBundleContext;
-import com.redhat.thermostat.vm.cpu.client.core.VmCpuService;
+import com.redhat.thermostat.vm.cpu.client.core.VmCpuViewProvider;
 import com.redhat.thermostat.vm.cpu.common.VmCpuStatDAO;
 
 public class ActivatorTest {
@@ -72,20 +72,22 @@
         StubBundleContext context = new StubBundleContext();
         VmCpuStatDAO vmCpuStatDAO = mock(VmCpuStatDAO.class);
         ApplicationService appSvc = mock(ApplicationService.class);
+        VmCpuViewProvider viewProvider = mock(VmCpuViewProvider.class);
 
         context.registerService(VmCpuStatDAO.class, vmCpuStatDAO, null);
         context.registerService(ApplicationService.class, appSvc, null);
+        context.registerService(VmCpuViewProvider.class, viewProvider, null);
 
         Activator activator = new Activator();
 
         activator.start(context);
 
-        assertTrue(context.isServiceRegistered(InformationService.class.getName(), VmCpuService.class));
+        assertTrue(context.isServiceRegistered(InformationService.class.getName(), VmCpuServiceImpl.class));
 
         activator.stop(context);
 
         assertEquals(0, context.getServiceListeners().size());
-        assertEquals(2, context.getAllServices().size());
+        assertEquals(3, context.getAllServices().size());
     }
 
 }
--- a/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/VmGcService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/VmGcService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,48 +36,11 @@
 
 package com.redhat.thermostat.vm.gc.client.core;
 
-import com.redhat.thermostat.client.core.Filter;
 import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.common.utils.OSGIUtils;
 import com.redhat.thermostat.storage.core.VmRef;
-import com.redhat.thermostat.vm.gc.client.core.internal.VmGcController;
-import com.redhat.thermostat.vm.gc.common.VmGcStatDAO;
-import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
-
-public class VmGcService implements InformationService<VmRef> {
-    
-    private static final int ORDER = ORDER_MEMORY_GROUP;
-    private static final Filter<VmRef> FILTER = new NameMatchingRefFilter<>();
 
-    private ApplicationService appSvc;
-    private VmMemoryStatDAO vmMemoryStatDAO;
-    private VmGcStatDAO vmGcStatDAO;
-    
-    public VmGcService(ApplicationService appSvc, VmMemoryStatDAO vmMemoryStatDAO, VmGcStatDAO vmGcStatDAO) {
-        this.appSvc = appSvc;
-        this.vmMemoryStatDAO = vmMemoryStatDAO;
-        this.vmGcStatDAO = vmGcStatDAO;
-    }
+public interface VmGcService extends InformationService<VmRef> {
 
-    @Override
-    public InformationServiceController<VmRef> getInformationServiceController(
-            VmRef ref) {
-        VmGcViewProvider provider = OSGIUtils.getInstance().getService(VmGcViewProvider.class);
-        return new VmGcController(appSvc, vmMemoryStatDAO, vmGcStatDAO, ref, provider);
-    }
-
-    @Override
-    public Filter<VmRef> getFilter() {
-        return FILTER;
-    }
-
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
+    public static final String SERVICE_ID = "com.redhat.thermostat.vm.gc";
 
 }
-
--- a/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -52,6 +52,7 @@
 import com.redhat.thermostat.common.MultipleServiceTracker.Action;
 import com.redhat.thermostat.storage.core.VmRef;
 import com.redhat.thermostat.vm.gc.client.core.VmGcService;
+import com.redhat.thermostat.vm.gc.client.core.VmGcViewProvider;
 import com.redhat.thermostat.vm.gc.common.VmGcStatDAO;
 import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
 
@@ -65,7 +66,8 @@
         Class<?>[] deps = new Class<?>[] {
             VmMemoryStatDAO.class,
             VmGcStatDAO.class,
-            ApplicationService.class
+            ApplicationService.class,
+            VmGcViewProvider.class
         };
 
         tracker = new MultipleServiceTracker(context, deps, new Action() {
@@ -78,9 +80,13 @@
                 Objects.requireNonNull(vmGcStatDAO);
                 ApplicationService appSvc = (ApplicationService) services.get(ApplicationService.class.getName());
                 Objects.requireNonNull(appSvc);
-                VmGcService service = new VmGcService(appSvc, vmMemoryStatDAO, vmGcStatDAO);
+                VmGcViewProvider viewProvider = (VmGcViewProvider) services.get(VmGcViewProvider.class.getName());
+                Objects.requireNonNull(viewProvider);
+                
+                VmGcService service = new VmGcServiceImpl(appSvc, vmMemoryStatDAO, vmGcStatDAO, viewProvider);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, VmRef.class.getName());
+                properties.put(InformationService.KEY_SERVICE_ID, VmGcService.SERVICE_ID);
                 reg = context.registerService(InformationService.class.getName(), service, properties);
             }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.vm.gc.client.core.internal;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.storage.core.VmRef;
+import com.redhat.thermostat.vm.gc.client.core.VmGcService;
+import com.redhat.thermostat.vm.gc.client.core.VmGcViewProvider;
+import com.redhat.thermostat.vm.gc.common.VmGcStatDAO;
+import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
+
+public class VmGcServiceImpl implements VmGcService {
+    
+    private static final int ORDER = ORDER_MEMORY_GROUP;
+    private static final Filter<VmRef> FILTER = new NameMatchingRefFilter<>();
+
+    private ApplicationService appSvc;
+    private VmMemoryStatDAO vmMemoryStatDAO;
+    private VmGcStatDAO vmGcStatDAO;
+    private VmGcViewProvider viewProvider;
+    
+    public VmGcServiceImpl(ApplicationService appSvc,
+            VmMemoryStatDAO vmMemoryStatDAO, VmGcStatDAO vmGcStatDAO,
+            VmGcViewProvider viewProvider) {
+        this.appSvc = appSvc;
+        this.vmMemoryStatDAO = vmMemoryStatDAO;
+        this.vmGcStatDAO = vmGcStatDAO;
+        this.viewProvider = viewProvider;
+    }
+
+    @Override
+    public InformationServiceController<VmRef> getInformationServiceController(
+            VmRef ref) {
+        return new VmGcController(appSvc, vmMemoryStatDAO, vmGcStatDAO, ref, viewProvider);
+    }
+
+    @Override
+    public Filter<VmRef> getFilter() {
+        return FILTER;
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+
+}
+
--- a/vm-gc/client-core/src/test/java/com/redhat/thermostat/vm/gc/client/core/internal/ActivatorTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-gc/client-core/src/test/java/com/redhat/thermostat/vm/gc/client/core/internal/ActivatorTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -46,7 +46,7 @@
 import com.redhat.thermostat.client.core.InformationService;
 import com.redhat.thermostat.common.ApplicationService;
 import com.redhat.thermostat.testutils.StubBundleContext;
-import com.redhat.thermostat.vm.gc.client.core.VmGcService;
+import com.redhat.thermostat.vm.gc.client.core.VmGcViewProvider;
 import com.redhat.thermostat.vm.gc.common.VmGcStatDAO;
 import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
 
@@ -74,21 +74,23 @@
         VmMemoryStatDAO vmMemoryStatDAO = mock(VmMemoryStatDAO.class);
         VmGcStatDAO vmGcStatDAO = mock(VmGcStatDAO.class);
         ApplicationService appSvc = mock(ApplicationService.class);
+        VmGcViewProvider viewProvider = mock(VmGcViewProvider.class);
 
         context.registerService(VmMemoryStatDAO.class, vmMemoryStatDAO, null);
         context.registerService(VmGcStatDAO.class, vmGcStatDAO, null);
         context.registerService(ApplicationService.class, appSvc, null);
+        context.registerService(VmGcViewProvider.class, viewProvider, null);
 
         Activator activator = new Activator();
 
         activator.start(context);
 
-        assertTrue(context.isServiceRegistered(InformationService.class.getName(), VmGcService.class));
+        assertTrue(context.isServiceRegistered(InformationService.class.getName(), VmGcServiceImpl.class));
 
         activator.stop(context);
 
         assertEquals(0, context.getServiceListeners().size());
-        assertEquals(3, context.getAllServices().size());
+        assertEquals(4, context.getAllServices().size());
     }
 
 }
--- a/vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/HeapDumperService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/HeapDumperService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,54 +36,11 @@
 
 package com.redhat.thermostat.vm.heap.analysis.client.core;
 
-import com.redhat.thermostat.client.core.Filter;
 import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.common.utils.OSGIUtils;
 import com.redhat.thermostat.storage.core.VmRef;
-import com.redhat.thermostat.storage.dao.VmInfoDAO;
-import com.redhat.thermostat.vm.heap.analysis.client.core.internal.HeapDumpController;
-import com.redhat.thermostat.vm.heap.analysis.common.HeapDAO;
-import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
-
-public class HeapDumperService implements InformationService<VmRef> {
-    
-    private static final int ORDER = ORDER_MEMORY_GROUP + 60;
-    private ApplicationService appService;
-    private VmInfoDAO vmInfoDao;
-    private VmMemoryStatDAO vmMemoryStatDao;
-    private HeapDAO heapDao;
-
-    private Filter<VmRef> filter = new NameMatchingRefFilter<>();
 
-    public HeapDumperService(ApplicationService appService, VmInfoDAO vmInfoDao, VmMemoryStatDAO vmMemoryStatDao, HeapDAO heapDao) {
-        this.vmInfoDao = vmInfoDao;
-        this.vmMemoryStatDao = vmMemoryStatDao;
-        this.heapDao = heapDao;
-        this.appService = appService;
-    }
+public interface HeapDumperService extends InformationService<VmRef> {
 
-    @Override
-    public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        HeapViewProvider viewProvider = OSGIUtils.getInstance().getService(HeapViewProvider.class);
-        HeapDumpDetailsViewProvider detailsViewProvider = OSGIUtils.getInstance().getService(HeapDumpDetailsViewProvider.class);
-        HeapHistogramViewProvider histogramViewProvider = OSGIUtils.getInstance().getService(HeapHistogramViewProvider.class);
-        ObjectDetailsViewProvider objectDetailsViewProvider = OSGIUtils.getInstance().getService(ObjectDetailsViewProvider.class);
-        ObjectRootsViewProvider objectRootsViewProvider = OSGIUtils.getInstance().getService(ObjectRootsViewProvider.class);
-        return new HeapDumpController(vmMemoryStatDao, vmInfoDao, heapDao, ref, appService,
-                viewProvider, detailsViewProvider, histogramViewProvider, objectDetailsViewProvider, objectRootsViewProvider);
-    }
+    public static final String SERVICE_ID = "com.redhat.thermostat.vm.heap.analysis";
 
-    @Override
-    public Filter<VmRef> getFilter() {
-        return filter;
-    }
-
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
 }
-
--- a/vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -52,7 +52,12 @@
 import com.redhat.thermostat.common.MultipleServiceTracker.Action;
 import com.redhat.thermostat.storage.core.VmRef;
 import com.redhat.thermostat.storage.dao.VmInfoDAO;
+import com.redhat.thermostat.vm.heap.analysis.client.core.HeapDumpDetailsViewProvider;
 import com.redhat.thermostat.vm.heap.analysis.client.core.HeapDumperService;
+import com.redhat.thermostat.vm.heap.analysis.client.core.HeapHistogramViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.HeapViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.ObjectDetailsViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.ObjectRootsViewProvider;
 import com.redhat.thermostat.vm.heap.analysis.common.HeapDAO;
 import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
 
@@ -68,6 +73,11 @@
             VmInfoDAO.class,
             VmMemoryStatDAO.class,
             HeapDAO.class,
+            HeapViewProvider.class,
+            HeapDumpDetailsViewProvider.class,
+            HeapHistogramViewProvider.class,
+            ObjectDetailsViewProvider.class,
+            ObjectRootsViewProvider.class
         };
 
         tracker = new MultipleServiceTracker(context, deps, new Action() {
@@ -81,10 +91,28 @@
                 Objects.requireNonNull(vmMemoryStatDao);
                 HeapDAO heapDao = (HeapDAO) services.get(HeapDAO.class.getName());
                 Objects.requireNonNull(heapDao);
+                HeapViewProvider viewProvider = (HeapViewProvider) services.get(HeapViewProvider.class.getName());
+                Objects.requireNonNull(viewProvider);
+                HeapDumpDetailsViewProvider detailsViewProvider = (HeapDumpDetailsViewProvider) services
+                        .get(HeapDumpDetailsViewProvider.class.getName());
+                Objects.requireNonNull(detailsViewProvider);
+                HeapHistogramViewProvider histogramViewProvider = (HeapHistogramViewProvider) services
+                        .get(HeapHistogramViewProvider.class.getName());
+                Objects.requireNonNull(histogramViewProvider);
+                ObjectDetailsViewProvider objectDetailsViewProvider = (ObjectDetailsViewProvider) services
+                        .get(ObjectDetailsViewProvider.class.getName());
+                Objects.requireNonNull(objectDetailsViewProvider);
+                ObjectRootsViewProvider objectRootsViewProvider = (ObjectRootsViewProvider) services
+                        .get(ObjectRootsViewProvider.class.getName());
+                Objects.requireNonNull(objectRootsViewProvider);
 
-                HeapDumperService service = new HeapDumperService(appSvc, vmInfoDao, vmMemoryStatDao, heapDao);
+                HeapDumperService service = new HeapDumperServiceImpl(appSvc,
+                        vmInfoDao, vmMemoryStatDao, heapDao, viewProvider,
+                        detailsViewProvider, histogramViewProvider,
+                        objectDetailsViewProvider, objectRootsViewProvider);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, VmRef.class.getName());
+                properties.put(InformationService.KEY_SERVICE_ID, HeapDumperService.SERVICE_ID);
                 reg = context.registerService(InformationService.class.getName(), service , properties);
             }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vm-heap-analysis/client-core/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/HeapDumperServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.vm.heap.analysis.client.core.internal;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.storage.core.VmRef;
+import com.redhat.thermostat.storage.dao.VmInfoDAO;
+import com.redhat.thermostat.vm.heap.analysis.client.core.HeapDumpDetailsViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.HeapDumperService;
+import com.redhat.thermostat.vm.heap.analysis.client.core.HeapHistogramViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.HeapViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.ObjectDetailsViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.ObjectRootsViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.common.HeapDAO;
+import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
+
+public class HeapDumperServiceImpl implements HeapDumperService {
+    
+    private static final int ORDER = ORDER_MEMORY_GROUP + 60;
+    private ApplicationService appService;
+    private VmInfoDAO vmInfoDao;
+    private VmMemoryStatDAO vmMemoryStatDao;
+    private HeapDAO heapDao;
+
+    private Filter<VmRef> filter = new NameMatchingRefFilter<>();
+
+    private HeapViewProvider viewProvider;
+    private HeapDumpDetailsViewProvider detailsViewProvider;
+    private HeapHistogramViewProvider histogramViewProvider;
+    private ObjectDetailsViewProvider objectDetailsViewProvider;
+    private ObjectRootsViewProvider objectRootsViewProvider;
+
+    public HeapDumperServiceImpl(ApplicationService appService,
+            VmInfoDAO vmInfoDao, VmMemoryStatDAO vmMemoryStatDao,
+            HeapDAO heapDao, HeapViewProvider viewProvider,
+            HeapDumpDetailsViewProvider detailsViewProvider,
+            HeapHistogramViewProvider histogramViewProvider,
+            ObjectDetailsViewProvider objectDetailsViewProvider,
+            ObjectRootsViewProvider objectRootsViewProvider) {
+        this.vmInfoDao = vmInfoDao;
+        this.vmMemoryStatDao = vmMemoryStatDao;
+        this.heapDao = heapDao;
+        this.appService = appService;
+        this.viewProvider = viewProvider;
+        this.detailsViewProvider = detailsViewProvider;
+        this.histogramViewProvider = histogramViewProvider;
+        this.objectDetailsViewProvider = objectDetailsViewProvider;
+        this.objectRootsViewProvider = objectRootsViewProvider;
+    }
+
+    @Override
+    public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
+        return new HeapDumpController(vmMemoryStatDao, vmInfoDao, heapDao, ref, appService,
+                viewProvider, detailsViewProvider, histogramViewProvider, objectDetailsViewProvider, objectRootsViewProvider);
+    }
+
+    @Override
+    public Filter<VmRef> getFilter() {
+        return filter;
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+}
+
--- a/vm-heap-analysis/client-core/src/test/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/ActivatorTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-heap-analysis/client-core/src/test/java/com/redhat/thermostat/vm/heap/analysis/client/core/internal/ActivatorTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -47,7 +47,11 @@
 import com.redhat.thermostat.common.ApplicationService;
 import com.redhat.thermostat.storage.dao.VmInfoDAO;
 import com.redhat.thermostat.testutils.StubBundleContext;
-import com.redhat.thermostat.vm.heap.analysis.client.core.HeapDumperService;
+import com.redhat.thermostat.vm.heap.analysis.client.core.HeapDumpDetailsViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.HeapHistogramViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.HeapViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.ObjectDetailsViewProvider;
+import com.redhat.thermostat.vm.heap.analysis.client.core.ObjectRootsViewProvider;
 import com.redhat.thermostat.vm.heap.analysis.common.HeapDAO;
 import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
 
@@ -76,22 +80,34 @@
         VmMemoryStatDAO vmMemoryStatDAO = mock(VmMemoryStatDAO.class);
         HeapDAO heapDAO = mock(HeapDAO.class);
         ApplicationService appSvc = mock(ApplicationService.class);
+        
+        HeapViewProvider viewProvider = mock(HeapViewProvider.class);
+        HeapDumpDetailsViewProvider detailsViewProvider = mock(HeapDumpDetailsViewProvider.class);
+        HeapHistogramViewProvider histogramViewProvider = mock(HeapHistogramViewProvider.class);
+        ObjectDetailsViewProvider objectDetailsViewProvider = mock(ObjectDetailsViewProvider.class);
+        ObjectRootsViewProvider objectRootsViewProvider = mock(ObjectRootsViewProvider.class);
 
         context.registerService(VmInfoDAO.class, vmInfoDao, null);
         context.registerService(VmMemoryStatDAO.class, vmMemoryStatDAO, null);
         context.registerService(HeapDAO.class, heapDAO, null);
         context.registerService(ApplicationService.class, appSvc, null);
+        
+        context.registerService(HeapViewProvider.class, viewProvider, null);
+        context.registerService(HeapDumpDetailsViewProvider.class, detailsViewProvider, null);
+        context.registerService(HeapHistogramViewProvider.class, histogramViewProvider, null);
+        context.registerService(ObjectDetailsViewProvider.class, objectDetailsViewProvider, null);
+        context.registerService(ObjectRootsViewProvider.class, objectRootsViewProvider, null);
 
         Activator activator = new Activator();
 
         activator.start(context);
 
-        assertTrue(context.isServiceRegistered(InformationService.class.getName(), HeapDumperService.class));
+        assertTrue(context.isServiceRegistered(InformationService.class.getName(), HeapDumperServiceImpl.class));
 
         activator.stop(context);
 
         assertEquals(0, context.getServiceListeners().size());
-        assertEquals(4, context.getAllServices().size());
+        assertEquals(9, context.getAllServices().size());
     }
 
 }
--- a/vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/MemoryStatsService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/MemoryStatsService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,52 +36,11 @@
 
 package com.redhat.thermostat.vm.memory.client.core;
 
-import com.redhat.thermostat.client.core.Filter;
 import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.common.utils.OSGIUtils;
-import com.redhat.thermostat.gc.remote.common.GCRequest;
 import com.redhat.thermostat.storage.core.VmRef;
-import com.redhat.thermostat.storage.dao.AgentInfoDAO;
-import com.redhat.thermostat.storage.dao.VmInfoDAO;
-import com.redhat.thermostat.vm.memory.client.core.internal.MemoryStatsController;
-import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
-
-public class MemoryStatsService implements InformationService<VmRef> {
-    
-    private static final int ORDER = ORDER_MEMORY_GROUP + 40;
-    private Filter<VmRef> filter = new NameMatchingRefFilter<>();
 
-    private ApplicationService appSvc;
-    private VmInfoDAO vmInfoDao;
-    private VmMemoryStatDAO vmMemoryStatDao;
-    private AgentInfoDAO agentDAO;
-    private GCRequest gcRequest;
-    
-    public MemoryStatsService(ApplicationService appSvc, VmInfoDAO vmInfoDao, VmMemoryStatDAO vmMemoryStatDao, AgentInfoDAO agentDAO, GCRequest gcRequest) {
-        this.appSvc = appSvc;
-        this.vmInfoDao = vmInfoDao;
-        this.vmMemoryStatDao = vmMemoryStatDao;
-        this.gcRequest = gcRequest;
-        this.agentDAO = agentDAO;
-    }
-    
-    @Override
-    public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
-        MemoryStatsViewProvider viewProvider = OSGIUtils.getInstance().getService(MemoryStatsViewProvider.class);
-        return new MemoryStatsController(appSvc, vmInfoDao, vmMemoryStatDao, ref, viewProvider, agentDAO, gcRequest);
-    }
+public interface MemoryStatsService extends InformationService<VmRef> {
 
-    @Override
-    public Filter<VmRef> getFilter() {
-        return filter;
-    }
+    public static final String SERVICE_ID = "com.redhat.thermostat.vm.memory";
 
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
 }
-
--- a/vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -39,6 +39,7 @@
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.Map;
+import java.util.Objects;
 
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
@@ -54,6 +55,7 @@
 import com.redhat.thermostat.storage.dao.AgentInfoDAO;
 import com.redhat.thermostat.storage.dao.VmInfoDAO;
 import com.redhat.thermostat.vm.memory.client.core.MemoryStatsService;
+import com.redhat.thermostat.vm.memory.client.core.MemoryStatsViewProvider;
 import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
 
 public class Activator implements BundleActivator {
@@ -69,6 +71,7 @@
             VmMemoryStatDAO.class,
             GCRequest.class,
             AgentInfoDAO.class,
+            MemoryStatsViewProvider.class
         };
 
         tracker = new MultipleServiceTracker(context, deps, new Action() {
@@ -82,15 +85,23 @@
             @Override
             public void dependenciesAvailable(Map<String, Object> services) {
                 VmInfoDAO vmInfoDao = (VmInfoDAO) services.get(VmInfoDAO.class.getName());
+                Objects.requireNonNull(vmInfoDao);
                 VmMemoryStatDAO memoryStatDao = (VmMemoryStatDAO) services.get(VmMemoryStatDAO.class.getName());
+                Objects.requireNonNull(memoryStatDao);
                 AgentInfoDAO agentDAO = (AgentInfoDAO) services.get(AgentInfoDAO.class.getName());
+                Objects.requireNonNull(agentDAO);
                 GCRequest gcRequest = (GCRequest) services.get(GCRequest.class.getName());
+                Objects.requireNonNull(gcRequest);
                 ApplicationService appSvc = (ApplicationService) services.get(ApplicationService.class.getName());
+                Objects.requireNonNull(appSvc);
+                MemoryStatsViewProvider viewProvider = (MemoryStatsViewProvider) services.get(MemoryStatsViewProvider.class.getName());
+                Objects.requireNonNull(viewProvider);
 
-                MemoryStatsService impl = new MemoryStatsService(appSvc, vmInfoDao, memoryStatDao, agentDAO, gcRequest);
+                MemoryStatsService impl = new MemoryStatsServiceImpl(appSvc, vmInfoDao, memoryStatDao, agentDAO, gcRequest, viewProvider);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, VmRef.class.getName());
-                memoryStatRegistration = context.registerService(InformationService.class.getName(), impl , properties);
+                properties.put(InformationService.KEY_SERVICE_ID, MemoryStatsService.SERVICE_ID);
+                memoryStatRegistration = context.registerService(InformationService.class.getName(), impl, properties);
             }
         });
         tracker.open();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vm-memory/client-core/src/main/java/com/redhat/thermostat/vm/memory/client/core/internal/MemoryStatsServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.vm.memory.client.core.internal;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.gc.remote.common.GCRequest;
+import com.redhat.thermostat.storage.core.VmRef;
+import com.redhat.thermostat.storage.dao.AgentInfoDAO;
+import com.redhat.thermostat.storage.dao.VmInfoDAO;
+import com.redhat.thermostat.vm.memory.client.core.MemoryStatsService;
+import com.redhat.thermostat.vm.memory.client.core.MemoryStatsViewProvider;
+import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
+
+public class MemoryStatsServiceImpl implements MemoryStatsService {
+    
+    private static final int ORDER = ORDER_MEMORY_GROUP + 40;
+    private Filter<VmRef> filter = new NameMatchingRefFilter<>();
+
+    private ApplicationService appSvc;
+    private VmInfoDAO vmInfoDao;
+    private VmMemoryStatDAO vmMemoryStatDao;
+    private AgentInfoDAO agentDAO;
+    private GCRequest gcRequest;
+    private MemoryStatsViewProvider viewProvider;
+    
+    public MemoryStatsServiceImpl(ApplicationService appSvc, VmInfoDAO vmInfoDao, VmMemoryStatDAO vmMemoryStatDao, AgentInfoDAO agentDAO, GCRequest gcRequest, MemoryStatsViewProvider viewProvider) {
+        this.appSvc = appSvc;
+        this.vmInfoDao = vmInfoDao;
+        this.vmMemoryStatDao = vmMemoryStatDao;
+        this.gcRequest = gcRequest;
+        this.agentDAO = agentDAO;
+        this.viewProvider = viewProvider;
+    }
+    
+    @Override
+    public InformationServiceController<VmRef> getInformationServiceController(VmRef ref) {
+        return new MemoryStatsController(appSvc, vmInfoDao, vmMemoryStatDao, ref, viewProvider, agentDAO, gcRequest);
+    }
+
+    @Override
+    public Filter<VmRef> getFilter() {
+        return filter;
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+}
+
--- a/vm-memory/client-core/src/test/java/com/redhat/thermostat/vm/memory/client/core/internal/ActivatorTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-memory/client-core/src/test/java/com/redhat/thermostat/vm/memory/client/core/internal/ActivatorTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -49,7 +49,7 @@
 import com.redhat.thermostat.storage.dao.AgentInfoDAO;
 import com.redhat.thermostat.storage.dao.VmInfoDAO;
 import com.redhat.thermostat.testutils.StubBundleContext;
-import com.redhat.thermostat.vm.memory.client.core.MemoryStatsService;
+import com.redhat.thermostat.vm.memory.client.core.MemoryStatsViewProvider;
 import com.redhat.thermostat.vm.memory.common.VmMemoryStatDAO;
 
 public class ActivatorTest {
@@ -78,23 +78,25 @@
         ApplicationService appSvc = mock(ApplicationService.class);
         GCRequest gcRequest = mock(GCRequest.class);
         AgentInfoDAO agentInfoDAO = mock(AgentInfoDAO.class);
+        MemoryStatsViewProvider viewProvider = mock(MemoryStatsViewProvider.class);
 
         context.registerService(VmInfoDAO.class, vmInfoDAO, null);
         context.registerService(VmMemoryStatDAO.class, vmMemoryStatDAO, null);
         context.registerService(ApplicationService.class, appSvc, null);
         context.registerService(GCRequest.class, gcRequest, null);
         context.registerService(AgentInfoDAO.class, agentInfoDAO, null);
+        context.registerService(MemoryStatsViewProvider.class, viewProvider, null);
 
         Activator activator = new Activator();
 
         activator.start(context);
 
-        assertTrue(context.isServiceRegistered(InformationService.class.getName(), MemoryStatsService.class));
+        assertTrue(context.isServiceRegistered(InformationService.class.getName(), MemoryStatsServiceImpl.class));
 
         activator.stop(context);
 
         assertEquals(0, context.getServiceListeners().size());
-        assertEquals(5, context.getAllServices().size());
+        assertEquals(6, context.getAllServices().size());
     }
 
 }
--- a/vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/VmOverviewService.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/VmOverviewService.java	Thu Jan 31 14:42:17 2013 -0500
@@ -36,45 +36,11 @@
 
 package com.redhat.thermostat.vm.overview.client.core;
 
-import com.redhat.thermostat.client.core.Filter;
 import com.redhat.thermostat.client.core.InformationService;
-import com.redhat.thermostat.client.core.controllers.InformationServiceController;
-import com.redhat.thermostat.client.core.NameMatchingRefFilter;
-import com.redhat.thermostat.common.ApplicationService;
-import com.redhat.thermostat.common.utils.OSGIUtils;
 import com.redhat.thermostat.storage.core.VmRef;
-import com.redhat.thermostat.storage.dao.VmInfoDAO;
-import com.redhat.thermostat.vm.overview.client.core.internal.VmOverviewController;
-
-public class VmOverviewService implements InformationService<VmRef> {
-    
-    private static final int ORDER = ORDER_DEFAULT_GROUP;
-    private static final Filter<VmRef> FILTER = new NameMatchingRefFilter<>();
 
-    private ApplicationService appSvc;
-    private VmInfoDAO vmInfoDAO;
-    
-    public VmOverviewService(ApplicationService appSvc, VmInfoDAO vmInfoDAO) {
-        this.appSvc = appSvc;
-        this.vmInfoDAO = vmInfoDAO;
-    }
+public interface VmOverviewService extends InformationService<VmRef> {
 
-    @Override
-    public InformationServiceController<VmRef> getInformationServiceController(
-            VmRef ref) {
-        VmOverviewViewProvider provider = OSGIUtils.getInstance().getService(VmOverviewViewProvider.class);
-        return new VmOverviewController(appSvc, vmInfoDAO, ref, provider);
-    }
-
-    @Override
-    public Filter<VmRef> getFilter() {
-        return FILTER;
-    }
-
-    @Override
-    public int getOrderValue() {
-        return ORDER;
-    }
+    public static final String SERVICE_ID = "com.redhat.thermostat.vm.overview";
 
 }
-
--- a/vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/internal/Activator.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/internal/Activator.java	Thu Jan 31 14:42:17 2013 -0500
@@ -53,6 +53,7 @@
 import com.redhat.thermostat.storage.core.VmRef;
 import com.redhat.thermostat.storage.dao.VmInfoDAO;
 import com.redhat.thermostat.vm.overview.client.core.VmOverviewService;
+import com.redhat.thermostat.vm.overview.client.core.VmOverviewViewProvider;
 
 public class Activator implements BundleActivator {
     
@@ -63,7 +64,8 @@
     public void start(final BundleContext context) throws Exception {
         Class<?>[] deps = new Class<?>[] {
                 VmInfoDAO.class,
-                ApplicationService.class
+                ApplicationService.class,
+                VmOverviewViewProvider.class
         };
 
         tracker = new MultipleServiceTracker(context, deps , new Action() {
@@ -74,9 +76,13 @@
                 Objects.requireNonNull(vmInfoDAO);
                 ApplicationService appSvc = (ApplicationService) services.get(ApplicationService.class.getName());
                 Objects.requireNonNull(appSvc);
-                VmOverviewService service = new VmOverviewService(appSvc, vmInfoDAO);
+                VmOverviewViewProvider viewProvider = (VmOverviewViewProvider) services.get(VmOverviewViewProvider.class.getName());
+                Objects.requireNonNull(viewProvider);
+                
+                VmOverviewService service = new VmOverviewServiceImpl(appSvc, vmInfoDAO, viewProvider);
                 Dictionary<String, String> properties = new Hashtable<>();
                 properties.put(Constants.GENERIC_SERVICE_CLASSNAME, VmRef.class.getName());
+                properties.put(InformationService.KEY_SERVICE_ID, VmOverviewService.SERVICE_ID);
                 reg = context.registerService(InformationService.class.getName(), service, properties);
             }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vm-overview/client-core/src/main/java/com/redhat/thermostat/vm/overview/client/core/internal/VmOverviewServiceImpl.java	Thu Jan 31 14:42:17 2013 -0500
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012, 2013 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.vm.overview.client.core.internal;
+
+import com.redhat.thermostat.client.core.Filter;
+import com.redhat.thermostat.client.core.NameMatchingRefFilter;
+import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.common.ApplicationService;
+import com.redhat.thermostat.storage.core.VmRef;
+import com.redhat.thermostat.storage.dao.VmInfoDAO;
+import com.redhat.thermostat.vm.overview.client.core.VmOverviewService;
+import com.redhat.thermostat.vm.overview.client.core.VmOverviewViewProvider;
+
+public class VmOverviewServiceImpl implements VmOverviewService {
+    
+    private static final int ORDER = ORDER_DEFAULT_GROUP;
+    private static final Filter<VmRef> FILTER = new NameMatchingRefFilter<>();
+
+    private ApplicationService appSvc;
+    private VmInfoDAO vmInfoDAO;
+    private VmOverviewViewProvider viewProvider;
+    
+    public VmOverviewServiceImpl(ApplicationService appSvc, VmInfoDAO vmInfoDAO, VmOverviewViewProvider viewProvider) {
+        this.appSvc = appSvc;
+        this.vmInfoDAO = vmInfoDAO;
+        this.viewProvider = viewProvider;
+    }
+
+    @Override
+    public InformationServiceController<VmRef> getInformationServiceController(
+            VmRef ref) {
+        return new VmOverviewController(appSvc, vmInfoDAO, ref, viewProvider);
+    }
+
+    @Override
+    public Filter<VmRef> getFilter() {
+        return FILTER;
+    }
+
+    @Override
+    public int getOrderValue() {
+        return ORDER;
+    }
+
+}
+
--- a/vm-overview/client-core/src/test/java/com/redhat/thermostat/vm/overview/client/core/internal/ActivatorTest.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/vm-overview/client-core/src/test/java/com/redhat/thermostat/vm/overview/client/core/internal/ActivatorTest.java	Thu Jan 31 14:42:17 2013 -0500
@@ -47,7 +47,7 @@
 import com.redhat.thermostat.common.ApplicationService;
 import com.redhat.thermostat.storage.dao.VmInfoDAO;
 import com.redhat.thermostat.testutils.StubBundleContext;
-import com.redhat.thermostat.vm.overview.client.core.VmOverviewService;
+import com.redhat.thermostat.vm.overview.client.core.VmOverviewViewProvider;
 
 public class ActivatorTest {
     
@@ -72,20 +72,22 @@
         StubBundleContext context = new StubBundleContext();
         VmInfoDAO vmInfoDAO = mock(VmInfoDAO.class);
         ApplicationService appSvc = mock(ApplicationService.class);
+        VmOverviewViewProvider viewProvider = mock(VmOverviewViewProvider.class);
 
         context.registerService(VmInfoDAO.class, vmInfoDAO, null);
         context.registerService(ApplicationService.class, appSvc, null);
+        context.registerService(VmOverviewViewProvider.class, viewProvider, null);
 
         Activator activator = new Activator();
 
         activator.start(context);
 
-        assertTrue(context.isServiceRegistered(InformationService.class.getName(), VmOverviewService.class));
+        assertTrue(context.isServiceRegistered(InformationService.class.getName(), VmOverviewServiceImpl.class));
 
         activator.stop(context);
 
         assertEquals(0, context.getServiceListeners().size());
-        assertEquals(2, context.getAllServices().size());
+        assertEquals(3, context.getAllServices().size());
     }
 
 }
--- a/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java	Thu Jan 31 14:40:22 2013 -0500
+++ b/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java	Thu Jan 31 14:42:17 2013 -0500
@@ -437,6 +437,7 @@
     public void registerCategory(Category<?> category) throws StorageException {
         NameValuePair nameParam = new BasicNameValuePair("name",
                 category.getName());
+        
         NameValuePair categoryParam = new BasicNameValuePair("category",
                 gson.toJson(category));
         List<NameValuePair> formparams = Arrays