diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/ExternalPeerRouter.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/ExternalPeerRouter.java
index d42d337..3f09108 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/ExternalPeerRouter.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/ExternalPeerRouter.java
@@ -23,24 +23,62 @@
  * Representation of external peer router.
  */
 public interface ExternalPeerRouter {
+
     /**
-     * Returns external peer router ip address.
+     * Returns external peer router IP address.
      *
      * @return ip address.
      */
-    IpAddress externalPeerRouterIp();
+    IpAddress ipAddress();
 
     /**
-     * Returns external peer router mac address.
+     * Returns external peer router MAC address.
      *
      * @return mac address
      */
-    MacAddress externalPeerRouterMac();
+    MacAddress macAddress();
 
     /**
-     * Returns external peer router vlan id.
+     * Returns external peer router VLAN ID.
      *
      * @return vlan id
      */
-    VlanId externalPeerRouterVlanId();
+    VlanId vlanId();
+
+    /**
+     * Builder of new external peer router.
+     */
+    interface Builder {
+
+        /**
+         * Builds an immutable external peer router instance.
+         *
+         * @return external peer router
+         */
+        ExternalPeerRouter build();
+
+        /**
+         * Returns router builder with supplied IP address.
+         *
+         * @param ipAddress IP address of external peer router
+         * @return peer router builder
+         */
+        Builder ipAddress(IpAddress ipAddress);
+
+        /**
+         * Returns router builder with supplied MAC address.
+         *
+         * @param macAddress MAC address of external peer router
+         * @return peer router builder
+         */
+        Builder macAddress(MacAddress macAddress);
+
+        /**
+         * Returns router builder with supplied VLAN ID.
+         *
+         * @param vlanId VLAN ID of external peer router
+         * @return peer router builder
+         */
+        Builder vlanId(VlanId vlanId);
+    }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DeleteExternalPeerRouterCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DeleteExternalPeerRouterCommand.java
index 551a871..0ef3861 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DeleteExternalPeerRouterCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DeleteExternalPeerRouterCommand.java
@@ -42,7 +42,7 @@
         OpenstackNetworkAdminService service = AbstractShellCommand.get(OpenstackNetworkAdminService.class);
 
         if (service.externalPeerRouters().stream()
-                .noneMatch(router -> router.externalPeerRouterIp().toString().equals(ipAddress))) {
+                .noneMatch(router -> router.ipAddress().toString().equals(ipAddress))) {
             print(NO_ELEMENT);
             return;
         }
@@ -56,9 +56,9 @@
         List<ExternalPeerRouter> routers = Lists.newArrayList(service.externalPeerRouters());
 
         for (ExternalPeerRouter router: routers) {
-            print(FORMAT, router.externalPeerRouterIp(),
-                    router.externalPeerRouterMac().toString(),
-                    router.externalPeerRouterVlanId());
+            print(FORMAT, router.ipAddress(),
+                    router.macAddress().toString(),
+                    router.vlanId());
         }
 
     }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java
index ebd949c..ae30021 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java
@@ -15,6 +15,9 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
@@ -23,6 +26,8 @@
 
 import java.util.List;
 
+import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
+
 /**
  * Lists external peer router lists.
  */
@@ -35,14 +40,25 @@
     @Override
     protected void execute() {
         OpenstackNetworkService service = AbstractShellCommand.get(OpenstackNetworkService.class);
-
-        print(FORMAT, "Router IP", "Mac Address", "VLAN ID");
         List<ExternalPeerRouter> routers = Lists.newArrayList(service.externalPeerRouters());
 
-        for (ExternalPeerRouter router: routers) {
-            print(FORMAT, router.externalPeerRouterIp(),
-                    router.externalPeerRouterMac().toString(),
-                    router.externalPeerRouterVlanId());
+        if (outputJson()) {
+            print("%s", json(this, routers));
+        } else {
+            print(FORMAT, "Router IP", "Mac Address", "VLAN ID");
+            for (ExternalPeerRouter router: routers) {
+                print(FORMAT, router.ipAddress(),
+                        router.macAddress().toString(),
+                        router.vlanId());
+            }
         }
     }
+
+    private JsonNode json(AbstractShellCommand context, List<ExternalPeerRouter> routers) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.enable(INDENT_OUTPUT).createArrayNode();
+        routers.forEach(r -> result.add(context.jsonForEntity(r, ExternalPeerRouter.class)));
+
+        return result;
+    }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/IpAddressCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/IpAddressCompleter.java
index 4ae1dd4..bac877d 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/IpAddressCompleter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/IpAddressCompleter.java
@@ -38,7 +38,7 @@
         StringsCompleter delegate = new StringsCompleter();
         OpenstackNetworkService osNetService = AbstractShellCommand.get(OpenstackNetworkService.class);
         Set<IpAddress> set = osNetService.externalPeerRouters().stream()
