diff --git a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
index d68b287..633a356 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
@@ -50,6 +50,8 @@
 import org.onosproject.net.intent.HostToHostIntent;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.PointToPointIntent;
+import org.onosproject.net.meter.Band;
+import org.onosproject.net.meter.Meter;
 import org.onosproject.net.statistic.Load;
 import org.onosproject.net.topology.Topology;
 import org.onosproject.net.topology.TopologyCluster;
@@ -102,6 +104,8 @@
         registerCodec(Driver.class, new DriverCodec());
         registerCodec(GroupBucket.class, new GroupBucketCodec());
         registerCodec(Load.class, new LoadCodec());
+        registerCodec(Meter.class, new MeterCodec());
+        registerCodec(Band.class, new MeterBandCodec());
         registerCodec(TableStatisticsEntry.class, new TableStatisticsEntryCodec());
         registerCodec(PortStatistics.class, new PortStatisticsCodec());
         registerCodec(Metric.class, new MetricCodec());
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/MeterBandCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/MeterBandCodec.java
new file mode 100644
index 0000000..239082b
--- /dev/null
+++ b/core/common/src/main/java/org/onosproject/codec/impl/MeterBandCodec.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2014-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.codec.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.meter.Band;
+import org.onosproject.net.meter.DefaultBand;
+import org.slf4j.Logger;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Meter band JSON codec.
+ */
+public final class MeterBandCodec extends JsonCodec<Band> {
+    private final Logger log = getLogger(getClass());
+
+    // JSON field names
+    private static final String TYPE = "type";
+    private static final String RATE = "rate";
+    private static final String BURST_SIZE = "burstSize";
+    private static final String PREC = "prec";
+    private static final String PACKETS = "packets";
+    private static final String BYTES = "bytes";
+    private static final String MISSING_MEMBER_MESSAGE = " member is required in Band";
+
+    @Override
+    public ObjectNode encode(Band band, CodecContext context) {
+        checkNotNull(band, "Band cannot be null");
+
+        ObjectNode result = context.mapper().createObjectNode()
+                .put(TYPE, band.type().toString())
+                .put(RATE, band.rate())
+                .put(PACKETS, band.packets())
+                .put(BYTES, band.bytes())
+                .put(BURST_SIZE, band.burst());
+
+        if (band.dropPrecedence() != null) {
+            result.put(PREC, band.dropPrecedence());
+        }
+
+        return result;
+    }
+
+    @Override
+    public Band decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        // parse rate
+        long rate = nullIsIllegal(json.get(RATE), RATE + MISSING_MEMBER_MESSAGE).asLong();
+
+        // parse burst size
+        long burstSize = nullIsIllegal(json.get(BURST_SIZE), BURST_SIZE + MISSING_MEMBER_MESSAGE).asLong();
+
+        // parse precedence
+        Short precedence = null;
+
+        // parse band type
+        String typeStr = nullIsIllegal(json.get(TYPE), TYPE + MISSING_MEMBER_MESSAGE).asText();
+        Band.Type type;
+        switch (typeStr) {
+            case "DROP":
+                type = Band.Type.DROP;
+                break;
+            case "REMARK":
+                type = Band.Type.REMARK;
+                precedence = (short) nullIsIllegal(json.get(PREC), PREC + MISSING_MEMBER_MESSAGE).asInt();
+                break;
+            default:
+                log.warn("The requested type {} is not defined for band.", typeStr);
+                return null;
+        }
+
+        Band band = DefaultBand.builder()
+                .ofType(type)
+                .burstSize(burstSize)
+                .withRate(rate)
+                .dropPrecedence(precedence)
+                .build();
+
+        return band;
+    }
+}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/MeterCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/MeterCodec.java
new file mode 100644
index 0000000..468d237
--- /dev/null
+++ b/core/common/src/main/java/org/onosproject/codec/impl/MeterCodec.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2014-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.codec.impl;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.meter.Band;
+import org.onosproject.net.meter.DefaultMeter;
+import org.onosproject.net.meter.Meter;
+import org.onosproject.net.meter.MeterId;
+import org.slf4j.Logger;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.IntStream;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
+import static org.slf4j.LoggerFactory.getLogger;
+
+
+/**
+ * Meter JSON codec.
+ */
+public final class MeterCodec extends JsonCodec<Meter> {
+    private final Logger log = getLogger(getClass());
+
+    // JSON field names
+    private static final String ID = "id";
+    private static final String STATE = "state";
+    private static final String LIFE = "life";
+    private static final String PACKETS = "packets";
+    private static final String BYTES = "bytes";
+    private static final String REFERENCE_COUNT = "referenceCount";
+    private static final String APP_ID = "appId";
+    private static final String BURST = "burst";
+    private static final String DEVICE_ID = "deviceId";
+    private static final String UNIT = "unit";
+    private static final String BANDS = "bands";
+    public static final String REST_APP_ID = "org.onosproject.rest";
+    private static final String MISSING_MEMBER_MESSAGE = " member is required in Meter";
+
+    @Override
+    public ObjectNode encode(Meter meter, CodecContext context) {
+        checkNotNull(meter, "Meter cannot be null");
+        ObjectNode result = context.mapper().createObjectNode()
+                .put(ID, meter.id().toString())
+                .put(LIFE, meter.life())
+                .put(PACKETS, meter.packetsSeen())
+                .put(BYTES, meter.bytesSeen())
+                .put(REFERENCE_COUNT, meter.referenceCount())
+                .put(UNIT, meter.unit().toString())
+                .put(BURST, meter.isBurst())
+                .put(DEVICE_ID, meter.deviceId().toString());
+
+        if (meter.appId() != null) {
+            result.put(APP_ID, meter.appId().toString());
+        }
+
+        if (meter.state() != null) {
+            result.put(STATE, meter.state().toString());
+        }
+
+        ArrayNode bands = context.mapper().createArrayNode();
+        meter.bands().forEach(band -> {
+            ObjectNode bandJson = context.codec(Band.class).encode(band, context);
+            bands.add(bandJson);
+        });
+        result.set(BANDS, bands);
+        return result;
+    }
+
+    @Override
+    public Meter decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        final JsonCodec<Band> meterBandCodec = context.codec(Band.class);
+        CoreService coreService = context.getService(CoreService.class);
+
+        // parse meter id
+        int meterIdInt = nullIsIllegal(json.get(ID), ID + MISSING_MEMBER_MESSAGE).asInt();
+        MeterId meterId = MeterId.meterId(meterIdInt);
+
+        // parse device id
+        DeviceId deviceId = DeviceId.deviceId(nullIsIllegal(json.get(DEVICE_ID),
+                DEVICE_ID + MISSING_MEMBER_MESSAGE).asText());
+
+        // application id
+        ApplicationId appId = coreService.registerApplication(REST_APP_ID);
+
+        // parse burst
+        boolean burst = false;
+        JsonNode burstJson = json.get("burst");
+        if (burstJson != null) {
+            burst = burstJson.asBoolean();
+        }
+
+        // parse unit type
+        String unit = nullIsIllegal(json.get(UNIT), UNIT + MISSING_MEMBER_MESSAGE).asText();
+        Meter.Unit meterUnit;
+
+        switch (unit) {
+            case "KB_PER_SEC":
+                meterUnit = Meter.Unit.KB_PER_SEC;
+                break;
+            case "PKTS_PER_SEC":
+                meterUnit = Meter.Unit.PKTS_PER_SEC;
+                break;
+            default:
+                log.warn("The requested unit {} is not defined for meter.", unit);
+                return null;
+        }
+
+        // parse meter bands
+        List<Band> bandList = new ArrayList<>();
+        JsonNode bandsJson = json.get(BANDS);
+        checkNotNull(bandsJson);
+        if (bandsJson != null) {
+            IntStream.range(0, bandsJson.size()).forEach(i -> {
+                ObjectNode bandJson = get(bandsJson, i);
+                bandList.add(meterBandCodec.decode(bandJson, context));
+            });
+        }
+
+        Meter meter;
+        if (burst) {
+            meter = DefaultMeter.builder()
+                    .withId(meterId)
+                    .fromApp(appId)
+                    .forDevice(deviceId)
+                    .withUnit(meterUnit)
+                    .withBands(bandList)
+                    .burst().build();
+        } else {
+            meter = DefaultMeter.builder()
+                    .withId(meterId)
+                    .fromApp(appId)
+                    .forDevice(deviceId)
+                    .withUnit(meterUnit)
+                    .withBands(bandList).build();
+        }
+
+        return meter;
+    }
+}
