diff --git a/src/main/java/net/onrc/onos/core/topology/Device.java b/src/main/java/net/onrc/onos/core/topology/Device.java
index 48035b3..8da4e36 100644
--- a/src/main/java/net/onrc/onos/core/topology/Device.java
+++ b/src/main/java/net/onrc/onos/core/topology/Device.java
@@ -1,8 +1,5 @@
 package net.onrc.onos.core.topology;
 
-import java.net.InetAddress;
-import java.util.Collection;
-
 import net.floodlightcontroller.util.MACAddress;
 
 /**
@@ -22,13 +19,6 @@
     public MACAddress getMacAddress();
 
     /**
-     * Get the device IP addresses.
-     *
-     * @return the device IP addresses.
-     */
-    public Collection<InetAddress> getIpAddress();
-
-    /**
      * Get the device attachment points.
      * <p/>
      * Add requirement for Iteration order? Latest observed port first.
diff --git a/src/main/java/net/onrc/onos/core/topology/DeviceEvent.java b/src/main/java/net/onrc/onos/core/topology/DeviceEvent.java
index 48d50e4..cdef9aa 100644
--- a/src/main/java/net/onrc/onos/core/topology/DeviceEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/DeviceEvent.java
@@ -1,11 +1,8 @@
 package net.onrc.onos.core.topology;
 
-import java.net.InetAddress;
 import java.nio.ByteBuffer;
-import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Set;
 
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.core.topology.PortEvent.SwitchPort;
@@ -14,7 +11,7 @@
  * Self-contained Device event(s) Object
  * <p/>
  * Device event differ from other events.
- * Device Event represent add/remove of attachmentPoint or ipAddress.
+ * Device Event represent add/remove of attachmentPoint.
  * Not add/remove of the DeviceObject itself.
  * <p/>
  * Multiple attachmentPoints can be specified to batch events into 1 object.
@@ -25,7 +22,6 @@
 public class DeviceEvent {
     private final MACAddress mac;
     protected List<SwitchPort> attachmentPoints;
-    protected Set<InetAddress> ipAddresses;
     private long lastSeenTime;
 
     /**
@@ -42,7 +38,6 @@
         }
         this.mac = mac;
         this.attachmentPoints = new LinkedList<>();
-        this.ipAddresses = new HashSet<>();
     }
 
     public MACAddress getMac() {
@@ -53,10 +48,6 @@
         return attachmentPoints;
     }
 
-    public Set<InetAddress> getIpAddresses() {
-        return ipAddresses;
-    }
-
     public void setAttachmentPoints(List<SwitchPort> attachmentPoints) {
         this.attachmentPoints = attachmentPoints;
     }
@@ -66,18 +57,9 @@
         this.attachmentPoints.add(0, attachmentPoint);
     }
 
-
-    public boolean addIpAddress(InetAddress addr) {
-        return this.ipAddresses.add(addr);
-    }
-
-    public boolean removeIpAddress(InetAddress addr) {
-        return this.ipAddresses.remove(addr);
-    }
-
     @Override
     public String toString() {
-        return "[DeviceEvent " + mac + " attachmentPoints:" + attachmentPoints + " ipAddr:" + ipAddresses + "]";
+        return "[DeviceEvent " + mac + " attachmentPoints:" + attachmentPoints + "]";
     }
 
     // Assuming mac is unique cluster-wide
diff --git a/src/main/java/net/onrc/onos/core/topology/DeviceImpl.java b/src/main/java/net/onrc/onos/core/topology/DeviceImpl.java
index 28a7796..d070570 100644
--- a/src/main/java/net/onrc/onos/core/topology/DeviceImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/DeviceImpl.java
@@ -1,11 +1,7 @@
 package net.onrc.onos.core.topology;
 
-import java.net.InetAddress;
-import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.LinkedList;
-import java.util.Set;
 
 import net.floodlightcontroller.util.MACAddress;
 
@@ -16,14 +12,12 @@
 
     private final MACAddress macAddr;
     protected LinkedList<Port> attachmentPoints;
-    protected Set<InetAddress> ipAddresses;
     private long lastSeenTime;
 
     public DeviceImpl(NetworkGraph graph, MACAddress mac) {
         super(graph);
         this.macAddr = mac;
         this.attachmentPoints = new LinkedList<>();
-        this.ipAddresses = new HashSet<>();
     }
 
     @Override
@@ -32,11 +26,6 @@
     }
 
     @Override
-    public Collection<InetAddress> getIpAddress() {
-        return Collections.unmodifiableSet(ipAddresses);
-    }
-
-    @Override
     public Iterable<Port> getAttachmentPoints() {
         return Collections.unmodifiableList(this.attachmentPoints);
     }
@@ -73,22 +62,4 @@
     boolean removeAttachmentPoint(Port p) {
         return this.attachmentPoints.remove(p);
     }
-
-    /**
-     * Only {@link TopologyManager} should use this method.
-     *
-     * @param p
-     */
-    boolean addIpAddress(InetAddress addr) {
-        return this.ipAddresses.add(addr);
-    }
-
-    /**
-     * Only {@link TopologyManager} should use this method.
-     *
-     * @param p
-     */
-    boolean removeIpAddress(InetAddress addr) {
-        return this.ipAddresses.remove(addr);
-    }
 }