-                .map(ExternalPeerRouter::externalPeerRouterIp)
+                .map(ExternalPeerRouter::ipAddress)
                 .collect(Collectors.toSet());
         SortedSet<String> strings = delegate.getStrings();
 
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/MacAddressCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/MacAddressCompleter.java
index 6e21de6..3b6e475 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/MacAddressCompleter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/MacAddressCompleter.java
@@ -38,7 +38,7 @@
         StringsCompleter delegate = new StringsCompleter();
         OpenstackNetworkService osNetService = AbstractShellCommand.get(OpenstackNetworkService.class);
         Set<MacAddress> set = osNetService.externalPeerRouters().stream()
-                .map(ExternalPeerRouter::externalPeerRouterMac)
+                .map(ExternalPeerRouter::macAddress)
                 .collect(Collectors.toSet());
         SortedSet<String> strings = delegate.getStrings();
 
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterCommand.java
index 5667fa8..c4090e0 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterCommand.java
@@ -62,7 +62,7 @@
             print(NO_ELEMENT);
             return;
         } else if (service.externalPeerRouters().stream()
-                .noneMatch(router -> router.externalPeerRouterIp().toString().equals(ipAddress))) {
+                .noneMatch(router -> router.ipAddress().toString().equals(ipAddress))) {
             print(NO_ELEMENT);
             return;
         }
@@ -86,9 +86,9 @@
         List<ExternalPeerRouter> routers = Lists.newArrayList(service.externalPeerRouters());
 
         for (ExternalPeerRouter router: routers) {
-            print(FORMAT, router.externalPeerRouterIp(),
-                    router.externalPeerRouterMac().toString(),
-                    router.externalPeerRouterVlanId());
+            print(FORMAT, router.ipAddress(),
+                    router.macAddress().toString(),
+                    router.vlanId());
         }
     }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterVlanCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterVlanCommand.java
index 3dc14a7..79125b2 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterVlanCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterVlanCommand.java
@@ -61,7 +61,7 @@
             print(NO_ELEMENT);
             return;
         } else if (osNetAdminService.externalPeerRouters().stream()
-                .noneMatch(router -> router.externalPeerRouterIp().toString().equals(ipAddress))) {
+                .noneMatch(router -> router.ipAddress().toString().equals(ipAddress))) {
             print(NO_ELEMENT);
             return;
         }
@@ -104,9 +104,9 @@
         List<ExternalPeerRouter> routers = Lists.newArrayList(osNetAdminService.externalPeerRouters());
 
         for (ExternalPeerRouter r: routers) {
-            print(FORMAT, r.externalPeerRouterIp(),
-                    r.externalPeerRouterMac().toString(),
-                    r.externalPeerRouterVlanId());
+            print(FORMAT, r.ipAddress(),
+                    r.macAddress().toString(),
+                    r.vlanId());
         }
     }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/VlanIdCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/VlanIdCompleter.java
index 0768859..8f64642 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/VlanIdCompleter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/VlanIdCompleter.java
@@ -38,7 +38,7 @@
         StringsCompleter delegate = new StringsCompleter();
         OpenstackNetworkService osNetService = AbstractShellCommand.get(OpenstackNetworkService.class);
         Set<VlanId> set = osNetService.externalPeerRouters().stream()
