diff --git a/src/main/java/net/onrc/onos/core/metrics/OnosMetrics.java b/src/main/java/net/onrc/onos/core/metrics/OnosMetrics.java
index bfd603f..3006b0c 100644
--- a/src/main/java/net/onrc/onos/core/metrics/OnosMetrics.java
+++ b/src/main/java/net/onrc/onos/core/metrics/OnosMetrics.java
@@ -1,6 +1,11 @@
 package net.onrc.onos.core.metrics;
 
+import com.codahale.metrics.Counter;
+import com.codahale.metrics.Histogram;
+import com.codahale.metrics.Meter;
+import com.codahale.metrics.Metric;
 import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.Timer;
 
 /**
  * This class acts a singleton to hold the Metrics registry for ONOS.
@@ -13,9 +18,168 @@
      */
     private OnosMetrics() {}
 
+    /**
+     * Components that can hold Metrics.  This is used as the first part of
+     * a Metric's name.
+     */
+    public enum MetricsComponents {
+        /**
+         * Global scope, not associated with a particular component.
+         */
+        GLOBAL("Global"),
+
+        /**
+         * Topology component.
+         */
+        TOPOLOGY("Topology");
+
+        private final String name;
+
+        /**
+         * Constructor allows specifying an alternate string name.
+         *
+         * @param name string for the name of the component
+         */
+        private MetricsComponents(String name) {
+            this.name = name;
+        }
+
+        @Override
+        public String toString() {
+            return name;
+        }
+    }
+
+    /**
+     * Features that can hold Metrics.  This is used as the second part of
+     * a Metric's name.
+     */
+    public enum MetricsFeatures {
+        /**
+         * Global scope, not associated with a particular feature.
+         */
+        GLOBAL("Global"),
+
+        /**
+         * Topology Intents Framework feature. (example)
+         */
+        TOPOLOGY_INTENTS("IntentsFramework");
+
+        private final String name;
+
+        /**
+         * Constructor allows specifying an alternate string name.
+         *
+         * @param name string for the name of the component
+         */
+        private MetricsFeatures(String name) {
+            this.name = name;
+        }
+
+        @Override
+        public String toString() {
+            return name;
+        }
+    }
+
     private static final MetricRegistry METRICS_REGISTRY = new MetricRegistry();
 
     /**
+     * Generates a name for a Metric from its component and feature.
+     *
+     * @param component component the metric is defined in
+     * @param feature feature the metric is defined in
+     * @param metricName local name of the metric
+     *
+     * @return full name of the metric
+     */
+    public static String generateName(final MetricsComponents component,
+                                      final MetricsFeatures feature,
+                                      final String metricName) {
+        return MetricRegistry.name(component.toString(),
+                feature.toString(),
+                metricName);
+    }
+
+    /**
+     * Creates a Counter metric.
+     *
+     * @param component component the Counter is defined in
+     * @param feature feature the Counter is defined in
+     * @param metricName local name of the metric
+     * @return Counter Meteric
+     */
+    public static Counter createCounter(final MetricsComponents component,
+                                        final MetricsFeatures feature,
+                                        final String metricName) {
+        final String name = generateName(component, feature, metricName);
+        return METRICS_REGISTRY.counter(name);
+    }
+
+    /**
+     * Creates a Histogram metric.
+     *
+     * @param component component the Histogram is defined in
+     * @param feature feature the Histogram is defined in
+     * @param metricName local name of the metric
+     * @return Histogram Metric
+     */
+    public static Histogram createHistogram(final MetricsComponents component,
+                                            final MetricsFeatures feature,
+                                            final String metricName) {
+        final String name = generateName(component, feature, metricName);
+        return METRICS_REGISTRY.histogram(name);
+    }
+
+    /**
+     * Creates a Timer metric.
+     *
+     * @param component component the Timer is defined in
+     * @param feature feature the Timeer is defined in
+     * @param metricName local name of the metric
+     * @return Timer Metric
+     */
+    public static Timer createTimer(final MetricsComponents component,
+                                    final MetricsFeatures feature,
+                                    final String metricName) {
+        final String name = generateName(component, feature, metricName);
+        return METRICS_REGISTRY.timer(name);
+    }
+
+    /**
+     * Creates a Meter metric.
+     *
+     * @param component component the Meter is defined in
+     * @param feature feature the Meter is defined in
+     * @param metricName local name of the metric
+     * @return Meter Metric
+     */
+    public static Meter createMeter(final MetricsComponents component,
+                                    final MetricsFeatures feature,
+                                    final String metricName) {
+        final String name = generateName(component, feature, metricName);
+        return METRICS_REGISTRY.meter(name);
+    }
+
+    /**
+     * Registers an already created Metric.  This is used for situation where a
+     * caller needs to allocate its own Metric, but still register it with the
+     * system.
+     *
+     * @param component component the Metric is defined in
+     * @param feature feature the metric is defined in
+     * @param metricName local name of the metric
+     * @param metric Metric to register
+     */
+    public static void registerMetric(MetricsComponents component,
+                                      MetricsFeatures feature,
+                                      String metricName,
+                                      Metric metric) {
+        final String name = generateName(component, feature, metricName);
+        METRICS_REGISTRY.register(name, metric);
+    }
+
+    /**
      * Get the singleton Metrics registry.  A single instance of
      * the registry is statically allocated and then used by all callers.
      *
diff --git a/src/test/java/net/onrc/onos/api/rest/TestOnosMetrics.java b/src/test/java/net/onrc/onos/api/rest/TestOnosMetrics.java
new file mode 100644
index 0000000..1169c9f
--- /dev/null
+++ b/src/test/java/net/onrc/onos/api/rest/TestOnosMetrics.java
@@ -0,0 +1,23 @@
+package net.onrc.onos.api.rest;
+
+import net.onrc.onos.core.metrics.OnosMetrics;
+import org.junit.Test;
+
+import static net.onrc.onos.core.util.UtilityClassChecker.assertThatClassIsUtility;
+
+
+//  TODO - move this class to someplace more appropriate
+
+/**
+ * Unit tests for the OnosMetrics class.
+ */
+public class TestOnosMetrics {
+
+    /**
+     * Make sure that the Onos Metrics class is a utility class.
+     */
+    @Test
+    public void assureThatOnosMetricsIsUtility() {
+        assertThatClassIsUtility(OnosMetrics.class);
+    }
+}
diff --git a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsCounters.java b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsCounters.java
index 84fb4db..86523c0 100644
--- a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsCounters.java
+++ b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsCounters.java
@@ -49,20 +49,35 @@
 
     //  Test Counter data objects
     private static final String COUNTER1_NAME = "COUNTER1";
