Change for removing ip related info and some fix to our device.
OnosDeviceManager Unit tests have not been done because it is supposed to be done by Patrik.

Change-Id: Icfc5bafe82cc0d4f428926b298f0867ea1be4e7d
diff --git a/src/main/java/net/onrc/onos/core/datastore/serializers/Device.java b/src/main/java/net/onrc/onos/core/datastore/serializers/Device.java
new file mode 100644
index 0000000..41b9991
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/datastore/serializers/Device.java
@@ -0,0 +1,692 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: device.proto
+
+package net.onrc.onos.core.datastore.serializers;
+
+public final class Device {
+  private Device() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface DevicePropertyOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // required bytes mac = 1;
+    /**
+     * <code>required bytes mac = 1;</code>
+     */
+    boolean hasMac();
+    /**
+     * <code>required bytes mac = 1;</code>
+     */
+    com.google.protobuf.ByteString getMac();
+
+    // repeated bytes portIds = 2;
+    /**
+     * <code>repeated bytes portIds = 2;</code>
+     */
+    java.util.List<com.google.protobuf.ByteString> getPortIdsList();
+    /**
+     * <code>repeated bytes portIds = 2;</code>
+     */
+    int getPortIdsCount();
+    /**
+     * <code>repeated bytes portIds = 2;</code>
+     */
+    com.google.protobuf.ByteString getPortIds(int index);
+
+    // optional bytes value = 3;
+    /**
+     * <code>optional bytes value = 3;</code>
+     */
+    boolean hasValue();
+    /**
+     * <code>optional bytes value = 3;</code>
+     */
+    com.google.protobuf.ByteString getValue();
+  }
+  /**
+   * Protobuf type {@code device.DeviceProperty}
+   */
+  public static final class DeviceProperty extends
+      com.google.protobuf.GeneratedMessage
+      implements DevicePropertyOrBuilder {
+    // Use DeviceProperty.newBuilder() to construct.
+    private DeviceProperty(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private DeviceProperty(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final DeviceProperty defaultInstance;
+    public static DeviceProperty getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public DeviceProperty getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private DeviceProperty(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              mac_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
+                portIds_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
+                mutable_bitField0_ |= 0x00000002;
+              }
+              portIds_.add(input.readBytes());
+              break;
+            }
+            case 26: {
+              bitField0_ |= 0x00000002;
+              value_ = input.readBytes();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
+          portIds_ = java.util.Collections.unmodifiableList(portIds_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return net.onrc.onos.core.datastore.serializers.Device.internal_static_device_DeviceProperty_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return net.onrc.onos.core.datastore.serializers.Device.internal_static_device_DeviceProperty_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              net.onrc.onos.core.datastore.serializers.Device.DeviceProperty.class, net.onrc.onos.core.datastore.serializers.Device.DeviceProperty.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<DeviceProperty> PARSER =
+        new com.google.protobuf.AbstractParser<DeviceProperty>() {
+      public DeviceProperty parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new DeviceProperty(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<DeviceProperty> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // required bytes mac = 1;
+    public static final int MAC_FIELD_NUMBER = 1;
+    private com.google.protobuf.ByteString mac_;
+    /**
+     * <code>required bytes mac = 1;</code>
+     */
+    public boolean hasMac() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>required bytes mac = 1;</code>
+     */
+    public com.google.protobuf.ByteString getMac() {
+      return mac_;
+    }
+
+    // repeated bytes portIds = 2;
+    public static final int PORTIDS_FIELD_NUMBER = 2;
+    private java.util.List<com.google.protobuf.ByteString> portIds_;
+    /**
+     * <code>repeated bytes portIds = 2;</code>
+     */
+    public java.util.List<com.google.protobuf.ByteString>
+        getPortIdsList() {
+      return portIds_;
+    }
+    /**
+     * <code>repeated bytes portIds = 2;</code>
+     */
+    public int getPortIdsCount() {
+      return portIds_.size();
+    }
+    /**
+     * <code>repeated bytes portIds = 2;</code>
+     */
+    public com.google.protobuf.ByteString getPortIds(int index) {
+      return portIds_.get(index);
+    }
+
+    // optional bytes value = 3;
+    public static final int VALUE_FIELD_NUMBER = 3;
+    private com.google.protobuf.ByteString value_;
+    /**
+     * <code>optional bytes value = 3;</code>
+     */
+    public boolean hasValue() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>optional bytes value = 3;</code>
+     */
+    public com.google.protobuf.ByteString getValue() {
+      return value_;
+    }
+
+    private void initFields() {
+      mac_ = com.google.protobuf.ByteString.EMPTY;
+      portIds_ = java.util.Collections.emptyList();
+      value_ = com.google.protobuf.ByteString.EMPTY;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      if (!hasMac()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, mac_);
+      }
+      for (int i = 0; i < portIds_.size(); i++) {
+        output.writeBytes(2, portIds_.get(i));
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBytes(3, value_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, mac_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < portIds_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeBytesSizeNoTag(portIds_.get(i));
+        }
+        size += dataSize;
+        size += 1 * getPortIdsList().size();
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(3, value_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(net.onrc.onos.core.datastore.serializers.Device.DeviceProperty prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code device.DeviceProperty}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements net.onrc.onos.core.datastore.serializers.Device.DevicePropertyOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return net.onrc.onos.core.datastore.serializers.Device.internal_static_device_DeviceProperty_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return net.onrc.onos.core.datastore.serializers.Device.internal_static_device_DeviceProperty_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                net.onrc.onos.core.datastore.serializers.Device.DeviceProperty.class, net.onrc.onos.core.datastore.serializers.Device.DeviceProperty.Builder.class);
+      }
+
+      // Construct using net.onrc.onos.core.datastore.serializers.Device.DeviceProperty.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        mac_ = com.google.protobuf.ByteString.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        portIds_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000002);
+        value_ = com.google.protobuf.ByteString.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return net.onrc.onos.core.datastore.serializers.Device.internal_static_device_DeviceProperty_descriptor;
+      }
+
+      public net.onrc.onos.core.datastore.serializers.Device.DeviceProperty getDefaultInstanceForType() {
+        return net.onrc.onos.core.datastore.serializers.Device.DeviceProperty.getDefaultInstance();
+      }
+
+      public net.onrc.onos.core.datastore.serializers.Device.DeviceProperty build() {
+        net.onrc.onos.core.datastore.serializers.Device.DeviceProperty result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public net.onrc.onos.core.datastore.serializers.Device.DeviceProperty buildPartial() {
+        net.onrc.onos.core.datastore.serializers.Device.DeviceProperty result = new net.onrc.onos.core.datastore.serializers.Device.DeviceProperty(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.mac_ = mac_;
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          portIds_ = java.util.Collections.unmodifiableList(portIds_);
+          bitField0_ = (bitField0_ & ~0x00000002);
+        }
+        result.portIds_ = portIds_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.value_ = value_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof net.onrc.onos.core.datastore.serializers.Device.DeviceProperty) {
+          return mergeFrom((net.onrc.onos.core.datastore.serializers.Device.DeviceProperty)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(net.onrc.onos.core.datastore.serializers.Device.DeviceProperty other) {
+        if (other == net.onrc.onos.core.datastore.serializers.Device.DeviceProperty.getDefaultInstance()) return this;
+        if (other.hasMac()) {
+          setMac(other.getMac());
+        }
+        if (!other.portIds_.isEmpty()) {
+          if (portIds_.isEmpty()) {
+            portIds_ = other.portIds_;
+            bitField0_ = (bitField0_ & ~0x00000002);
+          } else {
+            ensurePortIdsIsMutable();
+            portIds_.addAll(other.portIds_);
+          }
+          onChanged();
+        }
+        if (other.hasValue()) {
+          setValue(other.getValue());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        if (!hasMac()) {
+          
+          return false;
+        }
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        net.onrc.onos.core.datastore.serializers.Device.DeviceProperty parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (net.onrc.onos.core.datastore.serializers.Device.DeviceProperty) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // required bytes mac = 1;
+      private com.google.protobuf.ByteString mac_ = com.google.protobuf.ByteString.EMPTY;
+      /**
+       * <code>required bytes mac = 1;</code>
+       */
+      public boolean hasMac() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>required bytes mac = 1;</code>
+       */
+      public com.google.protobuf.ByteString getMac() {
+        return mac_;
+      }
+      /**
+       * <code>required bytes mac = 1;</code>
+       */
+      public Builder setMac(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        mac_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required bytes mac = 1;</code>
+       */
+      public Builder clearMac() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        mac_ = getDefaultInstance().getMac();
+        onChanged();
+        return this;
+      }
+
+      // repeated bytes portIds = 2;
+      private java.util.List<com.google.protobuf.ByteString> portIds_ = java.util.Collections.emptyList();
+      private void ensurePortIdsIsMutable() {
+        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+          portIds_ = new java.util.ArrayList<com.google.protobuf.ByteString>(portIds_);
+          bitField0_ |= 0x00000002;
+         }
+      }
+      /**
+       * <code>repeated bytes portIds = 2;</code>
+       */
+      public java.util.List<com.google.protobuf.ByteString>
+          getPortIdsList() {
+        return java.util.Collections.unmodifiableList(portIds_);
+      }
+      /**
+       * <code>repeated bytes portIds = 2;</code>
+       */
+      public int getPortIdsCount() {
+        return portIds_.size();
+      }
+      /**
+       * <code>repeated bytes portIds = 2;</code>
+       */
+      public com.google.protobuf.ByteString getPortIds(int index) {
+        return portIds_.get(index);
+      }
+      /**
+       * <code>repeated bytes portIds = 2;</code>
+       */
+      public Builder setPortIds(
+          int index, com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensurePortIdsIsMutable();
+        portIds_.set(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated bytes portIds = 2;</code>
+       */
+      public Builder addPortIds(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensurePortIdsIsMutable();
+        portIds_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated bytes portIds = 2;</code>
+       */
+      public Builder addAllPortIds(
+          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
+        ensurePortIdsIsMutable();
+        super.addAll(values, portIds_);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated bytes portIds = 2;</code>
+       */
+      public Builder clearPortIds() {
+        portIds_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000002);
+        onChanged();
+        return this;
+      }
+
+      // optional bytes value = 3;
+      private com.google.protobuf.ByteString value_ = com.google.protobuf.ByteString.EMPTY;
+      /**
+       * <code>optional bytes value = 3;</code>
+       */
+      public boolean hasValue() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      /**
+       * <code>optional bytes value = 3;</code>
+       */
+      public com.google.protobuf.ByteString getValue() {
+        return value_;
+      }
+      /**
+       * <code>optional bytes value = 3;</code>
+       */
+      public Builder setValue(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000004;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional bytes value = 3;</code>
+       */
+      public Builder clearValue() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        value_ = getDefaultInstance().getValue();
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:device.DeviceProperty)
+    }
+
+    static {
+      defaultInstance = new DeviceProperty(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:device.DeviceProperty)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_device_DeviceProperty_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_device_DeviceProperty_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\014device.proto\022\006device\"=\n\016DeviceProperty" +
+      "\022\013\n\003mac\030\001 \002(\014\022\017\n\007portIds\030\002 \003(\014\022\r\n\005value\030" +
+      "\003 \001(\014B2\n(net.onrc.onos.core.datastore.se" +
+      "rializersB\006Device"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_device_DeviceProperty_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_device_DeviceProperty_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_device_DeviceProperty_descriptor,
+              new java.lang.String[] { "Mac", "PortIds", "Value", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java b/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java
index cfdb02b..15cdc57 100644
--- a/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java
+++ b/src/main/java/net/onrc/onos/core/datastore/topology/KVDevice.java
@@ -1,7 +1,6 @@
 package net.onrc.onos.core.datastore.topology;
 
 import java.nio.ByteBuffer;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -12,6 +11,7 @@
 
 import net.onrc.onos.core.datastore.DataStoreClient;
 import net.onrc.onos.core.datastore.IKVTable.IKVEntry;
+import net.onrc.onos.core.datastore.serializers.Device.DeviceProperty;
 import net.onrc.onos.core.datastore.topology.KVLink.STATUS;
 import net.onrc.onos.core.datastore.utils.ByteArrayComparator;
 import net.onrc.onos.core.datastore.utils.ByteArrayUtil;
@@ -22,6 +22,8 @@
 import org.slf4j.LoggerFactory;
 
 import com.esotericsoftware.kryo.Kryo;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
 
 /**
  * Device object.
@@ -56,10 +58,6 @@
     private TreeSet<byte[]> portIds;
     private transient boolean isPortIdsModified;
 
-    // Assume there is only one ip on a device now.
-    private int ip;
-    private long lastSeenTime;
-
     // Assuming mac is unique cluster-wide
     public static byte[] getDeviceID(final byte[] mac) {
         return DeviceEvent.getDeviceID(mac).array();
@@ -159,40 +157,38 @@
     public byte[] serialize() {
         Map<Object, Object> map = getPropertyMap();
 
-        map.put(PROP_MAC, mac);
-        if (isPortIdsModified) {
-            byte[][] portIdArray = new byte[portIds.size()][];
-            map.put(PROP_PORT_IDS, portIds.toArray(portIdArray));
-            isPortIdsModified = false;
+        DeviceProperty.Builder dev = DeviceProperty.newBuilder();
+
+        dev.setMac(ByteString.copyFrom(mac));
+        for (byte[] port : portIds) {
+            dev.addPortIds(ByteString.copyFrom(port));
         }
 
-        return serializePropertyMap(DEVICE_KRYO.get(), map);
+        if (!map.isEmpty()) {
+            byte[] propMaps = serializePropertyMap(DEVICE_KRYO.get(), map);
+            dev.setValue(ByteString.copyFrom(propMaps));
+        }
+
+        return dev.build().toByteArray();
     }
 
     @Override
     protected boolean deserialize(final byte[] bytes) {
-        boolean success = deserializePropertyMap(DEVICE_KRYO.get(), bytes);
-        if (!success) {
-            log.error("Deserializing Link: " + this + " failed.");
+
+        try {
+            boolean success = true;
+
+            DeviceProperty dev = DeviceProperty.parseFrom(bytes);
+            for (ByteString portId : dev.getPortIdsList()) {
+                this.addPortId(portId.toByteArray());
+            }
+            byte[] props = dev.getValue().toByteArray();
+            success &= deserializePropertyMap(DEVICE_KRYO.get(), props);
+            return success;
+        } catch (InvalidProtocolBufferException e) {
+            log.error("Deserializing Device: " + this + " failed.", e);
             return false;
         }
-        Map<Object, Object> map = this.getPropertyMap();
-
-        if (this.portIds == null) {
-            this.portIds = new TreeSet<>(
-                    ByteArrayComparator.BYTEARRAY_COMPARATOR);
-        }
-        byte[][] portIdArray = (byte[][]) map.get(PROP_PORT_IDS);
-        if (portIdArray != null) {
-            this.portIds.clear();
-            this.portIds.addAll(Arrays.asList(portIdArray));
-            isPortIdsModified = false;
-        } else {
-            // trigger write on next serialize
-            isPortIdsModified = true;
-        }
-
-        return success;
     }
 
     @Override
@@ -201,20 +197,4 @@
         return "[" + this.getClass().getSimpleName()
                 + " " + ByteArrayUtil.toHexStringBuilder(mac, ":") + "]";
     }
-
-    public int getIp() {
-        return ip;
-    }
-
-    public void setIp(int ip) {
-        this.ip = ip;
-    }
-
-    public long getLastSeenTime() {
-        return lastSeenTime;
-    }
-
-    public void setLastSeenTime(long lastSeenTime) {
-        this.lastSeenTime = lastSeenTime;
-    }
 }
diff --git a/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java b/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java
index 99c8769..dde6f55 100644
--- a/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java
+++ b/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java
@@ -45,9 +45,11 @@
         IOFMessageListener,
         IOnosDeviceService,
         IEventChannelListener<Long, OnosDevice> {
+
     private static final Logger log = LoggerFactory.getLogger(OnosDeviceManager.class);
-    private static final int CLEANUP_SECOND = 60 * 60;
-    private static final int AGEING_MILLSEC = 60 * 60 * 1000;
+    private static final long DEVICE_CLEANING_INITIAL_DELAY = 30;
+    private int cleanupSecondConfig = 60 * 60;
+    private int agingMillisecConfig = 60 * 60 * 1000;
 
     private CopyOnWriteArrayList<IOnosDeviceListener> deviceListeners;
     private IFloodlightProviderService floodlightProvider;
@@ -120,7 +122,10 @@
         return Command.CONTINUE;
     }
 
-    private Command processPacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth) {
+    //This "protected" modifier is for unit test.
+    //The above "receive" method couldn't be tested
+    //because of IFloodlightProviderService static final field.
+    protected Command processPacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth) {
         long dpid = sw.getId();
         short portId = pi.getInPort();
         Long mac = eth.getSourceMAC().toLong();
@@ -139,8 +144,8 @@
                 //There is the same existing device. Update only ActiveSince time.
                 exDev.setLastSeenTimestamp(new Date());
                 if (log.isTraceEnabled()) {
-                    log.debug("In the datagrid, there is the same device."
-                            + "Only update last seen time. dpid {}, port {}, mac {}, ip {}, lastSeenTime {}",
+                    log.trace("In the local cache, there is the same device."
+                            + "Only update last seen time: dpid {}, port {}, mac {}, ip {}, lastSeenTime {}",
                             dpid, portId, srcDevice.getMacAddress(), srcDevice.getIpv4Address(), srcDevice.getLastSeenTimestamp().getTime());
                 }
                 return Command.CONTINUE;
@@ -152,8 +157,8 @@
                 //but the packet does not have an ip address.
                 exDev.setLastSeenTimestamp(new Date());
                 if (log.isTraceEnabled()) {
-                    log.debug("In the datagrid, there is the same device with no ip."
-                            + "Keep ip and update last seen time. dpid {}, port {}, mac {}, ip {} lastSeenTime {}",
+                    log.trace("In the local cache, there is the same mac device and got no ip addr packet-in."
+                            + "Only update last seen time. dpid {}, port {}, mac {}, ip {} lastSeenTime {}",
                             dpid, portId, srcDevice.getMacAddress(), exDev.getIpv4Address(), srcDevice.getLastSeenTimestamp().getTime());
                 }
                 return Command.CONTINUE;
@@ -163,7 +168,7 @@
         //If the switch port we try to attach a new device already has a link, then stop adding device
         if (networkGraph.getLink(dpid, (long) portId) != null) {
             if (log.isTraceEnabled()) {
-                log.debug("Stop adding OnosDevice {} due to there is a link to: dpid {} port {}",
+                log.trace("Stop adding OnosDevice {} due to there is a link to: dpid {} port {}",
                         srcDevice.getMacAddress(), dpid, portId);
             }
             return Command.CONTINUE;
@@ -172,7 +177,7 @@
         addOnosDevice(mac, srcDevice);
 
         if (log.isTraceEnabled()) {
-            log.debug("Add device info in the set. dpid {}, port {}, mac {}, ip {}, lastSeenTime {}",
+            log.trace("Add device info: dpid {}, port {}, mac {}, ip {}, lastSeenTime {}",
                     dpid, portId, srcDevice.getMacAddress(), srcDevice.getIpv4Address(), srcDevice.getLastSeenTimestamp().getTime());
         }
         return Command.CONTINUE;
@@ -188,9 +193,9 @@
                 Set<OnosDevice> deleteSet = new HashSet<OnosDevice>();
                 for (OnosDevice dev : mapDevice.values()) {
                     long now = new Date().getTime();
-                    if ((now - dev.getLastSeenTimestamp().getTime() > AGEING_MILLSEC)) {
+                    if ((now - dev.getLastSeenTimestamp().getTime() > agingMillisecConfig)) {
                         if (log.isTraceEnabled()) {
-                            log.debug("Remove device info in the datagrid. dpid {}, port {}, mac {}, ip {}, lastSeenTime {}, diff {}",
+                            log.debug("Remove device info in the datagrid: dpid {}, port {}, mac {}, ip {}, lastSeenTime {}, diff {}",
                                     dev.getSwitchDPID(), dev.getSwitchPort(), dev.getMacAddress(), dev.getIpv4Address(),
                                     dev.getLastSeenTimestamp().getTime(), now - dev.getLastSeenTimestamp().getTime());
                         }
@@ -296,12 +301,12 @@
     public void init(FloodlightModuleContext context)
             throws FloodlightModuleException {
         floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
-        EXECUTOR_SERVICE.scheduleAtFixedRate(new CleanDevice(), 30, CLEANUP_SECOND, TimeUnit.SECONDS);
-
         deviceListeners = new CopyOnWriteArrayList<IOnosDeviceListener>();
         datagrid = context.getServiceImpl(IDatagridService.class);
         networkGraphService = context.getServiceImpl(INetworkGraphService.class);
         networkGraph = networkGraphService.getNetworkGraph();
+
+        setOnosDeviceManagerProperty(context);
     }
 
     @Override
@@ -310,6 +315,7 @@
         eventChannel = datagrid.addListener(DEVICE_CHANNEL_NAME, this,
                 Long.class,
                 OnosDevice.class);
+        EXECUTOR_SERVICE.scheduleAtFixedRate(new CleanDevice(), DEVICE_CLEANING_INITIAL_DELAY, cleanupSecondConfig, TimeUnit.SECONDS);
     }
 
     @Override
@@ -335,21 +341,21 @@
     public void entryAdded(OnosDevice dev) {
         Long mac = dev.getMacAddress().toLong();
         mapDevice.put(mac, dev);
-        log.debug("Device added: device mac {}", mac);
+        log.debug("Device added into local Cache: device mac {}", mac);
     }
 
     @Override
     public void entryRemoved(OnosDevice dev) {
         Long mac = dev.getMacAddress().toLong();
         mapDevice.remove(mac);
-        log.debug("Device removed: device mac {}", mac);
+        log.debug("Device removed into local Cache: device mac {}", mac);
     }
 
     @Override
     public void entryUpdated(OnosDevice dev) {
         Long mac = dev.getMacAddress().toLong();
         mapDevice.put(mac, dev);
-        log.debug("Device updated: device mac {}", mac);
+        log.debug("Device updated into local Cache: device mac {}", mac);
     }
 
     @Override
@@ -361,4 +367,19 @@
     public void deleteOnosDeviceListener(IOnosDeviceListener listener) {
         deviceListeners.remove(listener);
     }
+
+    private void setOnosDeviceManagerProperty(FloodlightModuleContext context) {
+        Map<String, String> configOptions = context.getConfigParams(this);
+        String cleanupsec = configOptions.get("cleanupsec");
+        String agingmsec = configOptions.get("agingmsec");
+        if (cleanupsec != null) {
+            cleanupSecondConfig = Integer.parseInt(cleanupsec);
+            log.debug("CLEANUP_SECOND is set to {}", cleanupSecondConfig);
+        }
+
+        if (agingmsec != null) {
+            agingMillisecConfig = Integer.parseInt(agingmsec);
+            log.debug("AGEING_MILLSEC is set to {}", agingMillisecConfig);
+        }
+    }
 }
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,