-                .map(ExternalPeerRouter::externalPeerRouterVlanId)
+                .map(ExternalPeerRouter::vlanId)
                 .collect(Collectors.toSet());
         SortedSet<String> strings = delegate.getStrings();
 
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/codec/ExternalPeerRouterCodec.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/codec/ExternalPeerRouterCodec.java
new file mode 100644
index 0000000..e77c0ef
--- /dev/null
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/codec/ExternalPeerRouterCodec.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.openstacknetworking.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
+import org.onosproject.openstacknetworking.impl.DefaultExternalPeerRouter;
+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;
+
+/**
+ * Openstack external peer router codec used for serializing and de-serializing JSON string.
+ */
+public class ExternalPeerRouterCodec extends JsonCodec<ExternalPeerRouter> {
+
+    private final Logger log = getLogger(getClass());
+
+    private static final String IP_ADDRESS = "ipAddress";
+    private static final String MAC_ADDRESS = "macAddress";
+    private static final String VLAN_ID = "vlanId";
+
+    private static final String MISSING_MESSAGE = " is required in ExternalPeerRouter";
+
+    @Override
+    public ObjectNode encode(ExternalPeerRouter router, CodecContext context) {
+        checkNotNull(router, "External peer router cannot be null");
+
+        return context.mapper().createObjectNode()
+                .put(IP_ADDRESS, router.ipAddress().toString())
+                .put(MAC_ADDRESS, router.macAddress().toString())
+                .put(VLAN_ID, router.vlanId().toString());
+    }
+
+    @Override
+    public ExternalPeerRouter decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        String ipAddress = nullIsIllegal(json.get(IP_ADDRESS).asText(),
+                IP_ADDRESS + MISSING_MESSAGE);
+        String macAddress = nullIsIllegal(json.get(MAC_ADDRESS).asText(),
+                MAC_ADDRESS + MISSING_MESSAGE);
+        String vlanId = nullIsIllegal(json.get(VLAN_ID).asText(),
+                VLAN_ID + MISSING_MESSAGE);
+
+        return DefaultExternalPeerRouter.builder()
+                .ipAddress(IpAddress.valueOf(ipAddress))
+                .macAddress(MacAddress.valueOf(macAddress))
+                .vlanId(VlanId.vlanId(vlanId)).build();
+    }
+}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouter.java
index 57b997c..0f44cb8 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouter.java
@@ -23,34 +23,41 @@
 
 import java.util.Objects;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 /**
  * Implementation of external peer router.
  */
 public final class DefaultExternalPeerRouter implements ExternalPeerRouter {
 
-    private final IpAddress externalPeerRouterIp;
-    private final MacAddress externalPeerRouterMac;
-    private final VlanId externalPeerRouterVlanId;
+    private final IpAddress ipAddress;
+    private final MacAddress macAddress;
+    private final VlanId vlanId;
 
-    public DefaultExternalPeerRouter(IpAddress externalPeerRouterIp,
-                                     MacAddress externalPeerRouterMac,
-                                     VlanId externalPeerRouterVlanId) {
-        this.externalPeerRouterIp = externalPeerRouterIp;
-        this.externalPeerRouterMac = externalPeerRouterMac;
-        this.externalPeerRouterVlanId = externalPeerRouterVlanId;
+    private static final String NOT_NULL_MSG = "External Peer Router % cannot be null";
+
+    // private constructor not intended for invoked from external
+    private DefaultExternalPeerRouter(IpAddress ipAddress,
+                                     MacAddress macAddress,
+                                     VlanId vlanId) {
+        this.ipAddress = ipAddress;
+        this.macAddress = macAddress;
+        this.vlanId = vlanId;
     }
 
     @Override
-    public IpAddress externalPeerRouterIp() {
-        return this.externalPeerRouterIp;
+    public IpAddress ipAddress() {
+        return this.ipAddress;
     }
+
     @Override
-    public MacAddress externalPeerRouterMac() {
-        return this.externalPeerRouterMac;
+    public MacAddress macAddress() {
+        return this.macAddress;
     }
+
     @Override
-    public VlanId externalPeerRouterVlanId() {
-        return this.externalPeerRouterVlanId;
+    public VlanId vlanId() {
+        return this.vlanId;
     }
 
     @Override
@@ -61,26 +68,75 @@
 
         if (obj instanceof DefaultExternalPeerRouter) {
             DefaultExternalPeerRouter that = (DefaultExternalPeerRouter) obj;
-            return Objects.equals(externalPeerRouterIp, that.externalPeerRouterIp) &&
-                    Objects.equals(externalPeerRouterMac, that.externalPeerRouterMac) &&
-                    Objects.equals(externalPeerRouterVlanId, that.externalPeerRouterVlanId);
+            return Objects.equals(ipAddress, that.ipAddress) &&
+                    Objects.equals(macAddress, that.macAddress) &&
+                    Objects.equals(vlanId, that.vlanId);
         }
         return false;
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(externalPeerRouterIp,
-                externalPeerRouterMac,
-                externalPeerRouterVlanId);
+        return Objects.hash(ipAddress, macAddress, vlanId);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
-                .add("externalPeerRouterIp", externalPeerRouterIp)
-                .add("externalPeerRouterMac", externalPeerRouterMac)
-                .add("externalPeerRouterVlanId", externalPeerRouterVlanId)
+                .add("ipAddress", ipAddress)
+                .add("macAddress", macAddress)
+                .add("vlanId", vlanId)
                 .toString();
     }
+
+    /**
+     * Obtains an external peer router builder.
+     *
+     * @return external peer router builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * A builder class for external peer router.
+     */
+    public static final class Builder implements ExternalPeerRouter.Builder {
+
+        private IpAddress ipAddress;
+        private MacAddress macAddress;
+        private VlanId vlanId;
+
+        // private constructor not intended to use from external
+        private Builder() {
+        }
+
+        @Override
+        public ExternalPeerRouter build() {
+
+            checkArgument(ipAddress != null, NOT_NULL_MSG, "IP address");
+            checkArgument(macAddress != null, NOT_NULL_MSG, "MAC address");
+            checkArgument(vlanId != null, NOT_NULL_MSG, "VLAN ID");
+
+            return new DefaultExternalPeerRouter(ipAddress, macAddress, vlanId);
+        }
+
+        @Override
+        public Builder ipAddress(IpAddress ipAddress) {
+            this.ipAddress = ipAddress;
+            return this;
+        }
+
+        @Override
+        public Builder macAddress(MacAddress macAddress) {
+            this.macAddress = macAddress;
+            return this;
+        }
+
+        @Override
+        public Builder vlanId(VlanId vlanId) {
+            this.vlanId = vlanId;
+            return this;
+        }
+    }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
index bceb9ea..3ca0232 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
@@ -442,7 +442,7 @@
 
         if (externalPeerRouterMap.containsKey(targetIp.toString()) &&
                 !externalPeerRouterMap.get(
-                        targetIp.toString()).value().externalPeerRouterMac().equals(MacAddress.NONE)) {
+                        targetIp.toString()).value().macAddress().equals(MacAddress.NONE)) {
             return;
         }
 
@@ -479,8 +479,12 @@
                 treatment,
                 ByteBuffer.wrap(ethRequest.serialize())));
 
-        externalPeerRouterMap.put(
-                targetIp.toString(), new DefaultExternalPeerRouter(targetIp, MacAddress.NONE, vlanId));
+        externalPeerRouterMap.put(targetIp.toString(),
+                                    DefaultExternalPeerRouter.builder()
+                                                    .ipAddress(targetIp)
+                                                    .macAddress(MacAddress.NONE)
+                                                    .vlanId(vlanId)
+                                                    .build());
 
         log.info("Initializes external peer router map with peer router IP {}", targetIp.toString());
     }
