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,