+    private static final String COUNTER1_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                                                     OnosMetrics.MetricsFeatures.GLOBAL,
+                                                     COUNTER1_NAME);
     private static final int COUNTER1_COUNT = 0;
 
     private static final String COUNTER2_NAME = "COUNTER2";
+    private static final String COUNTER2_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                                                     OnosMetrics.MetricsFeatures.GLOBAL,
+                                                     COUNTER2_NAME);
     private static final int COUNTER2_COUNT = -1;
 
     private static final String COUNTER3_NAME = "COUNTER3";
+    private static final String COUNTER3_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                                                     OnosMetrics.MetricsFeatures.GLOBAL,
+                                                     COUNTER3_NAME);
     private static final int COUNTER3_COUNT = 5;
 
     private final Counter counter1 =
-            OnosMetrics.getMetricsRegistry().counter(COUNTER1_NAME);
+            OnosMetrics.createCounter(OnosMetrics.MetricsComponents.GLOBAL,
+                                      OnosMetrics.MetricsFeatures.GLOBAL,
+                                      COUNTER1_NAME);
     private final Counter counter2 =
-            OnosMetrics.getMetricsRegistry().counter(COUNTER2_NAME);
+            OnosMetrics.createCounter(OnosMetrics.MetricsComponents.GLOBAL,
+                                      OnosMetrics.MetricsFeatures.GLOBAL,
+                                      COUNTER2_NAME);
     private final Counter counter3 =
