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");
+    }
+}
