diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
index e9f8e35..ef7b341 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
@@ -83,12 +83,14 @@
             result.put(UPLINK_PORT, node.uplinkPort());
         }
 
-        if (type != OpenstackNode.NodeType.CONTROLLER) {
-            result.put(INTEGRATION_BRIDGE, node.intgBridge().toString());
-        } else {
+        if (type == OpenstackNode.NodeType.CONTROLLER) {
             result.put(END_POINT, node.endPoint());
         }
 
+        if (node.intgBridge() != null) {
+            result.put(INTEGRATION_BRIDGE, node.intgBridge().toString());
+        }
+
         if (node.vlanIntf() != null) {
             result.put(VLAN_INTF_NAME, node.vlanIntf());
         }
@@ -151,11 +153,7 @@
             nodeBuilder.uplinkPort(nullIsIllegal(json.get(UPLINK_PORT).asText(),
                     UPLINK_PORT + MISSING_MESSAGE));
         }
-        if (!type.equals(CONTROLLER)) {
-            String iBridge = nullIsIllegal(json.get(INTEGRATION_BRIDGE).asText(),
-                    INTEGRATION_BRIDGE + MISSING_MESSAGE);
-            nodeBuilder.intgBridge(DeviceId.deviceId(iBridge));
-        } else {
+        if (type.equals(CONTROLLER)) {
             String endPoint = nullIsIllegal(json.get(END_POINT).asText(),
                     END_POINT + MISSING_MESSAGE);
             nodeBuilder.endPoint(endPoint);
@@ -167,6 +165,11 @@
             nodeBuilder.dataIp(IpAddress.valueOf(json.get(DATA_IP).asText()));
         }
 
+        JsonNode intBridgeJson = json.get(INTEGRATION_BRIDGE);
+        if (intBridgeJson != null) {
+            nodeBuilder.intgBridge(DeviceId.deviceId(intBridgeJson.asText()));
+        }
+
         JsonNode datapathTypeJson = json.get(DATA_PATH_TYPE);
 
         if (datapathTypeJson == null ||
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java
index f30787c..b6a4437 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java
@@ -44,12 +44,14 @@
 import org.onosproject.openstacknode.api.OpenstackNodeStore;
 import org.onosproject.openstacknode.api.OpenstackNodeStoreDelegate;
 import org.onosproject.ovsdb.controller.OvsdbController;
+import org.onosproject.store.service.AtomicCounter;
 import org.onosproject.store.service.StorageService;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 
 import java.util.Dictionary;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
@@ -61,6 +63,8 @@
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.openstacknode.api.Constants.INTEGRATION_BRIDGE;
 import static org.onosproject.openstacknode.api.NodeState.COMPLETE;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
+import static org.onosproject.openstacknode.util.OpenstackNodeUtil.genDpid;
 import static org.onosproject.openstacknode.util.OpenstackNodeUtil.isOvsdbConnected;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -81,8 +85,13 @@
     private static final String OVSDB_PORT = "ovsdbPortNum";
     private static final int DEFAULT_OVSDB_PORT = 6640;
 
+    private static final String DEVICE_ID_COUNTER_NAME = "device-id-counter";
+
     private static final String ERR_NULL_NODE = "OpenStack node cannot be null";
     private static final String ERR_NULL_HOSTNAME = "OpenStack node hostname cannot be null";
+    private static final String ERR_NULL_DEVICE_ID = "OpenStack node device ID cannot be null";
+
+    private static final String NOT_DUPLICATED_MSG = "% cannot be duplicated";
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected OpenstackNodeStore osNodeStore;
@@ -114,6 +123,8 @@
 
     private final OpenstackNodeStoreDelegate delegate = new InternalNodeStoreDelegate();
 
+    private AtomicCounter deviceIdCounter;
+
     private ApplicationId appId;
 
     @Activate
@@ -123,6 +134,8 @@
 
         leadershipService.runForLeadership(appId.name());
 
+        deviceIdCounter = storageService.getAtomicCounter(DEVICE_ID_COUNTER_NAME);
+
         log.info("Started");
     }
 
@@ -150,14 +163,49 @@
     @Override
     public void createNode(OpenstackNode osNode) {
         checkNotNull(osNode, ERR_NULL_NODE);
-        osNodeStore.createNode(osNode);
+
+        OpenstackNode updatedNode;
+
+        if (osNode.intgBridge() == null && osNode.type() != CONTROLLER) {
+            String deviceIdStr = genDpid(deviceIdCounter.incrementAndGet());
+            checkNotNull(deviceIdStr, ERR_NULL_DEVICE_ID);
+            updatedNode = osNode.updateIntbridge(DeviceId.deviceId(deviceIdStr));
+            checkArgument(!hasIntgBridge(updatedNode.intgBridge(), updatedNode.hostname()),
+                                NOT_DUPLICATED_MSG, updatedNode.intgBridge());
+        } else {
+            updatedNode = osNode;
+            checkArgument(!hasIntgBridge(updatedNode.intgBridge(), updatedNode.hostname()),
+                                NOT_DUPLICATED_MSG, updatedNode.intgBridge());
+        }
+
+        osNodeStore.createNode(updatedNode);
+
         log.info(String.format(MSG_NODE, osNode.hostname(), MSG_CREATED));
     }
 
     @Override
     public void updateNode(OpenstackNode osNode) {
         checkNotNull(osNode, ERR_NULL_NODE);
-        osNodeStore.updateNode(osNode);
+
+        OpenstackNode updatedNode;
+
+        OpenstackNode existNode = osNodeStore.node(osNode.hostname());
+        checkNotNull(existNode, ERR_NULL_NODE);
+
+        DeviceId existDeviceId = osNodeStore.node(osNode.hostname()).intgBridge();
+
+        if (osNode.intgBridge() == null && osNode.type() != CONTROLLER) {
+            updatedNode = osNode.updateIntbridge(existDeviceId);
+            checkArgument(!hasIntgBridge(updatedNode.intgBridge(), updatedNode.hostname()),
+                    NOT_DUPLICATED_MSG, updatedNode.intgBridge());
+        } else {
+            updatedNode = osNode;
+            checkArgument(!hasIntgBridge(updatedNode.intgBridge(), updatedNode.hostname()),
+                    NOT_DUPLICATED_MSG, updatedNode.intgBridge());
+        }
+
+        osNodeStore.updateNode(updatedNode);
+
         log.info(String.format(MSG_NODE, osNode.hostname(), MSG_UPDATED));
     }
 
@@ -263,6 +311,16 @@
         }
     }
 