-            OnosMetrics.getMetricsRegistry().counter(COUNTER3_NAME);
+            OnosMetrics.createCounter(OnosMetrics.MetricsComponents.GLOBAL,
+                                      OnosMetrics.MetricsFeatures.GLOBAL,
+                                      COUNTER3_NAME);
 
     /**
      * Create some test data for the tests.
@@ -121,15 +136,15 @@
 
         //  Check the values for counter 1
         final JSONObject counter1Container = counters.getJSONObject(0);
-        checkCounter(counter1Container, COUNTER1_NAME, COUNTER1_COUNT);
+        checkCounter(counter1Container, COUNTER1_FULL_NAME, COUNTER1_COUNT);
 
         //  Check the values for counter 1
         final JSONObject counter2Container = counters.getJSONObject(1);
-        checkCounter(counter2Container, COUNTER2_NAME, COUNTER2_COUNT);
+        checkCounter(counter2Container, COUNTER2_FULL_NAME, COUNTER2_COUNT);
 
         //  Check the values for counter 1
         final JSONObject counter3Container = counters.getJSONObject(2);
-        checkCounter(counter3Container, COUNTER3_NAME, COUNTER3_COUNT);
+        checkCounter(counter3Container, COUNTER3_FULL_NAME, COUNTER3_COUNT);
 
     }
 
diff --git a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsFilters.java b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsFilters.java
index e35eb1f..3dae1dd 100644
--- a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsFilters.java
+++ b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsFilters.java
@@ -15,7 +15,6 @@
 import org.powermock.modules.junit4.PowerMockRunner;
 import org.restlet.resource.ClientResource;
 
-import static com.codahale.metrics.MetricRegistry.name;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
@@ -54,25 +53,70 @@
     }
 
     //  Test data objects
-    private static final String TIMER1_NAME = name("timer1");
-    private static final String TIMER2_NAME = name("timer2");
-    private static final String TIMER3_NAME = name("timer3");
+    private static final String TIMER1_NAME = "timer1";
+    private static final String TIMER1_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "timer1");
+    private static final String TIMER2_NAME = "timer2";
+    private static final String TIMER2_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "timer2");
+    private static final String TIMER3_NAME = "timer3";
+    private static final String TIMER3_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "timer3");
 
-    private static final String GAUGE1_NAME = name("gauge1");
-    private static final String GAUGE2_NAME = name("gauge2");
-    private static final String GAUGE3_NAME = name("gauge3");
+    private static final String GAUGE1_NAME = "gauge1";
+    private static final String GAUGE1_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "gauge1");
+    private static final String GAUGE2_NAME = "gauge2";
+    private static final String GAUGE2_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "gauge2");
+    private static final String GAUGE3_NAME = "gauge3";
+    private static final String GAUGE3_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "gauge3");
 
-    private static final String COUNTER1_NAME = name("counter1");
-    private static final String COUNTER2_NAME = name("counter2");
-    private static final String COUNTER3_NAME = name("counter3");
+    private static final String COUNTER1_NAME = "counter1";
+    private static final String COUNTER1_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "counter1");
+    private static final String COUNTER2_NAME = "counter2";
+    private static final String COUNTER2_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "counter2");
+    private static final String COUNTER3_NAME = "counter3";
+    private static final String COUNTER3_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "counter3");
 
-    private static final String METER1_NAME = name("meter1");
-    private static final String METER2_NAME = name("meter2");
-    private static final String METER3_NAME = name("meter3");
+    private static final String METER1_NAME = "meter1";
+    private static final String METER1_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "meter1");
+    private static final String METER2_NAME = "meter2";
+    private static final String METER2_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "meter2");
+    private static final String METER3_NAME = "meter3";
+    private static final String METER3_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "meter3");
 
-    private static final String HISTOGRAM1_NAME = name("histogram1");
-    private static final String HISTOGRAM2_NAME = name("histogram2");
-    private static final String HISTOGRAM3_NAME = name("histogram3");
+    private static final String HISTOGRAM1_NAME = "histogram1";
+    private static final String HISTOGRAM1_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "histogram1");
+    private static final String HISTOGRAM2_NAME = "histogram2";
+    private static final String HISTOGRAM2_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "histogram2");
+    private static final String HISTOGRAM3_NAME = "histogram3";
+    private static final String HISTOGRAM3_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+            OnosMetrics.MetricsFeatures.GLOBAL,
+            "histogram3");
 
     final Gauge<Integer> testGauge = new Gauge<Integer>() {
         @Override
@@ -85,25 +129,58 @@
      * Creates Metrics objects for test.
      */
     private void createMetrics() {
-        OnosMetrics.getMetricsRegistry().timer(TIMER1_NAME);
-        OnosMetrics.getMetricsRegistry().timer(TIMER2_NAME);
-        OnosMetrics.getMetricsRegistry().timer(TIMER3_NAME);
+        OnosMetrics.createTimer(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                TIMER1_NAME);
+        OnosMetrics.createTimer(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                TIMER2_NAME);
+        OnosMetrics.createTimer(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                TIMER3_NAME);
 
-        OnosMetrics.getMetricsRegistry().counter(COUNTER1_NAME);
-        OnosMetrics.getMetricsRegistry().counter(COUNTER2_NAME);
-        OnosMetrics.getMetricsRegistry().counter(COUNTER3_NAME);
+        OnosMetrics.createCounter(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                COUNTER1_NAME);
+        OnosMetrics.createCounter(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                COUNTER2_NAME);
+        OnosMetrics.createCounter(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                COUNTER3_NAME);
 
-        OnosMetrics.getMetricsRegistry().meter(METER1_NAME);
-        OnosMetrics.getMetricsRegistry().meter(METER2_NAME);
-        OnosMetrics.getMetricsRegistry().meter(METER3_NAME);
+        OnosMetrics.createMeter(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                METER1_NAME);
+        OnosMetrics.createMeter(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                METER2_NAME);
+        OnosMetrics.createMeter(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                METER3_NAME);
 
-        OnosMetrics.getMetricsRegistry().histogram(HISTOGRAM1_NAME);
-        OnosMetrics.getMetricsRegistry().histogram(HISTOGRAM2_NAME);
-        OnosMetrics.getMetricsRegistry().histogram(HISTOGRAM3_NAME);
+        OnosMetrics.createHistogram(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                HISTOGRAM1_NAME);
+        OnosMetrics.createHistogram(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                HISTOGRAM2_NAME);
+        OnosMetrics.createHistogram(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                HISTOGRAM3_NAME);
 
-        OnosMetrics.getMetricsRegistry().register(GAUGE1_NAME, testGauge);
-        OnosMetrics.getMetricsRegistry().register(GAUGE2_NAME, testGauge);
-        OnosMetrics.getMetricsRegistry().register(GAUGE3_NAME, testGauge);
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                GAUGE1_NAME,
+                testGauge);
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                GAUGE2_NAME,
+                testGauge);
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                GAUGE3_NAME,
+                testGauge);
     }
 
     /**
@@ -144,7 +221,7 @@
 
         //  Read the metrics from the REST API for the test data
         final ClientResource client = new ClientResource(getBaseRestMetricsUrl());
-        client.addQueryParameter("ids", "timer1,timer2");
+        client.addQueryParameter("ids", TIMER1_FULL_NAME + "," + TIMER2_FULL_NAME);
 
         final JSONObject metrics = getJSONObject(client);
         assertThat(metrics.length(), is(equalTo(5)));
@@ -155,10 +232,10 @@
         assertThat(timers.length(), is(2));
 
         final JSONObject jsonTimer1 = timers.getJSONObject(0);
-        assertThat(jsonTimer1.getString("name"), is(equalTo("timer1")));
+        assertThat(jsonTimer1.getString("name"), is(equalTo(TIMER1_FULL_NAME)));
 
         final JSONObject jsonTimer2 = timers.getJSONObject(1);
-        assertThat(jsonTimer2.getString("name"), is(equalTo("timer2")));
+        assertThat(jsonTimer2.getString("name"), is(equalTo(TIMER2_FULL_NAME)));
 
         //  There should be no histograms, gauges, meters or counters
         checkEmptyLists(metrics, "histograms", "gauges", "meters", "counters");
@@ -174,7 +251,7 @@
 
         //  Read the metrics from the REST API for the test data
         final ClientResource client = new ClientResource(getBaseRestMetricsUrl());
-        client.addQueryParameter("ids", "timer1");
+        client.addQueryParameter("ids", TIMER1_FULL_NAME);
 
         final JSONObject metrics = getJSONObject(client);
         assertThat(metrics.length(), is(equalTo(5)));
@@ -185,7 +262,7 @@
         assertThat(timers.length(), is(1));
 
         final JSONObject jsonTimer1 = timers.getJSONObject(0);
-        assertThat(jsonTimer1.getString("name"), is(equalTo("timer1")));
+        assertThat(jsonTimer1.getString("name"), is(equalTo(TIMER1_FULL_NAME)));
 
 
         //  There should be no histograms, gauges, meters or counters
@@ -203,7 +280,10 @@
 
         //  Read the metrics from the REST API for the test data
         final ClientResource client = new ClientResource(getBaseRestMetricsUrl());
-        client.addQueryParameter("ids", "timer1,gauge2,histogram3");
+        client.addQueryParameter("ids",
+                TIMER1_FULL_NAME + "," +
+                GAUGE2_FULL_NAME + "," +
+                HISTOGRAM3_FULL_NAME);
 
         final JSONObject metrics = getJSONObject(client);
         assertThat(metrics.length(), is(equalTo(5)));
@@ -214,7 +294,7 @@
         assertThat(timers.length(), is(1));
 
         final JSONObject jsonTimer1 = timers.getJSONObject(0);
-        assertThat(jsonTimer1.getString("name"), is(equalTo("timer1")));
+        assertThat(jsonTimer1.getString("name"), is(equalTo(TIMER1_FULL_NAME)));
 
         //  There should be 1 gauge that matches the filter
         final JSONArray gauges = metrics.getJSONArray("gauges");
@@ -222,7 +302,7 @@
         assertThat(gauges.length(), is(1));
 
         final JSONObject jsonGauge1 = gauges.getJSONObject(0);
-        assertThat(jsonGauge1.getString("name"), is(equalTo("gauge2")));
+        assertThat(jsonGauge1.getString("name"), is(equalTo(GAUGE2_FULL_NAME)));
 
         //  There should be 1 histogram that matches the filter
         final JSONArray histograms = metrics.getJSONArray("histograms");
@@ -230,7 +310,7 @@
         assertThat(histograms.length(), is(1));
 
         final JSONObject jsonHistogram1 = histograms.getJSONObject(0);
-        assertThat(jsonHistogram1.getString("name"), is(equalTo("histogram3")));
+        assertThat(jsonHistogram1.getString("name"), is(equalTo(HISTOGRAM3_FULL_NAME)));
 
         //  There should be no meters or counters
         checkEmptyLists(metrics, "meters", "counters");
diff --git a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsGauges.java b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsGauges.java
index 91cc86f..c7b0e96 100644
--- a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsGauges.java
+++ b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsGauges.java
@@ -1,7 +1,6 @@
 package net.onrc.onos.api.rest;
 
 import com.codahale.metrics.Gauge;
-import com.codahale.metrics.MetricRegistry;
 import net.onrc.onos.core.intent.runtime.PathCalcRuntimeModule;
 import net.onrc.onos.core.metrics.OnosMetrics;
 import org.json.JSONArray;
@@ -50,40 +49,63 @@
 
     // Test data for Gauges
     private static final String GAUGE1_NAME = "gauge1";
+    private static final String GAUGE1_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                                                   OnosMetrics.MetricsFeatures.GLOBAL,
+                                                   GAUGE1_NAME);
     private static final int GAUGE1_VALUE = 0;
 
     private static final String GAUGE2_NAME = "gauge2";
+    private static final String GAUGE2_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                                                   OnosMetrics.MetricsFeatures.GLOBAL,
+                                                   GAUGE2_NAME);
     private static final int GAUGE2_VALUE = -1;
 
     private static final String GAUGE3_NAME = "gauge3";
+    private static final String GAUGE3_FULL_NAME = OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                                                   OnosMetrics.MetricsFeatures.GLOBAL,
+                                                   GAUGE3_NAME);
     private static final int GAUGE3_VALUE = 123456789;
 
-    private final Gauge<Integer> gauge1 = OnosMetrics.getMetricsRegistry().
-            register(MetricRegistry.name(GAUGE1_NAME),
+    private final Gauge<Integer> gauge1 =
                     new Gauge<Integer>() {
                         @Override
                         public Integer getValue() {
                             return GAUGE1_VALUE;
                         }
-                    });
+                    };
 
-    private final Gauge<Integer> gauge2 = OnosMetrics.getMetricsRegistry().
-            register(MetricRegistry.name(GAUGE2_NAME),
+    private final Gauge<Integer> gauge2 =
                     new Gauge<Integer>() {
                         @Override
                         public Integer getValue() {
                             return GAUGE2_VALUE;
                         }
-                    });
+                    };
 
-    private final Gauge<Integer> gauge3 = OnosMetrics.getMetricsRegistry().
-            register(MetricRegistry.name(GAUGE3_NAME),
+    private final Gauge<Integer> gauge3 =
                     new Gauge<Integer>() {
                         @Override
                         public Integer getValue() {
                             return GAUGE3_VALUE;
                         }
-                    });
+                    };
+
+    private void registerGauges() {
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                                   OnosMetrics.MetricsFeatures.GLOBAL,
+                                   GAUGE1_NAME,
+                                   gauge1);
+
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                                   OnosMetrics.MetricsFeatures.GLOBAL,
+                                   GAUGE2_NAME,
+                                   gauge2);
+
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                                   OnosMetrics.MetricsFeatures.GLOBAL,
+                                   GAUGE3_NAME,
+                                   gauge3);
+    }
 
     /**
      * Check that the JSON for a Gauge obect has the correct data values.
@@ -117,6 +139,7 @@
      */
     @Test
     public void testGauges() throws Exception {
+        registerGauges();
 
         //  Read the metrics from the REST API for the test data
         final ClientResource client = new ClientResource(getBaseRestMetricsUrl());
@@ -134,15 +157,15 @@
 
         //  Check the values for gauge 1
         final JSONObject gauge1Container = gauges.getJSONObject(0);
-        checkGauge(gauge1Container, GAUGE1_NAME, gauge1);
+        checkGauge(gauge1Container, GAUGE1_FULL_NAME, gauge1);
 
         //  Check the values for gauge 2
         final JSONObject gauge2Container = gauges.getJSONObject(1);
-        checkGauge(gauge2Container, GAUGE2_NAME, gauge2);
+        checkGauge(gauge2Container, GAUGE2_FULL_NAME, gauge2);
 
         //  Check the values for gauge 3
         final JSONObject gauge3Container = gauges.getJSONObject(2);
-        checkGauge(gauge3Container, GAUGE3_NAME, gauge3);
+        checkGauge(gauge3Container, GAUGE3_FULL_NAME, gauge3);
     }
 
 }