diff --git a/src/main/java/net/onrc/onos/core/topology/NetworkGraph.java b/src/main/java/net/onrc/onos/core/topology/NetworkGraph.java
index 3c583b4..99f7eda 100644
--- a/src/main/java/net/onrc/onos/core/topology/NetworkGraph.java
+++ b/src/main/java/net/onrc/onos/core/topology/NetworkGraph.java
@@ -1,7 +1,5 @@
 package net.onrc.onos.core.topology;
 
-import java.net.InetAddress;
-
 import net.floodlightcontroller.util.MACAddress;
 
 /**
@@ -66,14 +64,6 @@
     public Iterable<Link> getLinks();
 
     /**
-     * Get the network devices for a given IP address.
-     *
-     * @param ipAddress the IP address to use.
-     * @return the network devices for the IP address.
-     */
-    public Iterable<Device> getDevicesByIp(InetAddress ipAddress);
-
-    /**
      * Get the network device for a given MAC address.
      *
      * @param address the MAC address to use.
diff --git a/src/main/java/net/onrc/onos/core/topology/NetworkGraphDatastore.java b/src/main/java/net/onrc/onos/core/topology/NetworkGraphDatastore.java
index 488915f..f5aec14 100644
--- a/src/main/java/net/onrc/onos/core/topology/NetworkGraphDatastore.java
+++ b/src/main/java/net/onrc/onos/core/topology/NetworkGraphDatastore.java
@@ -1,6 +1,5 @@
 package net.onrc.onos.core.topology;
 
-import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -19,8 +18,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.net.InetAddresses;
-
 /**
  * The southbound interface to the network graph which allows clients to
  * mutate the graph. This class will maintain the invariants of the network
@@ -193,18 +190,12 @@
         log.debug("Adding device into DB. mac {}", device.getMac());
 
         KVDevice rcDevice = new KVDevice(device.getMac().toBytes());
-        rcDevice.setLastSeenTime(device.getLastSeenTime());
 
         for (SwitchPort sp : device.getAttachmentPoints()) {
             byte[] portId = KVPort.getPortID(sp.getDpid(), sp.getNumber());
             rcDevice.addPortId(portId);
         }
 
-        for (InetAddress addr : device.getIpAddresses()) {
-            //It assume only one ip on a device now.
-            rcDevice.setIp(InetAddresses.coerceToInteger(addr));
-        }
-
         rcDevice.forceCreate();
 
         return true;
diff --git a/src/main/java/net/onrc/onos/core/topology/NetworkGraphImpl.java b/src/main/java/net/onrc/onos/core/topology/NetworkGraphImpl.java
index d28e8bb..115afb5 100644
--- a/src/main/java/net/onrc/onos/core/topology/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/NetworkGraphImpl.java
@@ -1,11 +1,8 @@
 package net.onrc.onos.core.topology;
 
-import java.net.InetAddress;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.locks.Lock;
@@ -23,8 +20,6 @@
 
     // DPID -> Switch
     private ConcurrentMap<Long, Switch> switches;
-
-    private ConcurrentMap<InetAddress, Set<Device>> addr2Device;
     private ConcurrentMap<MACAddress, Device> mac2Device;
 
     private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
@@ -35,7 +30,6 @@
     public NetworkGraphImpl() {
         // TODO: Does these object need to be stored in Concurrent Collection?
         switches = new ConcurrentHashMap<>();
-        addr2Device = new ConcurrentHashMap<>();
         mac2Device = new ConcurrentHashMap<>();
     }
 
@@ -107,42 +101,16 @@
     }
 
     @Override
-    public Iterable<Device> getDevicesByIp(InetAddress ipAddress) {
-        Set<Device> devices = addr2Device.get(ipAddress);
-        if (devices == null) {
-            return Collections.emptySet();
-        }
-        return Collections.unmodifiableCollection(devices);
-    }
-
-    @Override
     public Device getDeviceByMac(MACAddress address) {
         return mac2Device.get(address);
     }
 
     protected void putDevice(Device device) {
         mac2Device.put(device.getMacAddress(), device);
-        for (InetAddress ipAddr : device.getIpAddress()) {
-            Set<Device> devices = addr2Device.get(ipAddr);
-            if (devices == null) {
-                devices = new HashSet<>();
-                addr2Device.put(ipAddr, devices);
-            }
-            devices.add(device);
-        }
     }
 
     protected void removeDevice(Device device) {
         mac2Device.remove(device.getMacAddress());
-        for (InetAddress ipAddr : device.getIpAddress()) {
-            Set<Device> devices = addr2Device.get(ipAddr);
-            if (devices != null) {
-                devices.remove(device);
-                if (devices.isEmpty()) {
-                    addr2Device.remove(ipAddr);
-                }
-            }
-        }
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/core/topology/NetworkGraphPublisher.java b/src/main/java/net/onrc/onos/core/topology/NetworkGraphPublisher.java
index e00e3c9..6f9b332 100644
--- a/src/main/java/net/onrc/onos/core/topology/NetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/core/topology/NetworkGraphPublisher.java
@@ -1,6 +1,5 @@
 package net.onrc.onos.core.topology;
 
-import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -31,8 +30,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.net.InetAddresses;
-
 /**
  * The NetworkGraphPublisher subscribes to topology network events from the
  * discovery modules. These events are reformatted and relayed to the topology
@@ -286,10 +283,6 @@
         DeviceEvent event = new DeviceEvent(device.getMacAddress());
         event.setAttachmentPoints(spLists);
         event.setLastSeenTime(device.getLastSeenTimestamp().getTime());
-        if (device.getIpv4Address() != null) {
-            InetAddress ip = InetAddresses.fromInteger(device.getIpv4Address());
-            event.addIpAddress(ip);
-        }
         // Does not use vlan info now.
 
         networkGraphDiscoveryInterface.putDeviceDiscoveryEvent(event);
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
index bc1fc9a..bf3874b 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -1,6 +1,5 @@
 package net.onrc.onos.core.topology;
 
-import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -14,9 +13,11 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.LinkedBlockingQueue;
 
+import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.core.datagrid.IDatagridService;
 import net.onrc.onos.core.datagrid.IEventChannel;
 import net.onrc.onos.core.datagrid.IEventChannelListener;
+import net.onrc.onos.core.datastore.topology.KVDevice;
 import net.onrc.onos.core.datastore.topology.KVLink;
 import net.onrc.onos.core.datastore.topology.KVPort;
 import net.onrc.onos.core.datastore.topology.KVSwitch;
@@ -1034,20 +1035,16 @@
      * @param deviceEvent the Device Event with the device to add.
      */
     private void addDevice(DeviceEvent deviceEvent) {
+        log.debug("Adding a device to the Network Graph with mac {}", deviceEvent.getMac());
         Device device = networkGraph.getDeviceByMac(deviceEvent.getMac());
 
         if (device == null) {
-            log.debug("Existing device was not found in networkGraph. New device. mac {}", deviceEvent.getMac());
+            log.debug("Existing device was not found in the NetworkGraph: Adding new device: mac {}", deviceEvent.getMac());
             device = new DeviceImpl(networkGraph, deviceEvent.getMac());
         }
 
         DeviceImpl deviceImpl = getDeviceImpl(device);
 
-        // Update the IP addresses
-        for (InetAddress ipAddr : deviceEvent.getIpAddresses()) {
-            deviceImpl.addIpAddress(ipAddr);
-        }
-
         // Process each attachment point
         boolean attachmentFound = false;
         for (SwitchPort swp : deviceEvent.getAttachmentPoints()) {
@@ -1077,7 +1074,7 @@
 
         // Update the device in the Network Graph
         if (attachmentFound) {
-            log.debug("Storing the info into networkGraph. mac {}", deviceEvent.getMac());
+            log.debug("Storing the device info into the NetworkGraph: mac {}", deviceEvent.getMac());
             networkGraph.putDevice(device);
             apiAddedDeviceEvents.add(deviceEvent);
         }
@@ -1091,6 +1088,7 @@
      * @param deviceEvent the Device Event with the device to remove.
      */
     private void removeDevice(DeviceEvent deviceEvent) {
+        log.debug("Removing a device to the Network Graph: mac {}", deviceEvent.getMac());
         Device device = networkGraph.getDeviceByMac(deviceEvent.getMac());
         if (device == null) {
             log.warn("Device {} already removed, ignoring", deviceEvent);
@@ -1113,6 +1111,7 @@
             deviceImpl.removeAttachmentPoint(port);
         }
 
+        log.debug("Removing the device info into the NetworkGraph: mac {}", deviceEvent.getMac());
         networkGraph.removeDevice(device);
         apiRemovedDeviceEvents.add(deviceEvent);
     }
@@ -1210,13 +1209,12 @@
             collection.add(eventEntry);
         }
 
-        // TODO Is Device going to be in DB? If so, read from DB.
-        //      for (KVDevice d : KVDevice.getAllDevices()) {
-        //          DeviceEvent devEvent = new DeviceEvent( MACAddress.valueOf(d.getMac()) );
-        //          for (byte[] portId : d.getAllPortIds() ) {
-        //              devEvent.addAttachmentPoint( new SwitchPort( KVPort.getDpidFromKey(portId), KVPort.getNumberFromKey(portId) ));
-        //          }
-        //      }
+         for (KVDevice d : KVDevice.getAllDevices()) {
+              DeviceEvent devEvent = new DeviceEvent(MACAddress.valueOf(d.getMac()));
+              for (byte[] portId : d.getAllPortIds()) {
+                  devEvent.addAttachmentPoint(new SwitchPort(KVPort.getDpidFromKey(portId), KVPort.getNumberFromKey(portId)));
+              }
+         }
 
         for (KVLink l : KVLink.getAllLinks()) {
             LinkEvent linkEvent = new LinkEvent(l.getSrc().dpid,
