diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncAtomicCounter.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncAtomicCounter.java
index 1a38727..6a79292 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncAtomicCounter.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncAtomicCounter.java
@@ -16,6 +16,7 @@
 package org.onosproject.store.primitives.impl;
 
 import org.onosproject.store.service.AsyncAtomicCounter;
+import org.onosproject.utils.MeteringAgent;
 
 import java.util.concurrent.CompletableFuture;
 
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncAtomicValue.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncAtomicValue.java
index 7bbd9d3..1d42a97 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncAtomicValue.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncAtomicValue.java
@@ -32,6 +32,7 @@
 
 import com.google.common.base.Throwables;
 import com.google.common.collect.Maps;
+import org.onosproject.utils.MeteringAgent;
 
 
 public class DefaultAsyncAtomicValue<V> implements AsyncAtomicValue<V> {
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncConsistentMap.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncConsistentMap.java
index 281fd16..958734c 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncConsistentMap.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncConsistentMap.java
@@ -47,6 +47,7 @@
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.Versioned;
+import org.onosproject.utils.MeteringAgent;
 import org.slf4j.Logger;
 
 import com.google.common.cache.CacheBuilder;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncDistributedSet.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncDistributedSet.java
index aaa44aa..fe680aa 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncDistributedSet.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultAsyncDistributedSet.java
@@ -33,6 +33,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import org.onosproject.utils.MeteringAgent;
 
 /**
  * Implementation of {@link AsyncDistributedSet}.
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDistributedQueue.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDistributedQueue.java
index 8ea1d72..e4cf65f 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDistributedQueue.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDistributedQueue.java
@@ -22,6 +22,7 @@
 import org.onosproject.store.service.DistributedPrimitive;
 import org.onosproject.store.service.DistributedQueue;
 import org.onosproject.store.service.Serializer;
+import org.onosproject.utils.MeteringAgent;
 
 import java.util.List;
 import java.util.Set;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/MeteredAsyncConsistentMap.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/MeteredAsyncConsistentMap.java
index 540d0ad..c397f30 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/MeteredAsyncConsistentMap.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/MeteredAsyncConsistentMap.java
@@ -32,6 +32,7 @@
 
 import com.google.common.base.Throwables;
 import com.google.common.collect.Maps;
+import org.onosproject.utils.MeteringAgent;
 
 /**
  * {@link AsyncConsistentMap} that meters all its operations.
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/MeteringAgent.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/MeteringAgent.java
deleted file mode 100644
index 27a422e..0000000
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/MeteringAgent.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.store.primitives.impl;
-
-import com.codahale.metrics.Counter;
-import com.codahale.metrics.Timer;
-import com.google.common.collect.Maps;
-import org.onlab.metrics.MetricsComponent;
-import org.onlab.metrics.MetricsFeature;
-import org.onlab.metrics.MetricsService;
-import org.onlab.osgi.DefaultServiceDirectory;
-
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Agent that implements usage and performance monitoring via the metrics service.
- */
-public class MeteringAgent {
-
-    private Counter exceptionCounter;
-    private Counter perObjExceptionCounter;
-    private MetricsService metricsService;
-    private MetricsComponent metricsComponent;
-    private MetricsFeature metricsFeature;
-    private final Map<String, Timer> perObjOpTimers = Maps.newConcurrentMap();
-    private final Map<String, Timer> perOpTimers = Maps.newConcurrentMap();
-    private Timer perPrimitiveTimer;
-    private Timer perObjTimer;
-    private MetricsFeature wildcard;
-    private final boolean activated;
-    private Context nullTimer;
-
-    /**
-     * Constructs a new MeteringAgent for a given distributed primitive.
-     * Instantiates the metrics service
-     * Initializes all the general metrics for that object
-     *
-     * @param primitiveName Type of primitive to be metered
-     * @param objName Global name of the primitive
-     * @param activated boolean flag for whether metering is enabled or not
-     */
-    public MeteringAgent(String primitiveName, String objName, boolean activated) {
-        checkNotNull(objName, "Object name cannot be null");
-        this.activated = activated;
-        nullTimer = new Context(null, "");
-        if (this.activated) {
-            this.metricsService = DefaultServiceDirectory.getService(MetricsService.class);
-            this.metricsComponent = metricsService.registerComponent(primitiveName);
-            this.metricsFeature = metricsComponent.registerFeature(objName);
-            this.wildcard = metricsComponent.registerFeature("*");
-            this.perObjTimer = metricsService.createTimer(metricsComponent, metricsFeature, "*");
-            this.perPrimitiveTimer = metricsService.createTimer(metricsComponent, wildcard, "*");
-            this.perObjExceptionCounter = metricsService.createCounter(metricsComponent, metricsFeature, "exceptions");
-            this.exceptionCounter = metricsService.createCounter(metricsComponent, wildcard, "exceptions");
-        }
-    }
-
-    /**
-     * Initializes a specific timer for a given operation.
-     *
-     * @param op Specific operation being metered
-     * @return timer context
-     */
-    public Context startTimer(String op) {
-        if (!activated) {
-            return nullTimer;
-        }
-        // Check if timer exists, if it doesn't creates it
-        final Timer currTimer = perObjOpTimers.computeIfAbsent(op, timer ->
-                metricsService.createTimer(metricsComponent, metricsFeature, op));
-        perOpTimers.computeIfAbsent(op, timer -> metricsService.createTimer(metricsComponent, wildcard, op));
-        // Starts timer
-        return new Context(currTimer.time(), op);
-    }
-
-    /**
-     * Timer.Context with a specific operation.
-     */
-    public class Context {
-        private final Timer.Context context;
-        private final String operation;
-
-        /**
-         * Constructs Context.
-         *
-         * @param context context
-         * @param operation operation name
-         */
-        public Context(Timer.Context context, String operation) {
-            this.context = context;
-            this.operation = operation;
-        }
-
-        /**
-         * Stops timer given a specific context and updates all related metrics.
-         * @param e throwable
-         */
-        public void stop(Throwable e) {
-            if (!activated) {
-                return;
-            }
-            if (e == null) {
-                //Stop and updates timer with specific measurements per map, per operation
-                final long time = context.stop();
-                //updates timer with aggregated measurements per map
-                perOpTimers.get(operation).update(time, TimeUnit.NANOSECONDS);
-                //updates timer with aggregated measurements per map
-                perObjTimer.update(time, TimeUnit.NANOSECONDS);
-                //updates timer with aggregated measurements per all Consistent Maps
-                perPrimitiveTimer.update(time, TimeUnit.NANOSECONDS);
-            } else {
-                exceptionCounter.inc();
-                perObjExceptionCounter.inc();
-            }
-        }
-    }
-
-}
