diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMappingExtensionCodecRegistrator.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMappingExtensionCodecRegistrator.java
new file mode 100644
index 0000000..adc7e8d
--- /dev/null
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMappingExtensionCodecRegistrator.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.drivers.lisp.extensions;
+
+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.drivers.lisp.extensions.codec.LispAppDataAddressCodec;
+import org.onosproject.mapping.web.MappingCodecRegistrator;
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation of the JSON codec brokering service for
+ * mapping extension primitives.
+ */
+@Component(immediate = true)
+public class LispMappingExtensionCodecRegistrator extends MappingCodecRegistrator {
+
+    private final Logger log = getLogger(getClass());
+    private MappingCodecRegistrator registrator;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    public CodecService codecService;
+
+    @Activate
+    public void activate() {
+
+        registrator = new MappingCodecRegistrator();
+        registrator.codecService = codecService;
+        registrator.activate();
+
+        codecService.registerCodec(LispAppDataAddress.class, new LispAppDataAddressCodec());
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        codecService.unregisterCodec(LispAppDataAddress.class);
+
+        registrator.deactivate();
+        registrator = null;
+
+        log.info("Stopped");
+    }
+}
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/codec/LispAppDataAddressCodec.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/codec/LispAppDataAddressCodec.java
new file mode 100644
index 0000000..9bf3b7f
--- /dev/null
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/codec/LispAppDataAddressCodec.java
@@ -0,0 +1,93 @@
+/*
+ * 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.drivers.lisp.extensions.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.drivers.lisp.extensions.LispAppDataAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * LISP application data address codec.
+ */
+public final class LispAppDataAddressCodec extends JsonCodec<LispAppDataAddress> {
+
+    protected static final String PROTOCOL = "protocol";
+    protected static final String IP_TOS = "ipTos";
+    protected static final String LOCAL_PORT_LOW = "localPortLow";
+    protected static final String LOCAL_PORT_HIGH = "localPortHigh";
+    protected static final String REMOTE_PORT_LOW = "remotePortLow";
+    protected static final String REMOTE_PORT_HIGH = "remotePortHigh";
+    protected static final String ADDRESS = "address";
+
+    @Override
+    public ObjectNode encode(LispAppDataAddress address, CodecContext context) {
+        checkNotNull(address, "LispAppDataAddress cannot be null");
+
+        final ObjectNode result = context.mapper().createObjectNode()
+                .put(PROTOCOL, address.getProtocol())
+                .put(IP_TOS, address.getIpTos())
+                .put(LOCAL_PORT_LOW, address.getLocalPortLow())
+                .put(LOCAL_PORT_HIGH, address.getLocalPortHigh())
+                .put(REMOTE_PORT_LOW, address.getRemotePortLow())
+                .put(REMOTE_PORT_HIGH, address.getRemotePortHigh());
+
+        if (address.getAddress() != null) {
+            final JsonCodec<MappingAddress> addressCodec =
+                    context.codec(MappingAddress.class);
+            ObjectNode addressNode = addressCodec.encode(address.getAddress(), context);
+            result.set(ADDRESS, addressNode);
+        }
+
+        return result;
+    }
+
+    @Override
+    public LispAppDataAddress decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        byte protocol = (byte) json.get(PROTOCOL).asInt();
+        int ipTos = json.get(IP_TOS).asInt();
+        short localPortLow = (short) json.get(LOCAL_PORT_LOW).asInt();
+        short localPortHigh = (short) json.get(LOCAL_PORT_HIGH).asInt();
+        short remotePortLow = (short) json.get(REMOTE_PORT_LOW).asInt();
+        short remotePortHigh = (short) json.get(REMOTE_PORT_HIGH).asInt();
+
+        ObjectNode addressJson = get(json, ADDRESS);
+        MappingAddress mappingAddress = null;
+
+        if (addressJson != null) {
+            final JsonCodec<MappingAddress> addressCodec =
+                    context.codec(MappingAddress.class);
+            mappingAddress = addressCodec.decode(addressJson, context);
+        }
+
+        return new LispAppDataAddress.Builder()
+                        .withProtocol(protocol)
+                        .withIpTos(ipTos)
+                        .withLocalPortLow(localPortLow)
+                        .withLocalPortHigh(localPortHigh)
+                        .withRemotePortLow(remotePortLow)
+                        .withRemotePortHigh(remotePortHigh)
+                        .withAddress(mappingAddress)
+                        .build();
+    }
+}
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/codec/LispMappingExtensionCodecContextAdapter.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/codec/LispMappingExtensionCodecContextAdapter.java
new file mode 100644
index 0000000..8563f2a
--- /dev/null
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/codec/LispMappingExtensionCodecContextAdapter.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.drivers.lisp.extensions.codec;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.CodecService;
+import org.onosproject.codec.JsonCodec;
+
+/**
+ * An adapter that provides LISP mapping extension codec context.
+ */
+public class LispMappingExtensionCodecContextAdapter implements CodecContext {
+
+    private final ObjectMapper mapper = new ObjectMapper();
+    private final CodecService manager;
+
+    /**
+     * Constructs a new mock codec context.
+     *
+     * @param manager codec manager
+     */
+    public LispMappingExtensionCodecContextAdapter(CodecService manager) {
+        this.manager = manager;
+    }
+
+    @Override
+    public ObjectMapper mapper() {
+        return mapper;
+    }
+
+    @Override
+    public <T> JsonCodec<T> codec(Class<T> entityClass) {
+        return manager.getCodec(entityClass);
+    }
+
+    @Override
+    public <T> T getService(Class<T> serviceClass) {
+        return null;
+    }
+}
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/codec/package-info.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/codec/package-info.java
new file mode 100644
index 0000000..ad1fe70
--- /dev/null
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/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.
+ */
+
+/**
+ * LISP extensions codec package.
+ */
+package org.onosproject.drivers.lisp.extensions.codec;
\ No newline at end of file
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/package-info.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/package-info.java
index 1c74220..e83dabb 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/package-info.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * Created by guni on 2017. 3. 14..
+ * LISP extensions package.
  */
 package org.onosproject.drivers.lisp.extensions;
\ No newline at end of file
