diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingCodecRegistrator.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingCodecRegistrator.java
new file mode 100644
index 0000000..d4d91d2
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingCodecRegistrator.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2017-present 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.mapping;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.codec.CodecService;
+import org.onosproject.mapping.actions.MappingAction;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.instructions.MappingInstruction;
+import org.onosproject.mapping.codec.MappingActionCodec;
+import org.onosproject.mapping.codec.MappingAddressCodec;
+import org.onosproject.mapping.codec.MappingInstructionCodec;
+import org.onosproject.mapping.codec.MappingKeyCodec;
+import org.onosproject.mapping.codec.MappingTreatmentCodec;
+import org.onosproject.mapping.codec.MappingValueCodec;
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation of the JSON codec brokering service for mapping primitives.
+ */
+@Component(immediate = true)
+public class MappingCodecRegistrator {
+
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    public CodecService codecService;
+
+    @Activate
+    public void activate() {
+        codecService.registerCodec(MappingAddress.class, new MappingAddressCodec());
+        codecService.registerCodec(MappingInstruction.class, new MappingInstructionCodec());
+        codecService.registerCodec(MappingAction.class, new MappingActionCodec());
+        codecService.registerCodec(MappingTreatment.class, new MappingTreatmentCodec());
+        codecService.registerCodec(MappingKey.class, new MappingKeyCodec());
+        codecService.registerCodec(MappingValue.class, new MappingValueCodec());
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        codecService.unregisterCodec(MappingAddress.class);
+        codecService.unregisterCodec(MappingInstruction.class);
+        codecService.unregisterCodec(MappingAction.class);
+        codecService.unregisterCodec(MappingTreatment.class);
+        codecService.unregisterCodec(MappingKey.class);
+        codecService.unregisterCodec(MappingValue.class);
+
+        log.info("Stopped");
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/DecodeMappingActionCodecHelper.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/DecodeMappingActionCodecHelper.java
new file mode 100644
index 0000000..d0c1065
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/DecodeMappingActionCodecHelper.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.mapping.actions.MappingAction;
+import org.onosproject.mapping.actions.MappingActions;
+
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * Decode portion of the mapping action codec.
+ */
+public final class DecodeMappingActionCodecHelper {
+    private final ObjectNode json;
+
+    /**
+     * Creates a decode mapping action codec object.
+     *
+     * @param json    JSON object to decode
+     */
+    public DecodeMappingActionCodecHelper(ObjectNode json) {
+        this.json = json;
+    }
+
+    /**
+     * Decodes a no mapping action.
+     *
+     * @return mapping action object decoded from the JSON
+     */
+    private MappingAction decodeNoAction() {
+        return MappingActions.noAction();
+    }
+
+    /**
+     * Decodes a forward mapping action.
+     *
+     * @return mapping action object decoded from the JSON
+     */
+    private MappingAction decodeForwardAction() {
+        return MappingActions.forward();
+    }
+
+    /**
+     * Decodes a native forward mapping action.
+     *
+     * @return mapping action object decoded from the JSON
+     */
+    private MappingAction decodeNativeForwardAction() {
+        return MappingActions.nativeForward();
+    }
+
+    /**
+     * Decodes a drop mapping action.
+     *
+     * @return mapping action object decoded from the JSON
+     */
+    private MappingAction decodeDropAction() {
+        return MappingActions.drop();
+    }
+
+    /**
+     * Decodes the JSON into a mapping action object.
+     *
+     * @return MappingAction object
+     * @throws IllegalArgumentException if the JSON is invalid
+     */
+    public MappingAction decode() {
+       String type =  nullIsIllegal(json.get(MappingActionCodec.TYPE),
+               MappingActionCodec.TYPE + MappingActionCodec.ERROR_MESSAGE).asText();
+
+       if (type.equals(MappingAction.Type.DROP.name())) {
+           return decodeDropAction();
+       } else if (type.equals(MappingAction.Type.FORWARD.name())) {
+           return decodeForwardAction();
+       } else if (type.equals(MappingAction.Type.NATIVE_FORWARD.name())) {
+           return decodeNativeForwardAction();
+       } else if (type.equals(MappingAction.Type.NO_ACTION.name())) {
+           return decodeNoAction();
+       }
+       throw new IllegalArgumentException("MappingAction type "
+                + type + " is not supported");
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/DecodeMappingAddressCodecHelper.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/DecodeMappingAddressCodecHelper.java
new file mode 100644
index 0000000..32eb130
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/DecodeMappingAddressCodecHelper.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Maps;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddresses;
+
+import java.util.Map;
+
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * Decode portion of the mapping address codec.
+ */
+public final class DecodeMappingAddressCodecHelper {
+
+    private final ObjectNode json;
+
+    protected static final String MISSING_MEMBER_MESSAGE =
+                                  " member is required in Mapping Address";
+
+    private final Map<String, MappingAddressDecoder> decoderMap;
+
+    /**
+     * Creates a decode mapping address codec object.
+     * Initializes the lookup map for mapping address subclass decoders.
+     *
+     * @param json JSON object to decode
+     */
+    public DecodeMappingAddressCodecHelper(ObjectNode json) {
+       this.json = json;
+       decoderMap = Maps.newHashMap();
+
+       decoderMap.put(MappingAddress.Type.IPV4.name(), new Ipv4TypeDecoder());
+       decoderMap.put(MappingAddress.Type.IPV6.name(), new Ipv6TypeDecoder());
+       decoderMap.put(MappingAddress.Type.AS.name(), new AsTypeDecoder());
+       decoderMap.put(MappingAddress.Type.DN.name(), new DnTypeDecoder());
+       decoderMap.put(MappingAddress.Type.ETH.name(), new EthTypeDecoder());
+    }
+
+    /**
+     * An interface of mapping address type decoder.
+     */
+    private interface MappingAddressDecoder {
+        MappingAddress decodeMappingAddress(ObjectNode json);
+    }
+
+    /**
+     * Implementation of IPv4 mapping address decoder.
+     */
+    private class Ipv4TypeDecoder implements MappingAddressDecoder {
+
+        @Override
+        public MappingAddress decodeMappingAddress(ObjectNode json) {
+            String ip = nullIsIllegal(json.get(MappingAddressCodec.IPV4),
+                    MappingAddressCodec.IPV4 + MISSING_MEMBER_MESSAGE).asText();
+            return MappingAddresses.ipv4MappingAddress(IpPrefix.valueOf(ip));
+        }
+    }
+
+    /**
+     * Implementation of IPv6 mapping address decoder.
+     */
+    private class Ipv6TypeDecoder implements MappingAddressDecoder {
+
+        @Override
+        public MappingAddress decodeMappingAddress(ObjectNode json) {
+            String ip = nullIsIllegal(json.get(MappingAddressCodec.IPV6),
+                    MappingAddressCodec.IPV6 + MISSING_MEMBER_MESSAGE).asText();
+            return MappingAddresses.ipv6MappingAddress(IpPrefix.valueOf(ip));
+        }
+    }
+
+    /**
+     * Implementation of AS mapping address decoder.
+     */
+    private class AsTypeDecoder implements MappingAddressDecoder {
+
+        @Override
+        public MappingAddress decodeMappingAddress(ObjectNode json) {
+            String as = nullIsIllegal(json.get(MappingAddressCodec.AS),
+                    MappingAddressCodec.AS + MISSING_MEMBER_MESSAGE).asText();
+            return MappingAddresses.asMappingAddress(as);
+        }
+    }
+
+    /**
+     * Implementation of DN mapping address decoder.
+     */
+    private class DnTypeDecoder implements MappingAddressDecoder {
+
+        @Override
+        public MappingAddress decodeMappingAddress(ObjectNode json) {
+            String dn = nullIsIllegal(json.get(MappingAddressCodec.DN),
+                    MappingAddressCodec.DN + MISSING_MEMBER_MESSAGE).asText();
+            return MappingAddresses.dnMappingAddress(dn);
+        }
+    }
+
+    /**
+     * Implementation of Ethernet mapping address decoder.
+     */
+    private class EthTypeDecoder implements MappingAddressDecoder {
+
+        @Override
+        public MappingAddress decodeMappingAddress(ObjectNode json) {
+            MacAddress mac = MacAddress.valueOf(nullIsIllegal(json.get(MappingAddressCodec.MAC),
+                    MappingAddressCodec.MAC + MISSING_MEMBER_MESSAGE).asText());
+            return MappingAddresses.ethMappingAddress(mac);
+        }
+    }
+
+    /**
+     * Decodes the JSON into a mapping address object.
+     *
+     * @return MappingAddress object
+     * @throws IllegalArgumentException if the JSON is invalid
+     */
+    public MappingAddress decode() {
+        String type =
+                nullIsIllegal(json.get(MappingAddressCodec.TYPE),
+                                    "Type not specified").asText();
+
+        MappingAddressDecoder decoder = decoderMap.get(type);
+        if (decoder != null) {
+            return decoder.decodeMappingAddress(json);
+        }
+
+        throw new IllegalArgumentException("Type " + type + " is unknown");
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/DecodeMappingInstructionCodecHelper.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/DecodeMappingInstructionCodecHelper.java
new file mode 100644
index 0000000..1b94692
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/DecodeMappingInstructionCodecHelper.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.mapping.instructions.MappingInstruction;
+import org.onosproject.mapping.instructions.MappingInstructions;
+import org.onosproject.mapping.instructions.MulticastMappingInstruction;
+import org.onosproject.mapping.instructions.UnicastMappingInstruction;
+
+import static org.onlab.util.Tools.nullIsIllegal;
+
+/**
+ * Decoding portion of the mapping instruction codec.
+ */
+public final class DecodeMappingInstructionCodecHelper {
+    private final ObjectNode json;
+    private final CodecContext context;
+
+    /**
+     * Creates a decode mapping instruction codec object.
+     *
+     * @param json    JSON object to decode
+     * @param context codec context
+     */
+    public DecodeMappingInstructionCodecHelper(ObjectNode json, CodecContext context) {
+        this.json = json;
+        this.context = context;
+    }
+
+    /**
+     * Decodes an unicast mapping instruction.
+     *
+     * @return mapping instruction object decoded from the JSON
+     * @throws IllegalArgumentException if the JSON is invalid
+     */
+    private MappingInstruction decodeUnicast() {
+        String subType = nullIsIllegal(json.get(MappingInstructionCodec.SUBTYPE),
+                MappingInstructionCodec.SUBTYPE + MappingInstructionCodec.ERROR_MESSAGE).asText();
+
+        if (subType.equals(UnicastMappingInstruction.UnicastType.WEIGHT.name())) {
+            int weight = nullIsIllegal(json.get(MappingInstructionCodec.UNICAST_WEIGHT),
+                    MappingInstructionCodec.UNICAST_WEIGHT +
+                            MappingInstructionCodec.MISSING_MEMBER_MESSAGE).asInt();
+            return MappingInstructions.unicastWeight(weight);
+        } else if (subType.equals(UnicastMappingInstruction.UnicastType.PRIORITY.name())) {
+            int priority = nullIsIllegal(json.get(MappingInstructionCodec.UNICAST_PRIORITY),
+                    MappingInstructionCodec.UNICAST_PRIORITY +
+                            MappingInstructionCodec.MISSING_MEMBER_MESSAGE).asInt();
+            return MappingInstructions.unicastPriority(priority);
+        }
+        throw new IllegalArgumentException("Unicast MappingInstruction subtype "
+                + subType + " is not supported");
+    }
+
+    /**
+     * Decodes a multicast mapping instruction.
+     *
+     * @return mapping instruction object decoded from the JSON
+     * @throws IllegalArgumentException if the JSON is invalid
+     */
+    private MappingInstruction decodeMulticast() {
+        String subType = nullIsIllegal(json.get(MappingInstructionCodec.SUBTYPE),
+                MappingInstructionCodec.SUBTYPE + MappingInstructionCodec.ERROR_MESSAGE).asText();
+
+        if (subType.equals(MulticastMappingInstruction.MulticastType.WEIGHT.name())) {
+            int weight = nullIsIllegal(json.get(MappingInstructionCodec.MULTICAST_WEIGHT),
+                    MappingInstructionCodec.MULTICAST_WEIGHT +
+                            MappingInstructionCodec.MISSING_MEMBER_MESSAGE).asInt();
+            return MappingInstructions.multicastWeight(weight);
+        } else if (subType.equals(MulticastMappingInstruction.MulticastType.PRIORITY.name())) {
+            int priority = nullIsIllegal(json.get(MappingInstructionCodec.MULTICAST_PRIORITY),
+                    MappingInstructionCodec.MULTICAST_PRIORITY +
+                            MappingInstructionCodec.MISSING_MEMBER_MESSAGE).asInt();
+            return MappingInstructions.multicastPriority(priority);
+        }
+        throw new IllegalArgumentException("Multicast MappingInstruction subtype "
+                + subType + " is not supported");
+    }
+
+    /**
+     * Decodes the JSON into a mapping instruction object.
+     *
+     * @return MappingInstruction object
+     * @throws IllegalArgumentException if the JSON is invalid
+     */
+    public MappingInstruction decode() {
+        String type = nullIsIllegal(json.get(MappingInstructionCodec.TYPE),
+                MappingInstructionCodec.TYPE + MappingInstructionCodec.ERROR_MESSAGE).asText();
+
+        if (type.equals(MappingInstruction.Type.UNICAST.name())) {
+            return decodeUnicast();
+        } else if (type.equals(MappingInstruction.Type.MULTICAST.name())) {
+            return decodeMulticast();
+        }
+        throw new IllegalArgumentException("MappingInstruction type "
+                + type + " is not supported");
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/EncodeMappingActionCodecHelper.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/EncodeMappingActionCodecHelper.java
new file mode 100644
index 0000000..7c42544
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/EncodeMappingActionCodecHelper.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.mapping.actions.MappingAction;
+import org.onosproject.mapping.actions.NoMappingAction;
+import org.onosproject.mapping.actions.DropMappingAction;
+import org.onosproject.mapping.actions.ForwardMappingAction;
+import org.onosproject.mapping.actions.NativeForwardMappingAction;
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Encode portion of the mapping action codec.
+ */
+public final class EncodeMappingActionCodecHelper {
+    protected static final Logger log = getLogger(EncodeMappingActionCodecHelper.class);
+    private final MappingAction action;
+    private final CodecContext context;
+
+    /**
+     * Creates a mapping action object encoder.
+     *
+     * @param action  mapping action to encode
+     * @param context codec context for the encoding
+     */
+    public EncodeMappingActionCodecHelper(MappingAction action,
+                                          CodecContext context) {
+        this.action = action;
+        this.context = context;
+    }
+
+    /**
+     * Encodes a no mapping action.
+     *
+     * @param result json node that the mapping action attributes are added to
+     */
+    private void encodeNoMappingAction(ObjectNode result) {
+        NoMappingAction noMappingAction = (NoMappingAction) action;
+        result.put(MappingActionCodec.TYPE, noMappingAction.type().name());
+    }
+
+    /**
+     * Encodes a drop mapping action.
+     *
+     * @param result json node that the mapping action attributes are added to
+     */
+    private void encodeDropMappingAction(ObjectNode result) {
+        DropMappingAction dropMappingAction = (DropMappingAction) action;
+        result.put(MappingActionCodec.TYPE, dropMappingAction.type().name());
+    }
+
+    /**
+     * Encodes a forward mapping action.
+     *
+     * @param result json node that the mapping action attributes are added to
+     */
+    private void encodeForwardMappingAction(ObjectNode result) {
+        ForwardMappingAction forwardMappingAction = (ForwardMappingAction) action;
+        result.put(MappingActionCodec.TYPE, forwardMappingAction.type().name());
+    }
+
+    /**
+     * Encodes a native forward mapping action.
+     *
+     * @param result json node that the mapping action attributes are added to
+     */
+    private void encodeNativeForwardMappingAction(ObjectNode result) {
+        NativeForwardMappingAction nativeMappingAction = (NativeForwardMappingAction) action;
+        result.put(MappingActionCodec.TYPE, nativeMappingAction.type().name());
+    }
+
+    /**
+     * Encodes the given mapping instruction into JSON.
+     *
+     * @return JSON object node representing the mapping action
+     */
+    public ObjectNode encode() {
+       final ObjectNode result = context.mapper().createObjectNode()
+               .put(MappingActionCodec.TYPE, action.type().toString());
+
+       switch (action.type()) {
+           case DROP:
+               encodeDropMappingAction(result);
+               break;
+           case FORWARD:
+               encodeForwardMappingAction(result);
+               break;
+           case NATIVE_FORWARD:
+               encodeNativeForwardMappingAction(result);
+               break;
+           case NO_ACTION:
+               encodeNoMappingAction(result);
+               break;
+           default:
+               log.info("Cannot convert mapping action type of {}", action.type());
+               break;
+       }
+       return result;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/EncodeMappingAddressCodecHelper.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/EncodeMappingAddressCodecHelper.java
new file mode 100644
index 0000000..8847bca
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/EncodeMappingAddressCodecHelper.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.mapping.addresses.ASMappingAddress;
+import org.onosproject.mapping.addresses.DNMappingAddress;
+import org.onosproject.mapping.addresses.EthMappingAddress;
+import org.onosproject.mapping.addresses.IPMappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
+
+import java.util.EnumMap;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Encode portion of the mapping address codec.
+ */
+public final class EncodeMappingAddressCodecHelper {
+
+    private final MappingAddress address;
+    private final CodecContext context;
+
+    private final EnumMap<MappingAddress.Type, MappingAddressTypeFormatter> formatMap;
+
+    /**
+     * Creates an encoder object for a mapping address.
+     * Initializes the formatter lookup map for the mapping address subclasses.
+     *
+     * @param address MappingAddress to encode
+     * @param context context of the JSON encoding
+     */
+    public EncodeMappingAddressCodecHelper(MappingAddress address, CodecContext context) {
+        this.address = address;
+        this.context = context;
+
+        formatMap = new EnumMap<>(MappingAddress.Type.class);
+
+        formatMap.put(MappingAddress.Type.IPV4, new FormatIpv4());
+        formatMap.put(MappingAddress.Type.IPV6, new FormatIpv6());
+        formatMap.put(MappingAddress.Type.AS, new FormatAs());
+        formatMap.put(MappingAddress.Type.DN, new FormatDn());
+        formatMap.put(MappingAddress.Type.ETH, new FormatEth());
+
+        // TODO: not process extension mapping address for now
+        formatMap.put(MappingAddress.Type.EXTENSION, new FormatUnknown());
+    }
+
+    /**
+     * An interface of mapping address type formatter.
+     */
+    private interface MappingAddressTypeFormatter {
+        ObjectNode encodeMappingAddress(ObjectNode root, MappingAddress address);
+    }
+
+    /**
+     * Implementation of IPv4 mapping address type formatter.
+     */
+    private static class FormatIpv4 implements MappingAddressTypeFormatter {
+
+        @Override
+        public ObjectNode encodeMappingAddress(ObjectNode root, MappingAddress address) {
+            final IPMappingAddress ipv4 = (IPMappingAddress) address;
+            return root.put(MappingAddressCodec.IPV4, ipv4.ip().toString());
+        }
+    }
+
+    /**
+     * Implementation of IPv6 mapping address type formatter.
+     */
+    private static class FormatIpv6 implements MappingAddressTypeFormatter {
+
+        @Override
+        public ObjectNode encodeMappingAddress(ObjectNode root, MappingAddress address) {
+            final IPMappingAddress ipv6 = (IPMappingAddress) address;
+            return root.put(MappingAddressCodec.IPV6, ipv6.ip().toString());
+        }
+    }
+
+    /**
+     * Implementation of AS mapping address type formatter.
+     */
+    private static class FormatAs implements MappingAddressTypeFormatter {
+
+        @Override
+        public ObjectNode encodeMappingAddress(ObjectNode root, MappingAddress address) {
+            final ASMappingAddress as = (ASMappingAddress) address;
+            return root.put(MappingAddressCodec.AS, as.asNumber());
+        }
+    }
+
+    /**
+     * Implementation of Distinguished Name mapping address type formatter.
+     */
+    private static class FormatDn implements MappingAddressTypeFormatter {
+
+        @Override
+        public ObjectNode encodeMappingAddress(ObjectNode root, MappingAddress address) {
+            final DNMappingAddress dn = (DNMappingAddress) address;
+            return root.put(MappingAddressCodec.DN, dn.name());
+        }
+    }
+
+    /**
+     * Implementation of Ethernet mapping address type formatter.
+     */
+    private static class FormatEth implements MappingAddressTypeFormatter {
+
+        @Override
+        public ObjectNode encodeMappingAddress(ObjectNode root, MappingAddress address) {
+            final EthMappingAddress eth = (EthMappingAddress) address;
+            return root.put(MappingAddressCodec.MAC, eth.mac().toString());
+        }
+    }
+
+    /**
+     * Implementation of Extension mapping address type formatter.
+     */
+    private static class FormatExtension implements MappingAddressTypeFormatter {
+
+        @Override
+        public ObjectNode encodeMappingAddress(ObjectNode root, MappingAddress address) {
+            return null;
+        }
+    }
+
+    /**
+     * Implementation of Unknown mapping address type formatter.
+     */
+    private static class FormatUnknown implements MappingAddressTypeFormatter {
+
+        @Override
+        public ObjectNode encodeMappingAddress(ObjectNode root, MappingAddress address) {
+            return root;
+        }
+    }
+
+    /**
+     * Encodes a mapping address into a JSON node.
+     *
+     * @return encoded JSON object for the given mapping address
+     */
+    public ObjectNode encode() {
+        final ObjectNode result = context.mapper().createObjectNode()
+                    .put(MappingAddressCodec.TYPE, address.type().toString());
+
+        MappingAddressTypeFormatter formatter =
+                checkNotNull(formatMap.get(address.type()),
+                        "No formatter found for mapping address type "
+                        + address.type().toString());
+
+        return formatter.encodeMappingAddress(result, address);
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/EncodeMappingInstructionCodecHelper.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/EncodeMappingInstructionCodecHelper.java
new file mode 100644
index 0000000..53343a6
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/EncodeMappingInstructionCodecHelper.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.mapping.instructions.MappingInstruction;
+import org.onosproject.mapping.instructions.MulticastMappingInstruction;
+import org.onosproject.mapping.instructions.UnicastMappingInstruction;
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * JSON encoding of MappingInstructions.
+ */
+public final class EncodeMappingInstructionCodecHelper {
+    protected static final Logger log = getLogger(EncodeMappingInstructionCodecHelper.class);
+    private final MappingInstruction instruction;
+    private final CodecContext context;
+
+    /**
+     * Creates a mapping instruction object encoder.
+     *
+     * @param instruction mapping instruction to encode
+     * @param context     codec context for the encoding
+     */
+    public EncodeMappingInstructionCodecHelper(MappingInstruction instruction,
+                                               CodecContext context) {
+        this.instruction = instruction;
+        this.context = context;
+    }
+
+    /**
+     * Encodes an unicast mapping instruction.
+     *
+     * @param result json node that the mapping instruction
+     *               attributes are added to
+     */
+    private void encodeUnicast(ObjectNode result) {
+        UnicastMappingInstruction unicastInstruction =
+                (UnicastMappingInstruction) instruction;
+        result.put(MappingInstructionCodec.SUBTYPE, unicastInstruction.subtype().name());
+
+        switch (unicastInstruction.subtype()) {
+            case WEIGHT:
+                UnicastMappingInstruction.WeightMappingInstruction wmi =
+                        (UnicastMappingInstruction.WeightMappingInstruction)
+                                                            unicastInstruction;
+                result.put(MappingInstructionCodec.UNICAST_WEIGHT, wmi.weight());
+                break;
+            case PRIORITY:
+                UnicastMappingInstruction.PriorityMappingInstruction pmi =
+                        (UnicastMappingInstruction.PriorityMappingInstruction)
+                                                            unicastInstruction;
+                result.put(MappingInstructionCodec.UNICAST_PRIORITY, pmi.priority());
+                break;
+            default:
+                log.info("Cannot convert unicast subtype of {}",
+                                                unicastInstruction.subtype());
+        }
+    }
+
+    /**
+     * Encodes a multicast mapping instruction.
+     *
+     * @param result json node that the mapping instruction
+     *               attributes are added to
+     */
+    private void encodeMulticast(ObjectNode result) {
+        MulticastMappingInstruction multicastMappingInstruction =
+                (MulticastMappingInstruction) instruction;
+        result.put(MappingInstructionCodec.SUBTYPE, multicastMappingInstruction.subtype().name());
+
+        switch (multicastMappingInstruction.subtype()) {
+            case WEIGHT:
+                MulticastMappingInstruction.WeightMappingInstruction wmi =
+                        (MulticastMappingInstruction.WeightMappingInstruction)
+                                                    multicastMappingInstruction;
+                result.put(MappingInstructionCodec.MULTICAST_WEIGHT, wmi.weight());
+                break;
+            case PRIORITY:
+                MulticastMappingInstruction.PriorityMappingInstruction pmi =
+                        (MulticastMappingInstruction.PriorityMappingInstruction)
+                                                    multicastMappingInstruction;
+                result.put(MappingInstructionCodec.MULTICAST_PRIORITY, pmi.priority());
+                break;
+            default:
+                log.info("Cannot convert multicast subtype of {}",
+                                            multicastMappingInstruction.subtype());
+        }
+    }
+
+    /**
+     * Encodes the given mapping instruction into JSON.
+     *
+     * @return JSON object node representing the mapping instruction.
+     */
+    public ObjectNode encode() {
+        final ObjectNode result = context.mapper().createObjectNode()
+                .put(MappingInstructionCodec.TYPE, instruction.type().toString());
+
+        switch (instruction.type()) {
+            case UNICAST:
+                encodeUnicast(result);
+                break;
+            case MULTICAST:
+                encodeMulticast(result);
+                break;
+            default:
+                log.info("Cannot convert mapping instruction type of {}", instruction.type());
+                break;
+        }
+        return result;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingActionCodec.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingActionCodec.java
new file mode 100644
index 0000000..511f862
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingActionCodec.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.mapping.actions.MappingAction;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Mapping action codec.
+ */
+public final class MappingActionCodec extends JsonCodec<MappingAction> {
+
+    protected static final Logger log =
+                            LoggerFactory.getLogger(MappingActionCodec.class);
+
+    protected static final String TYPE = "type";
+    protected static final String ERROR_MESSAGE =
+                                    " not specified in MappingAction";
+
+    @Override
+    public ObjectNode encode(MappingAction action, CodecContext context) {
+        EncodeMappingActionCodecHelper encoder =
+                            new EncodeMappingActionCodecHelper(action, context);
+        return encoder.encode();
+    }
+
+    @Override
+    public MappingAction decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        DecodeMappingActionCodecHelper decoder =
+                new DecodeMappingActionCodecHelper(json);
+        return decoder.decode();
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingAddressCodec.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingAddressCodec.java
new file mode 100644
index 0000000..7b756b6
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingAddressCodec.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Mapping address codec.
+ */
+public final class MappingAddressCodec extends JsonCodec<MappingAddress> {
+
+    protected static final Logger log =
+                            LoggerFactory.getLogger(MappingAddressCodec.class);
+
+    protected static final String TYPE = "type";
+    protected static final String IPV4 = "ipv4";
+    protected static final String IPV6 = "ipv6";
+    protected static final String MAC = "mac";
+    protected static final String DN = "dn";
+    protected static final String AS = "as";
+
+    @Override
+    public ObjectNode encode(MappingAddress address, CodecContext context) {
+        EncodeMappingAddressCodecHelper encoder =
+                            new EncodeMappingAddressCodecHelper(address, context);
+        return encoder.encode();
+    }
+
+    @Override
+    public MappingAddress decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        DecodeMappingAddressCodecHelper decoder =
+                            new DecodeMappingAddressCodecHelper(json);
+        return decoder.decode();
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingInstructionCodec.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingInstructionCodec.java
new file mode 100644
index 0000000..c881269
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingInstructionCodec.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.mapping.instructions.MappingInstruction;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Mapping instruction codec.
+ */
+public final class MappingInstructionCodec extends JsonCodec<MappingInstruction> {
+
+    protected static final Logger log = LoggerFactory.getLogger(MappingInstruction.class);
+
+    protected static final String TYPE = "type";
+    protected static final String SUBTYPE = "subtype";
+    protected static final String UNICAST_WEIGHT = "unicastWeight";
+    protected static final String UNICAST_PRIORITY = "unicastPriority";
+    protected static final String MULTICAST_WEIGHT = "multicastWeight";
+    protected static final String MULTICAST_PRIORITY = "multicastPriority";
+
+    protected static final String MISSING_MEMBER_MESSAGE =
+                                        " member is required in Instruction";
+    protected static final String ERROR_MESSAGE =
+                                        " not specified in Instruction";
+
+    @Override
+    public ObjectNode encode(MappingInstruction instruction, CodecContext context) {
+        checkNotNull(instruction, "Mapping instruction cannot be null");
+
+        return new EncodeMappingInstructionCodecHelper(instruction, context).encode();
+    }
+
+    @Override
+    public MappingInstruction decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        return new DecodeMappingInstructionCodecHelper(json, context).decode();
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingKeyCodec.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingKeyCodec.java
new file mode 100644
index 0000000..1b24545
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingKeyCodec.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.mapping.DefaultMappingKey;
+import org.onosproject.mapping.MappingKey;
+import org.onosproject.mapping.addresses.MappingAddress;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Mapping key codec.
+ */
+public final class MappingKeyCodec extends JsonCodec<MappingKey> {
+
+    protected static final String ADDRESS = "address";
+
+    @Override
+    public ObjectNode encode(MappingKey key, CodecContext context) {
+        checkNotNull(key, "Mapping key cannot be null");
+
+        final ObjectNode result = context.mapper().createObjectNode();
+        final JsonCodec<MappingAddress> addressCodec =
+                context.codec(MappingAddress.class);
+
+        result.set(ADDRESS, addressCodec.encode(key.address(), context));
+
+        return result;
+    }
+
+    @Override
+    public MappingKey decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        MappingKey.Builder builder = DefaultMappingKey.builder();
+
+        ObjectNode addressJson = get(json, ADDRESS);
+        if (addressJson != null) {
+            final JsonCodec<MappingAddress> addressCodec =
+                    context.codec(MappingAddress.class);
+            builder.withAddress(addressCodec.decode(addressJson, context));
+        }
+
+        return builder.build();
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingTreatmentCodec.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingTreatmentCodec.java
new file mode 100644
index 0000000..6fd37ff
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingTreatmentCodec.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+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.mapping.DefaultMappingTreatment;
+import org.onosproject.mapping.MappingTreatment;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.instructions.MappingInstruction;
+
+import java.util.stream.IntStream;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Mapping treatment codec.
+ */
+public final class MappingTreatmentCodec extends JsonCodec<MappingTreatment> {
+
+    private static final String INSTRUCTIONS = "instructions";
+    private static final String ADDRESS = "address";
+
+    @Override
+    public ObjectNode encode(MappingTreatment treatment, CodecContext context) {
+        checkNotNull(treatment, "Mapping treatment cannot be null");
+
+        final ObjectNode result = context.mapper().createObjectNode();
+        final ArrayNode jsonInstructions = result.putArray(INSTRUCTIONS);
+
+        final JsonCodec<MappingInstruction> instructionCodec =
+                context.codec(MappingInstruction.class);
+
+        final JsonCodec<MappingAddress> addressCodec =
+                context.codec(MappingAddress.class);
+
+        for (final MappingInstruction instruction : treatment.instructions()) {
+            jsonInstructions.add(instructionCodec.encode(instruction, context));
+        }
+
+        result.set(ADDRESS, addressCodec.encode(treatment.address(), context));
+
+        return result;
+    }
+
+    @Override
+    public MappingTreatment decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        final JsonCodec<MappingInstruction> instructionCodec =
+                context.codec(MappingInstruction.class);
+
+        JsonNode instructionJson = json.get(INSTRUCTIONS);
+        MappingTreatment.Builder builder = DefaultMappingTreatment.builder();
+
+        if (instructionJson != null) {
+            IntStream.range(0, instructionJson.size())
+                    .forEach(i -> builder.add(
+                            instructionCodec.decode(get(instructionJson, i),
+                                    context)));
+        }
+
+        ObjectNode addressJson = get(json, ADDRESS);
+        if (addressJson != null) {
+            final JsonCodec<MappingAddress> addressCodec =
+                    context.codec(MappingAddress.class);
+            builder.withAddress(addressCodec.decode(addressJson, context));
+        }
+
+        return builder.build();
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingValueCodec.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingValueCodec.java
new file mode 100644
index 0000000..d97635b
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/MappingValueCodec.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2017-present 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.mapping.codec;
+
+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.mapping.DefaultMappingValue;
+import org.onosproject.mapping.MappingTreatment;
+import org.onosproject.mapping.MappingValue;
+import org.onosproject.mapping.actions.MappingAction;
+
+import java.util.stream.IntStream;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Mapping value codec.
+ */
+public final class MappingValueCodec extends JsonCodec<MappingValue> {
+
+    protected static final String ACTION = "action";
+    protected static final String TREATMENTS = "treatments";
+
+    @Override
+    public ObjectNode encode(MappingValue value, CodecContext context) {
+        checkNotNull(value, "Mapping value cannot be null");
+
+        final ObjectNode result = context.mapper().createObjectNode();
+        final ArrayNode jsonTreatments = result.putArray(TREATMENTS);
+
+        final JsonCodec<MappingTreatment> treatmentCodec =
+                context.codec(MappingTreatment.class);
+
+        final JsonCodec<MappingAction> actionCodec =
+                context.codec(MappingAction.class);
+
+        for (final MappingTreatment treatment : value.treatments()) {
+            jsonTreatments.add(treatmentCodec.encode(treatment, context));
+        }
+
+        result.set(ACTION, actionCodec.encode(value.action(), context));
+
+        return result;
+    }
+
+    @Override
+    public MappingValue decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        final JsonCodec<MappingTreatment> treatmentCodec =
+                context.codec(MappingTreatment.class);
+
+        JsonNode treatmentJson = json.get(TREATMENTS);
+        MappingValue.Builder builder = DefaultMappingValue.builder();
+
+        if (treatmentJson != null) {
+            IntStream.range(0, treatmentJson.size())
+                    .forEach(i -> builder.add(
+                            treatmentCodec.decode(get(treatmentJson, i),
+                                    context)));
+        }
+
+        ObjectNode actionJson = get(json, ACTION);
+        if (actionJson != null) {
+            final JsonCodec<MappingAction> actionCodec =
+                    context.codec(MappingAction.class);
+            builder.withAction(actionCodec.decode(actionJson, context));
+        }
+
+        return builder.build();
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/package-info.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/package-info.java
new file mode 100644
index 0000000..68b4778
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/codec/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present 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.
+ */
+/**
+ * Implementations of the codec broker and
+ * built-in entity JSON codecs for mapping address.
+ */
+package org.onosproject.mapping.codec;
\ No newline at end of file
