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()));