@@ -517,7 +521,11 @@
     public void updateExternalPeerRouterMac(IpAddress ipAddress, MacAddress macAddress) {
         try {
             externalPeerRouterMap.computeIfPresent(ipAddress.toString(), (id, existing) ->
-                new DefaultExternalPeerRouter(ipAddress, macAddress, existing.externalPeerRouterVlanId()));
+                    DefaultExternalPeerRouter.builder()
+                            .ipAddress(ipAddress)
+                            .macAddress(macAddress)
+                            .vlanId(existing.vlanId())
+                            .build());
 
             log.info("Updated external peer router map {}",
                     externalPeerRouterMap.get(ipAddress.toString()).value().toString());
@@ -531,7 +539,12 @@
     public void updateExternalPeerRouter(IpAddress ipAddress, MacAddress macAddress, VlanId vlanId) {
         try {
             externalPeerRouterMap.computeIfPresent(ipAddress.toString(), (id, existing) ->
-                new DefaultExternalPeerRouter(ipAddress, macAddress, vlanId));
+                    DefaultExternalPeerRouter.builder()
+                            .ipAddress(ipAddress)
+                            .macAddress(macAddress)
+                            .vlanId(vlanId)
+                            .build());
+
         } catch (Exception e) {
             log.error("Exception occurred because of {}", e.toString());
         }
@@ -545,7 +558,7 @@
             return null;
         }
         if (externalPeerRouterMap.containsKey(ipAddress.toString())) {
-            return externalPeerRouterMap.get(ipAddress.toString()).value().externalPeerRouterMac();
+            return externalPeerRouterMap.get(ipAddress.toString()).value().macAddress();
         } else {
             throw new NoSuchElementException();
         }