+    private boolean hasIntgBridge(DeviceId deviceId, String hostname) {
+        Optional<OpenstackNode> existNode = osNodeStore.nodes().stream()
+                .filter(n -> n.type() != CONTROLLER)
+                .filter(n -> !n.hostname().equals(hostname))
+                .filter(n -> n.intgBridge().equals(deviceId))
+                .findFirst();
+
+        return existNode.isPresent();
+    }
+
     private class InternalNodeStoreDelegate implements OpenstackNodeStoreDelegate {
 
         @Override
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/util/OpenstackNodeUtil.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/util/OpenstackNodeUtil.java
index fac184e..e970b2b 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/util/OpenstackNodeUtil.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/util/OpenstackNodeUtil.java
@@ -58,6 +58,10 @@
     private static final String IDENTITY_PATH = "identity/";
     private static final String SSL_TYPE = "SSL";
 
+    private static final int HEX_LENGTH = 16;
+    private static final String OF_PREFIX = "of:";
+    private static final String ZERO = "0";
+
     /**
      * Prevents object installation from external.
      */
@@ -175,6 +179,27 @@
     }
 
     /**
+     * Generates a DPID (of:0000000000000001) from an index value.
+     *
+     * @param index index value
+     * @return generated DPID
+     */
+    public static String genDpid(long index) {
+        if (index < 0) {
+            return null;
+        }
+
+        String hexStr = Long.toHexString(index);
+
+        StringBuilder zeroPadding = new StringBuilder();
+        for (int i = 0; i < HEX_LENGTH - hexStr.length(); i++) {
+            zeroPadding.append(ZERO);
+        }
+
+        return OF_PREFIX + zeroPadding.toString() + hexStr;
+    }
+
+    /**
      * Builds up and a complete endpoint URL from gateway node.
      *
      * @param node gateway node
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java
index a17060e..68f0aed 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/OpenstackNodeManagerTest.java
@@ -65,6 +65,7 @@
     private static final String COMPUTE_2_HOSTNAME = "compute_2";
     private static final String COMPUTE_3_HOSTNAME = "compute_3";
     private static final String GATEWAY_1_HOSTNAME = "gateway_1";
+    private static final String COMPUTE_1_DUP_INT_HOSTNAME = "compute_1_dup_int";
 
     private static final String GATEWAY_1_UPLINKPORT = "eth0";
 
@@ -102,6 +103,20 @@
             GATEWAY_1_UPLINKPORT,
             NodeState.COMPLETE
     );
+    private static final OpenstackNode COMPUTE_1_DUP_INT = createNode(
+            COMPUTE_1_DUP_INT_HOSTNAME,
+            COMPUTE,
+            COMPUTE_1_INTG_DEVICE,
+            IpAddress.valueOf("10.100.0.1"),
+            NodeState.INIT
+    );
+    private static final OpenstackNode COMPUTE_2_DUP_INT = createNode(
+            COMPUTE_2_HOSTNAME,
+            COMPUTE,
+            COMPUTE_3_INTG_DEVICE,
+            IpAddress.valueOf("10.100.0.2"),
+            NodeState.INIT
+    );
 
     private final TestOpenstackNodeListener testListener = new TestOpenstackNodeListener();
 
@@ -174,6 +189,15 @@
     }
 
     /**
+     * Checks if creating a node with duplicated integration bridge.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testCreateNodeWithDuplicateIntgBridge() {
+        target.createNode(COMPUTE_1);
+        target.createNode(COMPUTE_1_DUP_INT);
+    }
+
+    /**
      * Checks if removing null node fails with proper exception.
      */
     @Test(expected = IllegalArgumentException.class)
