diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
index 77beeee..bba2c17 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
@@ -16,10 +16,22 @@
 
 package org.onosproject.drivers.lisp.extensions;
 
+import com.google.common.collect.Maps;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.mapping.addresses.ASMappingAddress;
+import org.onosproject.mapping.addresses.DNMappingAddress;
+import org.onosproject.mapping.addresses.EthMappingAddress;
 import org.onosproject.mapping.addresses.ExtensionMappingAddress;
 import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
+import org.onosproject.mapping.addresses.IPMappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
 import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.store.serializers.KryoNamespaces;
 
+import java.util.Map;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
                                 .ExtensionMappingAddressTypes.LIST_ADDRESS;
 
@@ -31,6 +43,58 @@
  */
 public class LispListAddress extends AbstractExtension
                                             implements ExtensionMappingAddress {
+
+    private static final String IPV4 = "ipv4";
+    private static final String IPV6 = "ipv6";
+
+    private MappingAddress ipv4;
+    private MappingAddress ipv6;
+
+    private final KryoNamespace appKryo = new KryoNamespace.Builder()
+                                                .register(KryoNamespaces.API)
+                                                .register(MappingAddress.class)
+                                                .register(MappingAddress.Type.class)
+                                                .register(IPMappingAddress.class)
+                                                .register(ASMappingAddress.class)
+                                                .register(DNMappingAddress.class)
+                                                .register(EthMappingAddress.class)
+                                                .build();
+
+    /**
+     * Default constructor.
+     */
+    public LispListAddress() {
+    }
+
+    /**
+     * Creates an instance with initialized parameters.
+     *
+     * @param ipv4 IPv4 address
+     * @param ipv6 IPv6 address
+     */
+    private LispListAddress(MappingAddress ipv4, MappingAddress ipv6) {
+        this.ipv4 = ipv4;
+        this.ipv6 = ipv6;
+    }
+
+    /**
+     * Obtains IPv4 address.
+     *
+     * @return IPv4 address
+     */
+    public MappingAddress getIpv4() {
+        return ipv4;
+    }
+
+    /**
+     * Obtains IPv6 address.
+     *
+     * @return IPv6 address
+     */
+    public MappingAddress getIpv6() {
+        return ipv6;
+    }
+
     @Override
     public ExtensionMappingAddressType type() {
         return LIST_ADDRESS.type();
@@ -38,11 +102,86 @@
 
     @Override
     public byte[] serialize() {
-        return new byte[0];
+
+        Map<String, Object> parameterMap = Maps.newHashMap();
+
+        parameterMap.put(IPV4, ipv4);
+        parameterMap.put(IPV6, ipv6);
+
+        return appKryo.serialize(parameterMap);
     }
 
     @Override
     public void deserialize(byte[] data) {
 
+        Map<String, Object> parameterMap = appKryo.deserialize(data);
+
+        this.ipv4 = (MappingAddress) parameterMap.get(IPV4);
+        this.ipv6 = (MappingAddress) parameterMap.get(IPV6);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ipv4, ipv6);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof LispListAddress) {
+            LispListAddress that = (LispListAddress) obj;
+            return Objects.equals(ipv4, that.ipv4) &&
+                    Objects.equals(ipv6, that.ipv6);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(type().toString())
+                .add("ipv4", ipv4)
+                .add("ipv6", ipv6)
+                .toString();
+    }
+
+    /**
+     * A builder for building LispListAddress.
+     */
+    public static final class Builder {
+        private MappingAddress ipv4;
+        private MappingAddress ipv6;
+
+        /**
+         * Sets IPv4 address.
+         *
+         * @param ipv4 IPv4 address
+         * @return Builder object
+         */
+        public Builder withIpv4(MappingAddress ipv4) {
+            this.ipv4 = ipv4;
+            return this;
+        }
+
+        /**
+         * Sets IPv6 address.
+         *
+         * @param ipv6 IPv6 address
+         * @return Builder object
+         */
+        public Builder withIpv6(MappingAddress ipv6) {
+            this.ipv6 = ipv6;
+            return this;
+        }
+
+        /**
+         * Builds LispListAddress instance.
+         *
+         * @return LispListAddress instance
+         */
+        public LispListAddress build() {
+            return new LispListAddress(ipv4, ipv6);
+        }
     }
 }