@@ -556,7 +569,10 @@
 
         try {
             externalPeerRouterMap.computeIfPresent(ipAddress.toString(), (id, existing) ->
-                    new DefaultExternalPeerRouter(ipAddress, existing.externalPeerRouterMac(), vlanId));
+                    DefaultExternalPeerRouter.builder()
+                            .ipAddress(ipAddress)
+                            .macAddress(existing.macAddress())
+                            .vlanId(vlanId).build());
 
         } catch (Exception e) {
             log.error("Exception occurred because of {}", e.toString());
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
index f1440c1..dc83d98 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
@@ -267,7 +267,7 @@
             try {
 
                 Set<String> extRouterIps = osNetworkService.externalPeerRouters().
-                        stream().map(r -> r.externalPeerRouterIp().toString()).collect(Collectors.toSet());
+                        stream().map(r -> r.ipAddress().toString()).collect(Collectors.toSet());
 
                 // if SPA is NOT contained in existing external router IP set, we ignore it
                 if (!extRouterIps.contains(spa.toString())) {
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
index 2c20f6a..578e7e4 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
@@ -479,8 +479,8 @@
                 .setEthDst(instPort.macAddress())
                 .setIpDst(instPort.ipAddress().getIp4Address());
 
-        if (!externalPeerRouter.externalPeerRouterVlanId().equals(VlanId.NONE)) {
-            externalSelectorBuilder.matchVlanId(externalPeerRouter.externalPeerRouterVlanId()).build();
+        if (!externalPeerRouter.vlanId().equals(VlanId.NONE)) {
+            externalSelectorBuilder.matchVlanId(externalPeerRouter.vlanId()).build();
             externalTreatmentBuilder.popVlan();
         }
 
@@ -542,14 +542,14 @@
             TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
                     .setIpSrc(floating.getIp4Address())
                     .setEthSrc(instPort.macAddress())
-                    .setEthDst(externalPeerRouter.externalPeerRouterMac());
+                    .setEthDst(externalPeerRouter.macAddress());
 
             if (osNet.getNetworkType().equals(NetworkType.VLAN)) {
                 tBuilder.popVlan();
             }
 
-            if (!externalPeerRouter.externalPeerRouterVlanId().equals(VlanId.NONE)) {
-                tBuilder.pushVlan().setVlanId(externalPeerRouter.externalPeerRouterVlanId());
+            if (!externalPeerRouter.vlanId().equals(VlanId.NONE)) {
+                tBuilder.pushVlan().setVlanId(externalPeerRouter.vlanId());
             }
             osFlowRuleService.setRule(
                     appId,
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
index 03f65aa..e5ecd1c 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
@@ -215,7 +215,7 @@
         });
 
         ExternalPeerRouter externalPeerRouter = osNetworkAdminService.externalPeerRouter(exGateway);
-        VlanId vlanId = externalPeerRouter == null ? VlanId.NONE : externalPeerRouter.externalPeerRouterVlanId();
+        VlanId vlanId = externalPeerRouter == null ? VlanId.NONE : externalPeerRouter.vlanId();
 
         if (exGateway == null) {
             deleteUnassociatedExternalPeerRouter();
@@ -240,12 +240,12 @@
 
             osNetworkAdminService.externalPeerRouters().stream()
                     .filter(externalPeerRouter ->
-                            !routerIps.contains(externalPeerRouter.externalPeerRouterIp().toString()))
+                            !routerIps.contains(externalPeerRouter.ipAddress().toString()))
                     .forEach(externalPeerRouter -> {
                         osNetworkAdminService
-                                .deleteExternalPeerRouter(externalPeerRouter.externalPeerRouterIp().toString());
+                                .deleteExternalPeerRouter(externalPeerRouter.ipAddress().toString());
                         log.trace("Deleted unassociated external peer router {}",
-                                externalPeerRouter.externalPeerRouterIp().toString());
+                                externalPeerRouter.ipAddress().toString());
                     });
         } catch (Exception e) {
             log.error("Exception occurred because of {}", e.toString());
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
index e5289a2..ee90e0d 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
@@ -366,10 +366,10 @@
         Ethernet icmpRequestEth = new Ethernet();
         icmpRequestEth.setEtherType(Ethernet.TYPE_IPV4)
                 .setSourceMACAddress(DEFAULT_GATEWAY_MAC)
-                .setDestinationMACAddress(externalPeerRouter.externalPeerRouterMac());
+                .setDestinationMACAddress(externalPeerRouter.macAddress());
 
-        if (!externalPeerRouter.externalPeerRouterVlanId().equals(VlanId.NONE)) {
-            icmpRequestEth.setVlanID(externalPeerRouter.externalPeerRouterVlanId().toShort());
+        if (!externalPeerRouter.vlanId().equals(VlanId.NONE)) {
+            icmpRequestEth.setVlanID(externalPeerRouter.vlanId().toShort());
         }
 
         icmpRequestEth.setPayload(ipPacket);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
index 4657c18..17f4c55 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
@@ -326,8 +326,8 @@
                 .setEthDst(packetIn.parsed().getSourceMAC())
                 .setIpDst(internalIp);
 
-        if (!externalPeerRouter.externalPeerRouterVlanId().equals(VlanId.NONE)) {
-            sBuilder.matchVlanId(externalPeerRouter.externalPeerRouterVlanId());
+        if (!externalPeerRouter.vlanId().equals(VlanId.NONE)) {
+            sBuilder.matchVlanId(externalPeerRouter.vlanId());
             tBuilder.popVlan();
         }
 
@@ -429,22 +429,22 @@
                 sBuilder.matchTcpSrc(TpPort.tpPort(tcpPacket.getSourcePort()))
                         .matchTcpDst(TpPort.tpPort(tcpPacket.getDestinationPort()));
                 tBuilder.setTcpSrc(patPort)
-                        .setEthDst(externalPeerRouter.externalPeerRouterMac());
+                        .setEthDst(externalPeerRouter.macAddress());
                 break;
             case IPv4.PROTOCOL_UDP:
                 UDP udpPacket = (UDP) iPacket.getPayload();
                 sBuilder.matchUdpSrc(TpPort.tpPort(udpPacket.getSourcePort()))
                         .matchUdpDst(TpPort.tpPort(udpPacket.getDestinationPort()));
                 tBuilder.setUdpSrc(patPort)
-                        .setEthDst(externalPeerRouter.externalPeerRouterMac());
+                        .setEthDst(externalPeerRouter.macAddress());
                 break;
             default:
                 log.debug("Unsupported IPv4 protocol {}");
                 break;
         }
 
-        if (!externalPeerRouter.externalPeerRouterVlanId().equals(VlanId.NONE)) {
-            tBuilder.pushVlan().setVlanId(externalPeerRouter.externalPeerRouterVlanId());
+        if (!externalPeerRouter.vlanId().equals(VlanId.NONE)) {
+            tBuilder.pushVlan().setVlanId(externalPeerRouter.vlanId());
         }
 
         tBuilder.setIpSrc(externalIp);
@@ -491,11 +491,11 @@
         iPacket.resetChecksum();
         iPacket.setParent(ethPacketIn);
         ethPacketIn.setSourceMACAddress(DEFAULT_GATEWAY_MAC);
-        ethPacketIn.setDestinationMACAddress(externalPeerRouter.externalPeerRouterMac());
+        ethPacketIn.setDestinationMACAddress(externalPeerRouter.macAddress());
         ethPacketIn.setPayload(iPacket);
 
-        if (!externalPeerRouter.externalPeerRouterVlanId().equals(VlanId.NONE)) {
-            ethPacketIn.setVlanID(externalPeerRouter.externalPeerRouterVlanId().toShort());
+        if (!externalPeerRouter.vlanId().equals(VlanId.NONE)) {
+            ethPacketIn.setVlanID(externalPeerRouter.vlanId().toShort());
         }
 
         ethPacketIn.resetChecksum();
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/codec/ExternalPeerRouterCodecTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/codec/ExternalPeerRouterCodecTest.java
new file mode 100644
index 0000000..b416411
--- /dev/null
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/codec/ExternalPeerRouterCodecTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.openstacknetworking.codec;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.hamcrest.MatcherAssert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.codec.impl.CodecManager;
+import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
+import org.onosproject.openstacknetworking.api.InstancePort;
+import org.onosproject.openstacknetworking.impl.DefaultExternalPeerRouter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onosproject.openstacknetworking.codec.ExternalPeerRouterJsonMatcher.matchesExternalPeerRouter;
+
+/**
+ * Unit tests for ExternalPeerRouter codec.
+ */
+public class ExternalPeerRouterCodecTest {
+
+    MockCodecContext context;
+    JsonCodec<ExternalPeerRouter> externalPeerRouterCodec;
+
+    @Before
+    public void setUp() {
+        context = new MockCodecContext();
+        externalPeerRouterCodec = new ExternalPeerRouterCodec();
+
+        assertThat(externalPeerRouterCodec, notNullValue());
+    }
+
+    /**
+     * Tests the external peer router encoding.
+     */
+    @Test
+    public void testExternalPeerRouterEncode() {
+        ExternalPeerRouter router = DefaultExternalPeerRouter.builder()
+                .ipAddress(IpAddress.valueOf("10.10.10.1"))
+                .macAddress(MacAddress.valueOf("11:22:33:44:55:66"))
+                .vlanId(VlanId.vlanId("1"))
+                .build();
+
+        ObjectNode routerJson = externalPeerRouterCodec.encode(router, context);
+        assertThat(routerJson, matchesExternalPeerRouter(router));
+    }
+
+    /**
+     * Tests the external peer router decoding.
+     * @throws IOException
+     */
+    @Test
+    public void testExternalPeerRouterDecode() throws IOException {
+        ExternalPeerRouter router = getPeerRouter("ExternalPeerRouter.json");
+
+        assertThat(router.ipAddress(), is(IpAddress.valueOf("10.10.10.1")));
+        assertThat(router.macAddress(), is(MacAddress.valueOf("11:22:33:44:55:66")));
+        assertThat(router.vlanId(), is(VlanId.vlanId("1")));
+    }
+
+    /**
+     * Reads in an external peer router from the given resource and decodes it.
+     *
+     * @param resourceName resource to use to read the JSON for the rule
+     * @return decoded external peer router
+     * @throws IOException if processing the resource fails
+     */
+    private ExternalPeerRouter getPeerRouter(String resourceName) throws IOException {
+        InputStream jsonStream = InstancePortCodecTest.class.getResourceAsStream(resourceName);
+        JsonNode json = context.mapper().readTree(jsonStream);
+        MatcherAssert.assertThat(json, notNullValue());
+        ExternalPeerRouter router = externalPeerRouterCodec.decode((ObjectNode) json, context);
+        assertThat(router, notNullValue());
+        return router;
+    }
+
+    /**
+     * Mock codec context for use in codec unit tests.
+     */
+    private class MockCodecContext implements CodecContext {
+        private final ObjectMapper mapper = new ObjectMapper();
+        private final CodecManager manager = new CodecManager();
+        private final Map<Class<?>, Object> services = new HashMap<>();
+
+        /**
+         * Constructs a new mock codec context.
+         */
+        public MockCodecContext() {
+            manager.activate();
+        }
+
+        @Override
+        public ObjectMapper mapper() {
+            return mapper;
+        }
+
+        @Override
+        @SuppressWarnings("unchecked")
+        public <T> JsonCodec<T> codec(Class<T> entityClass) {
+            if (entityClass == InstancePort.class) {
+                return (JsonCodec<T>) externalPeerRouterCodec;
+            }
+            return manager.getCodec(entityClass);
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public <T> T getService(Class<T> serviceClass) {
+            return (T) services.get(serviceClass);
+        }
+
+        // for registering mock services
+        public <T> void registerService(Class<T> serviceClass, T impl) {
+            services.put(serviceClass, impl);
+        }
+    }
+}
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/codec/ExternalPeerRouterJsonMatcher.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/codec/ExternalPeerRouterJsonMatcher.java
new file mode 100644
index 0000000..3044335
--- /dev/null
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/codec/ExternalPeerRouterJsonMatcher.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.openstacknetworking.codec;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
+
+/**
+ * Hamcrest matcher for external peer router.
+ */
+public final class ExternalPeerRouterJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
+
+    private static final String MAC_ADDRESS = "macAddress";
+    private static final String IP_ADDRESS = "ipAddress";
+    private static final String VLAN_ID = "vlanId";
+
+    private final ExternalPeerRouter router;
+
+    private ExternalPeerRouterJsonMatcher(ExternalPeerRouter router) {
+        this.router = router;
+    }
+
+    @Override
+    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
+
+        // check MAC address
+        String jsonMacAddress = jsonNode.get(MAC_ADDRESS).asText();
+        String macAddress = router.macAddress().toString();
+        if (!jsonMacAddress.equals(macAddress)) {
+            description.appendText("macAddress was " + jsonMacAddress);
+            return false;
+        }
+
+        // check IP address
+        String jsonIpAddress = jsonNode.get(IP_ADDRESS).asText();
+        String ipAddress = router.ipAddress().toString();
+        if (!jsonIpAddress.equals(ipAddress)) {
+            description.appendText("ipAddress was " + jsonIpAddress);
+            return false;
+        }
+
+        // check VLAN ID
+        String jsonVlanId = jsonNode.get(VLAN_ID).asText();
+        String vlanId = router.vlanId().toString();
+        if (!jsonVlanId.equals(vlanId)) {
+            description.appendText("VLAN ID was " + jsonIpAddress);
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public void describeTo(Description description) {
+        description.appendText(router.toString());
+    }
+
+    /**
+     * Factory to allocate an external peer router matcher.
+     *
+     * @param router openstack external peer router we are looking for
+     * @return matcher
+     */
+    public static ExternalPeerRouterJsonMatcher
+                        matchesExternalPeerRouter(ExternalPeerRouter router) {
+        return new ExternalPeerRouterJsonMatcher(router);
+    }
+}
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouterTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouterTest.java
index c3aeab1..cec2ee8 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouterTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultExternalPeerRouterTest.java
@@ -56,9 +56,29 @@
      */
     @Before
     public void setUp() {
-        router1 = new DefaultExternalPeerRouter(ROUTER_IP_1, ROUTER_MAC_1, VLAN_ID_1);
-        sameAsRouter1 = new DefaultExternalPeerRouter(ROUTER_IP_1, ROUTER_MAC_1, VLAN_ID_1);
-        router2 = new DefaultExternalPeerRouter(ROUTER_IP_2, ROUTER_MAC_2, VLAN_ID_2);
+        ExternalPeerRouter.Builder builder1 = DefaultExternalPeerRouter.builder();
+
+        router1 = builder1
+                    .ipAddress(ROUTER_IP_1)
+                    .macAddress(ROUTER_MAC_1)
+                    .vlanId(VLAN_ID_1)
+                    .build();
+
+        ExternalPeerRouter.Builder builder2 = DefaultExternalPeerRouter.builder();
+
+        sameAsRouter1 = builder2
+                    .ipAddress(ROUTER_IP_1)
+                    .macAddress(ROUTER_MAC_1)
+                    .vlanId(VLAN_ID_1)
+                    .build();
+
+        ExternalPeerRouter.Builder builder3 = DefaultExternalPeerRouter.builder();
+
+        router2 = builder3
+                    .ipAddress(ROUTER_IP_2)
+                    .macAddress(ROUTER_MAC_2)
+                    .vlanId(VLAN_ID_2)
+                    .build();
     }
 
     /**
@@ -78,8 +98,8 @@
     public void testConstruction() {
         ExternalPeerRouter router = router1;
 
-        assertThat(router.externalPeerRouterIp(), is(router1.externalPeerRouterIp()));
-        assertThat(router.externalPeerRouterMac(), is(router1.externalPeerRouterMac()));
-        assertThat(router.externalPeerRouterVlanId(), is(router1.externalPeerRouterVlanId()));
+        assertThat(router.ipAddress(), is(router1.ipAddress()));
+        assertThat(router.macAddress(), is(router1.macAddress()));
+        assertThat(router.vlanId(), is(router1.vlanId()));
     }
 }
diff --git a/apps/openstacknetworking/app/src/test/resources/org/onosproject/openstacknetworking/codec/ExternalPeerRouter.json b/apps/openstacknetworking/app/src/test/resources/org/onosproject/openstacknetworking/codec/ExternalPeerRouter.json
new file mode 100644
index 0000000..ddc37a5
--- /dev/null
+++ b/apps/openstacknetworking/app/src/test/resources/org/onosproject/openstacknetworking/codec/ExternalPeerRouter.json
@@ -0,0 +1,5 @@
+{
+  "ipAddress": "10.10.10.1",
+  "macAddress": "11:22:33:44:55:66",
+  "vlanId": "1"
+}
\ No newline at end of file