@@ -195,6 +219,14 @@
     }
 
     /**
+     * Checks if updating a node with duplicated integration bridge.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testUpdateNodeWithDuplicateIntgBridge() {
+        target.updateNode(COMPUTE_2_DUP_INT);
+    }
+
+    /**
      * Checks if updating a node state to complete generates proper events.
      */
     @Test
@@ -231,7 +263,7 @@
     /**
      * Checks if updating not existing node fails with proper exception.
      */
-    @Test(expected = IllegalArgumentException.class)
+    @Test(expected = NullPointerException.class)
     public void testUpdateNotExistingNode() {
         target.updateNode(COMPUTE_1);
     }
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/util/OpenstackNodeUtilTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/util/OpenstackNodeUtilTest.java
new file mode 100644
index 0000000..29d6927
--- /dev/null
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/util/OpenstackNodeUtilTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.openstacknode.util;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.onosproject.openstacknode.util.OpenstackNodeUtil.genDpid;
+
+/**
+ * OpenstackNode util unit test.
+ */
+public final class OpenstackNodeUtilTest {
+
+    /**
+     * Tests the genDpid method.
+     */
+    @Test
+    public void testGenDpid() {
+        long one = 1;
+        long ten = 10;
+        long sixteen = 16;
+        long seventeen = 17;
+        long minus = -1;
+
+        assertEquals("of:0000000000000001", genDpid(one));
+        assertEquals("of:000000000000000a", genDpid(ten));
+        assertEquals("of:0000000000000010", genDpid(sixteen));
+        assertEquals("of:0000000000000011", genDpid(seventeen));
+        assertNull(genDpid(minus));
+    }
+}
