diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java
index 53fa64a..ac898d1 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java
@@ -413,7 +413,9 @@
         if (type == Objective.Operation.ADD) {
             // Save external port
             Port export = getExPort(device.id());
-            exPortOfDevice.put(device.id(), export);
+            if (export != null) {
+                exPortOfDevice.put(device.id(), export);
+            }
             switchOfLocalHostPorts.put(device.id(), new NetworkOfLocalHostPorts());
         } else if (type == Objective.Operation.REMOVE) {
             exPortOfDevice.remove(device.id());
@@ -777,7 +779,7 @@
         for (RouterInterface r : interfacesSet) {
             // Get all the host of the subnet
             Map<HostId, Host> hosts = hostsOfSubnet.get(r.subnetId());
-            if (hosts.size() > 0) {
+            if (hosts != null && hosts.size() > 0) {
                 subnetVmNum++;
                 if (subnetVmNum >= SUBNET_NUM) {
                     routerInfFlagOfTenant.put(r.tenantId(), true);
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/routerinterface/impl/RouterInterfaceManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/routerinterface/impl/RouterInterfaceManager.java
index 244a5c0..bbcc04f 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/routerinterface/impl/RouterInterfaceManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/routerinterface/impl/RouterInterfaceManager.java
@@ -134,6 +134,12 @@
     @Override
     public boolean addRouterInterface(RouterInterface routerInterface) {
         checkNotNull(routerInterface, ROUTER_INTERFACE_NULL);
+        if (!virtualPortService.exists(routerInterface.portId())) {
+            log.debug("The port ID of interface is not exist whose identifier is {}",
+                      routerInterface.portId().toString());
+            throw new IllegalArgumentException(
+                                               "port ID of interface doesn't exist");
+        }
         verifyRouterInterfaceData(routerInterface);
         routerInterfaceStore.put(routerInterface.subnetId(), routerInterface);
         if (!routerInterfaceStore.containsKey(routerInterface.subnetId())) {
@@ -188,12 +194,6 @@
             throw new IllegalArgumentException(
                                                "subnet ID of interface doesn't exist");
         }
-        if (!virtualPortService.exists(routerInterface.portId())) {
-            log.debug("The port ID of interface is not exist whose identifier is {}",
-                      routerInterface.portId().toString());
-            throw new IllegalArgumentException(
-                                               "port ID of interface doesn't exist");
-        }
         if (!routerService.exists(routerInterface.routerId())) {
             log.debug("The router ID of interface is not exist whose identifier is {}",
                       routerInterface.routerId().toString());
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/RouterWebResource.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/RouterWebResource.java
index 6f80dd1..dad611e 100644
--- a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/RouterWebResource.java
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/resources/RouterWebResource.java
@@ -104,8 +104,7 @@
                     .entity("The Router does not exists").build();
         }
         Router sub = nullIsNotFound(get(RouterService.class)
-                                            .getRouter(RouterId.valueOf(id)),
-                                    NOT_EXIST);
+                .getRouter(RouterId.valueOf(id)), NOT_EXIST);
 
         ObjectNode result = new ObjectMapper().createObjectNode();
         if (fields.size() > 0) {
@@ -127,8 +126,7 @@
             Collection<Router> routers = createOrUpdateByInputStream(subnode);
 
             Boolean result = nullIsNotFound((get(RouterService.class)
-                                                    .createRouters(routers)),
-                                            CREATE_FAIL);
+                    .createRouters(routers)), CREATE_FAIL);
             if (!result) {
                 return Response.status(CONFLICT).entity(CREATE_FAIL).build();
             }
@@ -148,7 +146,7 @@
         try {
             ObjectMapper mapper = new ObjectMapper();
             JsonNode subnode = mapper.readTree(input);
-            Collection<Router> routers = createOrUpdateByInputStream(subnode);
+            Collection<Router> routers = changeUpdateJsonToSub(subnode, id);
             Boolean result = nullIsNotFound(get(RouterService.class)
                     .updateRouters(routers), UPDATE_FAIL);
             if (!result) {
@@ -197,22 +195,22 @@
             } else if (subnode.get("subnet_id").asText().isEmpty()) {
                 throw new IllegalArgumentException("subnet_id should not be empty");
             }
-            SubnetId subnetId = SubnetId.subnetId(subnode.get("subnet_id")
-                    .asText());
+            SubnetId subnetId = SubnetId
+                    .subnetId(subnode.get("subnet_id").asText());
             if (!subnode.hasNonNull("tenant_id")) {
                 throw new IllegalArgumentException("tenant_id should not be null");
             } else if (subnode.get("tenant_id").asText().isEmpty()) {
                 throw new IllegalArgumentException("tenant_id should not be empty");
             }
-            TenantId tenentId = TenantId.tenantId(subnode.get("tenant_id")
-                    .asText());
+            TenantId tenentId = TenantId
+                    .tenantId(subnode.get("tenant_id").asText());
             if (!subnode.hasNonNull("port_id")) {
                 throw new IllegalArgumentException("port_id should not be null");
             } else if (subnode.get("port_id").asText().isEmpty()) {
                 throw new IllegalArgumentException("port_id should not be empty");
             }
-            VirtualPortId portId = VirtualPortId.portId(subnode.get("port_id")
-                    .asText());
+            VirtualPortId portId = VirtualPortId
+                    .portId(subnode.get("port_id").asText());
             RouterInterface routerInterface = RouterInterface
                     .routerInterface(subnetId, portId, routerId, tenentId);
             get(RouterInterfaceService.class)
@@ -246,22 +244,22 @@
             } else if (subnode.get("subnet_id").asText().isEmpty()) {
                 throw new IllegalArgumentException("subnet_id should not be empty");
             }
-            SubnetId subnetId = SubnetId.subnetId(subnode.get("subnet_id")
-                    .asText());
+            SubnetId subnetId = SubnetId
+                    .subnetId(subnode.get("subnet_id").asText());
             if (!subnode.hasNonNull("port_id")) {
                 throw new IllegalArgumentException("port_id should not be null");
             } else if (subnode.get("port_id").asText().isEmpty()) {
                 throw new IllegalArgumentException("port_id should not be empty");
             }
-            VirtualPortId portId = VirtualPortId.portId(subnode.get("port_id")
-                    .asText());
+            VirtualPortId portId = VirtualPortId
+                    .portId(subnode.get("port_id").asText());
             if (!subnode.hasNonNull("tenant_id")) {
                 throw new IllegalArgumentException("tenant_id should not be null");
             } else if (subnode.get("tenant_id").asText().isEmpty()) {
                 throw new IllegalArgumentException("tenant_id should not be empty");
             }
-            TenantId tenentId = TenantId.tenantId(subnode.get("tenant_id")
-                    .asText());
+            TenantId tenentId = TenantId
+                    .tenantId(subnode.get("tenant_id").asText());
             RouterInterface routerInterface = RouterInterface
                     .routerInterface(subnetId, portId, routerId, tenentId);
             get(RouterInterfaceService.class)
@@ -311,13 +309,13 @@
         } else if (routerNode.get("tenant_id").asText().isEmpty()) {
             throw new IllegalArgumentException("tenant_id should not be empty");
         }
-        TenantId tenantId = TenantId.tenantId(routerNode.get("tenant_id")
-                .asText());
+        TenantId tenantId = TenantId
+                .tenantId(routerNode.get("tenant_id").asText());
 
         VirtualPortId gwPortId = null;
         if (routerNode.hasNonNull("gw_port_id")) {
-            gwPortId = VirtualPortId.portId(routerNode.get("gw_port_id")
-                    .asText());
+            gwPortId = VirtualPortId
+                    .portId(routerNode.get("gw_port_id").asText());
         }
 
         if (!routerNode.hasNonNull("status")) {
@@ -344,7 +342,59 @@
         }
         RouterGateway gateway = null;
         if (routerNode.hasNonNull("external_gateway_info")) {
-            gateway = jsonNodeToGateway(routerNode.get("external_gateway_info"));
+            gateway = jsonNodeToGateway(routerNode
+                    .get("external_gateway_info"));
+        }
+        List<String> routes = new ArrayList<String>();
+        DefaultRouter routerObj = new DefaultRouter(id, routerName,
+                                                    adminStateUp, status,
+                                                    distributed, gateway,
+                                                    gwPortId, tenantId, routes);
+        subMap.put(id, routerObj);
+        return Collections.unmodifiableCollection(subMap.values());
+    }
+
+    /**
+     * Returns a collection of floatingIps from floatingIpNodes.
+     *
+     * @param subnode the router json node
+     * @param routerId the router identify
+     * @return routers a collection of router
+     * @throws Exception when any argument is illegal
+     */
+    public Collection<Router> changeUpdateJsonToSub(JsonNode subnode,
+                                                    String routerId)
+                                                            throws Exception {
+        checkNotNull(subnode, JSON_NOT_NULL);
+        checkNotNull(routerId, "routerId should not be null");
+        Map<RouterId, Router> subMap = new HashMap<RouterId, Router>();
+        JsonNode routerNode = subnode.get("router");
+        RouterId id = RouterId.valueOf(routerId);
+        Router sub = nullIsNotFound(get(RouterService.class).getRouter(id),
+                                    NOT_EXIST);
+        TenantId tenantId = sub.tenantId();
+
+        VirtualPortId gwPortId = null;
+        if (routerNode.hasNonNull("gw_port_id")) {
+            gwPortId = VirtualPortId
+                    .portId(routerNode.get("gw_port_id").asText());
+        }
+        Status status = sub.status();
+
+        String routerName = routerNode.get("name").asText();
+
+        checkArgument(routerNode.get("admin_state_up").isBoolean(),
+                      "admin_state_up should be boolean");
+        boolean adminStateUp = routerNode.get("admin_state_up").asBoolean();
+
+        boolean distributed = sub.distributed();
+        if (routerNode.hasNonNull("distributed")) {
+            distributed = routerNode.get("distributed").asBoolean();
+        }
+        RouterGateway gateway = sub.externalGatewayInfo();
+        if (routerNode.hasNonNull("external_gateway_info")) {
+            gateway = jsonNodeToGateway(routerNode
+                    .get("external_gateway_info"));
         }
         List<String> routes = new ArrayList<String>();
         DefaultRouter routerObj = new DefaultRouter(id, routerName,
@@ -368,8 +418,8 @@
         } else if (gateway.get("network_id").asText().isEmpty()) {
             throw new IllegalArgumentException("network_id should not be empty");
         }
-        TenantNetworkId networkId = TenantNetworkId.networkId(gateway
-                .get("network_id").asText());
+        TenantNetworkId networkId = TenantNetworkId
+                .networkId(gateway.get("network_id").asText());
 
         if (!gateway.hasNonNull("enable_snat")) {
             throw new IllegalArgumentException("enable_snat should not be null");
@@ -381,17 +431,14 @@
         boolean enableSnat = gateway.get("enable_snat").asBoolean();
 
         if (!gateway.hasNonNull("external_fixed_ips")) {
-            throw new IllegalArgumentException(
-                                          "external_fixed_ips should not be null");
+            throw new IllegalArgumentException("external_fixed_ips should not be null");
         } else if (gateway.get("external_fixed_ips").isNull()) {
-            throw new IllegalArgumentException(
-                                          "external_fixed_ips should not be empty");
+            throw new IllegalArgumentException("external_fixed_ips should not be empty");
         }
         Collection<FixedIp> fixedIpList = jsonNodeToFixedIp(gateway
                 .get("external_fixed_ips"));
-        RouterGateway gatewayObj = RouterGateway.routerGateway(networkId,
-                                                               enableSnat,
-                                                               fixedIpList);
+        RouterGateway gatewayObj = RouterGateway
+                .routerGateway(networkId, enableSnat, fixedIpList);
         return gatewayObj;
     }
 
@@ -411,15 +458,15 @@
             } else if (node.get("subnet_id").asText().isEmpty()) {
                 throw new IllegalArgumentException("subnet_id should not be empty");
             }
-            SubnetId subnetId = SubnetId.subnetId(node.get("subnet_id")
-                    .asText());
+            SubnetId subnetId = SubnetId
+                    .subnetId(node.get("subnet_id").asText());
             if (!node.hasNonNull("ip_address")) {
                 throw new IllegalArgumentException("ip_address should not be null");
             } else if (node.get("ip_address").asText().isEmpty()) {
                 throw new IllegalArgumentException("ip_address should not be empty");
             }
-            IpAddress ipAddress = IpAddress.valueOf(node.get("ip_address")
-                    .asText());
+            IpAddress ipAddress = IpAddress
+                    .valueOf(node.get("ip_address").asText());
             FixedIp fixedIpObj = FixedIp.fixedIp(subnetId, ipAddress);
 
             fixedIpMaps.putIfAbsent(i, fixedIpObj);