diff --git a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsHistograms.java b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsHistograms.java
index ae528db..772174e 100644
--- a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsHistograms.java
+++ b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsHistograms.java
@@ -56,23 +56,46 @@
     // Test data for Histograms
 
     private static final String HISTOGRAM1_NAME = "HISTOGRAM1";
+    private static final String HISTOGRAM1_FULL_NAME =
+            OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                    OnosMetrics.MetricsFeatures.GLOBAL,
+                    HISTOGRAM1_NAME);
     private static final int[] HISTOGRAM1_VALUES =
             {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
     private static final String HISTOGRAM2_NAME = "HISTOGRAM2";
+    private static final String HISTOGRAM2_FULL_NAME =
+            OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                    OnosMetrics.MetricsFeatures.GLOBAL,
+                    HISTOGRAM2_NAME);
     private static final int[] HISTOGRAM2_VALUES =
             {100, 100, 100, 100, 100, 100, 100};
 
     private static final String HISTOGRAM3_NAME = "HISTOGRAM3";
+    private static final String HISTOGRAM3_FULL_NAME =
+            OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                    OnosMetrics.MetricsFeatures.GLOBAL,
+                    HISTOGRAM3_NAME);
     private static final int[] HISTOGRAM3_VALUES =
             {555};
 
     private final Histogram histogram1 =
-            OnosMetrics.getMetricsRegistry().histogram(HISTOGRAM1_NAME);
+            OnosMetrics.createHistogram(
+                    OnosMetrics.MetricsComponents.GLOBAL,
+                    OnosMetrics.MetricsFeatures.GLOBAL,
+                    HISTOGRAM1_NAME);
+
     private final Histogram histogram2 =
-            OnosMetrics.getMetricsRegistry().histogram(HISTOGRAM2_NAME);
+            OnosMetrics.createHistogram(
+                    OnosMetrics.MetricsComponents.GLOBAL,
+                    OnosMetrics.MetricsFeatures.GLOBAL,
+                    HISTOGRAM2_NAME);
+
     private final Histogram histogram3 =
-            OnosMetrics.getMetricsRegistry().histogram(HISTOGRAM3_NAME);
+            OnosMetrics.createHistogram(
+                    OnosMetrics.MetricsComponents.GLOBAL,
+                    OnosMetrics.MetricsFeatures.GLOBAL,
+                    HISTOGRAM3_NAME);
 
     /**
      * Add each int in an array to a Histogram.
@@ -188,15 +211,15 @@
 
         //  Check the values for histogram 1
         final JSONObject histogram1Container = histograms.getJSONObject(0);
-        checkHistogram(histogram1Container, HISTOGRAM1_NAME, HISTOGRAM1_VALUES);
+        checkHistogram(histogram1Container, HISTOGRAM1_FULL_NAME, HISTOGRAM1_VALUES);
 
         //  Check the values for histogram 2
         final JSONObject histogram2Container = histograms.getJSONObject(1);
-        checkHistogram(histogram2Container, HISTOGRAM2_NAME, HISTOGRAM2_VALUES);
+        checkHistogram(histogram2Container, HISTOGRAM2_FULL_NAME, HISTOGRAM2_VALUES);
 
         //  Check the values for histogram 3
         final JSONObject histogram3Container = histograms.getJSONObject(2);
-        checkHistogram(histogram3Container, HISTOGRAM3_NAME, HISTOGRAM3_VALUES);
+        checkHistogram(histogram3Container, HISTOGRAM3_FULL_NAME, HISTOGRAM3_VALUES);
 
     }
 
diff --git a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsMeters.java b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsMeters.java
index c1b21b1..4cfb631 100644
--- a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsMeters.java
+++ b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsMeters.java
@@ -1,8 +1,6 @@
 package net.onrc.onos.api.rest;
 
 import com.codahale.metrics.Meter;
-import com.codahale.metrics.Metric;
-import com.codahale.metrics.MetricSet;
 import net.onrc.onos.core.intent.runtime.PathCalcRuntimeModule;
 import net.onrc.onos.core.metrics.OnosMetrics;
 import org.json.JSONArray;
@@ -16,9 +14,6 @@
 import org.powermock.modules.junit4.PowerMockRunner;
 import org.restlet.resource.ClientResource;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.both;
 import static org.hamcrest.Matchers.equalTo;
@@ -58,12 +53,27 @@
     //  Test data for Meters
 
     private static final String METER1_NAME = "METER1";
+    private static final String METER1_FULL_NAME =
+            OnosMetrics.generateName(
+                    OnosMetrics.MetricsComponents.GLOBAL,
+                    OnosMetrics.MetricsFeatures.GLOBAL,
+                    METER1_NAME);
     private static final int METER1_ITERATIONS = 1;
 
     private static final String METER2_NAME = "METER2";
+    private static final String METER2_FULL_NAME =
+            OnosMetrics.generateName(
+                    OnosMetrics.MetricsComponents.GLOBAL,
+                    OnosMetrics.MetricsFeatures.GLOBAL,
+                    METER2_NAME);
     private static final int METER2_ITERATIONS = 10;
 
     private static final String METER3_NAME = "METER3";
+    private static final String METER3_FULL_NAME =
+            OnosMetrics.generateName(
+                    OnosMetrics.MetricsComponents.GLOBAL,
+                    OnosMetrics.MetricsFeatures.GLOBAL,
+                    METER3_NAME);
     private static final int METER3_ITERATIONS = 100;
 
     private final Meter meter1 = new Meter(mockClock);
@@ -91,17 +101,20 @@
         fillMeter(meter2, METER2_ITERATIONS);
         fillMeter(meter3, METER3_ITERATIONS);
 
-        final MetricSet meterSet = new MetricSet() {
-            @Override
-            public Map<String, Metric> getMetrics() {
-                final Map<String, Metric> meters = new HashMap<>();
-                meters.put(METER1_NAME, meter1);
-                meters.put(METER2_NAME, meter2);
-                meters.put(METER3_NAME, meter3);
-                return meters;
-            }
-        };
-        OnosMetrics.getMetricsRegistry().registerAll(meterSet);
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                                   OnosMetrics.MetricsFeatures.GLOBAL,
+                                   METER1_NAME,
+                                   meter1);
+
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                                   OnosMetrics.MetricsFeatures.GLOBAL,
+                                   METER2_NAME,
+                                   meter2);
+
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                OnosMetrics.MetricsFeatures.GLOBAL,
+                METER3_NAME,
+                meter3);
     }
 
     /**
@@ -175,15 +188,15 @@
 
         //  Check the values for meter 1
         final JSONObject meter1Container = meters.getJSONObject(0);
-        checkMeter(meter1, meter1Container, METER1_NAME, METER1_ITERATIONS);
+        checkMeter(meter1, meter1Container, METER1_FULL_NAME, METER1_ITERATIONS);
 
         //  Check the values for meter 2
         final JSONObject meter2Container = meters.getJSONObject(1);
-        checkMeter(meter2, meter2Container, METER2_NAME, METER2_ITERATIONS);
+        checkMeter(meter2, meter2Container, METER2_FULL_NAME, METER2_ITERATIONS);
 
         //  Check the values for meter 3
         final JSONObject meter3Container = meters.getJSONObject(2);
-        checkMeter(meter3, meter3Container, METER3_NAME, METER3_ITERATIONS);
+        checkMeter(meter3, meter3Container, METER3_FULL_NAME, METER3_ITERATIONS);
 
     }
 
diff --git a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsTimers.java b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsTimers.java
index e6670b4..af0e7f8 100644
--- a/src/test/java/net/onrc/onos/api/rest/TestRestMetricsTimers.java
+++ b/src/test/java/net/onrc/onos/api/rest/TestRestMetricsTimers.java
@@ -1,7 +1,5 @@
 package net.onrc.onos.api.rest;
 
-import com.codahale.metrics.Metric;
-import com.codahale.metrics.MetricSet;
 import com.codahale.metrics.Reservoir;
 import com.codahale.metrics.SlidingWindowReservoir;
 import com.codahale.metrics.Timer;
@@ -18,10 +16,6 @@
 import org.powermock.modules.junit4.PowerMockRunner;
 import org.restlet.resource.ClientResource;
 
-import java.util.HashMap;
-import java.util.Map;
-
-import static com.codahale.metrics.MetricRegistry.name;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.both;
 import static org.hamcrest.Matchers.equalTo;
@@ -52,13 +46,19 @@
     //  Test data objects for Timers
 
     //  timer1 will be called 3 times
-    private static final String TIMER1_NAME = name(TestRestMetricsTimers.class,
-                                                   "timer1");
+    private static final String TIMER1_NAME = "timer1";
+    private static final String TIMER1_FULL_NAME =
+            OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                                     OnosMetrics.MetricsFeatures.GLOBAL,
+                                     TIMER1_NAME);
     private static final int TIMER1_COUNT = 3;
 
-    //  timer1 will be called 10 times
-    private static final String TIMER2_NAME = name(TestRestMetricsTimers.class,
-                                                   "timer2");
+    //  timer2 will be called 10 times
+    private static final String TIMER2_NAME = "timer2";
+    private static final String TIMER2_FULL_NAME =
+            OnosMetrics.generateName(OnosMetrics.MetricsComponents.GLOBAL,
+                    OnosMetrics.MetricsFeatures.GLOBAL,
+                    TIMER2_NAME);
     private static final int TIMER2_COUNT = 10;
 
     private static final int RESERVOIR_SIZE = 100;
@@ -89,16 +89,16 @@
 
         // add the two timers to the registry so the REST APIs will pick them
         // up
-        final MetricSet timerSet = new MetricSet() {
-            @Override
-            public Map<String, Metric> getMetrics() {
-                final Map<String, Metric> timers = new HashMap<>();
-                timers.put(TIMER1_NAME, timer1);
-                timers.put(TIMER2_NAME, timer2);
-                return timers;
-            }
-        };
-        OnosMetrics.getMetricsRegistry().registerAll(timerSet);
+
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                                   OnosMetrics.MetricsFeatures.GLOBAL,
+                                   TIMER1_NAME,
+                                   timer1);
+
+        OnosMetrics.registerMetric(OnosMetrics.MetricsComponents.GLOBAL,
+                                   OnosMetrics.MetricsFeatures.GLOBAL,
+                                   TIMER2_NAME,
+                                   timer2);
     }
 
     /**
@@ -174,7 +174,7 @@
 
         final String timer1Name = timer1Values.getString("name");
         assertThat(timer1Name, is(notNullValue()));
-        assertThat(timer1Name, is(equalTo(TIMER1_NAME)));
+        assertThat(timer1Name, is(equalTo(TIMER1_FULL_NAME)));
 
         final JSONObject timer1TimerObject = timer1Values.getJSONObject("timer");
         assertThat(timer1TimerObject, is(notNullValue()));
@@ -194,7 +194,7 @@
 
         final String timer2Name = timer2Values.getString("name");
         assertThat(timer2Name, is(notNullValue()));
-        assertThat(timer2Name, is(equalTo(TIMER2_NAME)));
+        assertThat(timer2Name, is(equalTo(TIMER2_FULL_NAME)));
 
         final JSONObject timer2TimerObject = timer2Values.getJSONObject("timer");
         assertThat(timer2TimerObject, is(notNullValue()));
