diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
new file mode 100644
index 0000000..f32579f
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.newresource;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Represents identifier of resource.
+ * This class is exposed to public, but intended to use only in ResourceStore implementations.
+ */
+@Beta
+public final class ResourceId {
+    static final ResourceId ROOT = new ResourceId();
+
+    final ImmutableList<Object> components;
+
+    static ResourceId of(DeviceId device, Object... components) {
+        return new ResourceId(ImmutableList.builder()
+                .add(device)
+                .add(components)
+                .build());
+    }
+
+    static ResourceId of(DeviceId device, PortNumber port, Object... components) {
+        return new ResourceId(ImmutableList.builder()
+                .add(device)
+                .add(port)
+                .add(components)
+                .build());
+    }
+
+    private ResourceId(ImmutableList<Object> components) {
+        this.components = checkNotNull(components);
+    }
+
+    // for serializer
+    private ResourceId() {
+        this.components = ImmutableList.of();
+    }
+
+    // IndexOutOfBoundsException is raised when the instance is equal to ROOT
+    ResourceId parent() {
+        if (components.size() == 1) {
+            return ROOT;
+        } else {
+            return new ResourceId(components.subList(0, components.size() - 1));
+        }
+    }
+
+    ResourceId child(Object child) {
+        return new ResourceId(ImmutableList.builder()
+                .add(components)
+                .add(child)
+                .build());
+    }
+
+    @Override
+    public int hashCode() {
+        return components.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof ResourceId)) {
+            return false;
+        }
+
+        ResourceId other = (ResourceId) obj;
+        return Objects.equals(this.components, other.components);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("components", components)
+                .toString();
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
index d07e516..35a66d8 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
@@ -17,7 +17,6 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 
@@ -49,12 +48,12 @@
 public abstract class ResourcePath {
 
     private final Discrete parent;
-    private final Key key;
+    private final ResourceId id;
 
     public static final Discrete ROOT = new Discrete();
 
     public static ResourcePath discrete(DeviceId device) {
-        return new Discrete(Key.of(device));
+        return new Discrete(ResourceId.of(device));
     }
 
     /**
@@ -65,7 +64,7 @@
      * @return resource path instance
      */
     public static ResourcePath discrete(DeviceId device, Object... components) {
-        return new Discrete(Key.of(device, components));
+        return new Discrete(ResourceId.of(device, components));
     }
 
     /**
@@ -77,7 +76,7 @@
      * @return resource path instance
      */
     public static ResourcePath discrete(DeviceId device, PortNumber port, Object... components) {
-        return new Discrete(Key.of(device, port, components));
+        return new Discrete(ResourceId.of(device, port, components));
     }
 
     /**
@@ -92,7 +91,7 @@
         checkArgument(components.length > 0,
                 "Length of components must be greater thant 0, but " + components.length);
 
-        return new Continuous(Key.of(device, components), value);
+        return new Continuous(ResourceId.of(device, components), value);
     }
 
     /**
@@ -105,29 +104,29 @@
      * @return resource path instance
      */
     public static ResourcePath continuous(double value, DeviceId device, PortNumber port, Object... components) {
-        return new Continuous(Key.of(device, port, components), value);
+        return new Continuous(ResourceId.of(device, port, components), value);
     }
 
     /**
      * Creates an resource path from the specified key.
      *
-     * @param key key of the path
+     * @param id key of the path
      */
-    protected ResourcePath(Key key) {
-        checkNotNull(key);
+    protected ResourcePath(ResourceId id) {
+        checkNotNull(id);
 
-        this.key = key;
-        if (key.components.size() == 1) {
+        this.id = id;
+        if (id.components.size() == 1) {
             this.parent = ROOT;
         } else {
-            this.parent = new Discrete(key.parent());
+            this.parent = new Discrete(id.parent());
         }
     }
 
     // for serialization
     private ResourcePath() {
         this.parent = null;
-        this.key = Key.ROOT;
+        this.id = ResourceId.ROOT;
     }
 
     /**
@@ -136,7 +135,7 @@
      * @return the components of this resource path
      */
     public List<Object> components() {
-        return key.components;
+        return id.components;
     }
 
     /**
@@ -160,7 +159,7 @@
     public ResourcePath child(Object child) {
         checkState(this instanceof Discrete);
 
-        return new Discrete(key().child(child));
+        return new Discrete(id().child(child));
     }
 
     /**
@@ -174,7 +173,7 @@
     public ResourcePath child(Object child, double value) {
         checkState(this instanceof Discrete);
 
-        return new Continuous(key.child(child), value);
+        return new Continuous(id.child(child), value);
     }
 
     /**
@@ -184,10 +183,10 @@
      * The return value is equal to the last object of {@code components()}.
      */
     public Object last() {
-        if (key.components.isEmpty()) {
+        if (id.components.isEmpty()) {
             return null;
         }
-        return key.components.get(key.components.size() - 1);
+        return id.components.get(id.components.size() - 1);
     }
 
     /**
@@ -195,13 +194,13 @@
      *
      * @return the key of this resource path
      */
-    public Key key() {
-        return key;
+    public ResourceId id() {
+        return id;
     }
 
     @Override
     public int hashCode() {
-        return key.hashCode();
+        return id.hashCode();
     }
 
     @Override
@@ -213,13 +212,13 @@
             return false;
         }
         final ResourcePath that = (ResourcePath) obj;
-        return Objects.equals(this.key, that.key);
+        return Objects.equals(this.id, that.id);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-                .add("key", key)
+                .add("key", id)
                 .toString();
     }
 
@@ -237,7 +236,7 @@
             super();
         }
 
-        private Discrete(Key key) {
+        private Discrete(ResourceId key) {
             super(key);
         }
     }
@@ -253,14 +252,14 @@
     public static final class Continuous extends ResourcePath {
         private final double value;
 
-        private Continuous(Key key, double value) {
+        private Continuous(ResourceId key, double value) {
             super(key);
             this.value = value;
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(this.key(), this.value);
+            return Objects.hash(this.id(), this.value);
         }
 
         @Override
@@ -278,7 +277,7 @@
             }
 
             final Continuous other = (Continuous) obj;
-            return Objects.equals(this.key(), other.key());
+            return Objects.equals(this.id(), other.id());
         }
 
         /**
@@ -291,79 +290,4 @@
         }
     }
 
-    /**
-     * Represents key of resource path used as a key in ResourceStore.
-     * This class is exposed to public, but intended to use only in ResourceStore implementations.
-     */
-    @Beta
-    public static final class Key {
-        private static final Key ROOT = new Key();
-
-        private final ImmutableList<Object> components;
-
-        private static Key of(DeviceId device, Object... components) {
-            return new Key(ImmutableList.builder()
-                    .add(device)
-                    .add(components)
-                    .build());
-        }
-
-        private static Key of(DeviceId device, PortNumber port, Object... components) {
-            return new Key(ImmutableList.builder()
-                    .add(device)
-                    .add(port)
-                    .add(components)
-                    .build());
-        }
-
-        private Key(ImmutableList<Object> components) {
-            this.components = checkNotNull(components);
-        }
-
-        // for serializer
-        private Key() {
-            this.components = ImmutableList.of();
-        }
-
-        // IndexOutOfBoundsException is raised when the instance is equal to ROOT
-        private Key parent() {
-            if (components.size() == 1) {
-                return ROOT;
-            } else {
-                return new Key(components.subList(0, components.size() - 1));
-            }
-        }
-
-        private Key child(Object child) {
-            return new Key(ImmutableList.builder()
-                    .add(components)
-                    .add(child)
-                    .build());
-        }
-
-        @Override
-        public int hashCode() {
-            return components.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (!(obj instanceof Key)) {
-                return false;
-            }
-
-            Key other = (Key) obj;
-            return Objects.equals(this.components, other.components);
-        }
-
-        @Override
-        public String toString() {
-            return MoreObjects.toStringHelper(this)
-                    .add("components", components)
-                    .toString();
-        }
-    }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
index 23bbb27..83d9b44 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
@@ -60,18 +60,18 @@
     }
 
     @Test
-    public void testKeyEquality() {
-        ResourcePath.Key key1 = ResourcePath.discrete(D1, P1, VLAN1).key();
-        ResourcePath.Key sameAsKey1 = ResourcePath.discrete(D1, P1, VLAN1).key();
-        ResourcePath.Key key2 = ResourcePath.discrete(D2, P1, VLAN1).key();
-        ResourcePath.Key key3 = ResourcePath.continuous(BW1.bps(), D1, P1, BW1).key();
+    public void testIdEquality() {
+        ResourceId id1 = ResourcePath.discrete(D1, P1, VLAN1).id();
+        ResourceId sameAsId1 = ResourcePath.discrete(D1, P1, VLAN1).id();
+        ResourceId id2 = ResourcePath.discrete(D2, P1, VLAN1).id();
+        ResourceId id3 = ResourcePath.continuous(BW1.bps(), D1, P1, BW1).id();
         // intentionally set a different value
-        ResourcePath.Key sameAsKey3 = ResourcePath.continuous(BW2.bps(), D1, P1, BW1).key();
+        ResourceId sameAsId3 = ResourcePath.continuous(BW2.bps(), D1, P1, BW1).id();
 
         new EqualsTester()
-                .addEqualityGroup(key1, sameAsKey1)
-                .addEqualityGroup(key2)
-                .addEqualityGroup(key3, sameAsKey3);
+                .addEqualityGroup(id1, sameAsId1)
+                .addEqualityGroup(id2)
+                .addEqualityGroup(id3, sameAsId3);
     }
 
     @Test
diff --git a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
index f20a1e5..de72fd2 100644
--- a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
+++ b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
@@ -172,6 +172,7 @@
 import org.onosproject.net.link.DefaultLinkDescription;
 import org.onosproject.net.meter.MeterId;
 import org.onosproject.net.newresource.ResourceAllocation;
+import org.onosproject.net.newresource.ResourceId;
 import org.onosproject.net.newresource.ResourcePath;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.DefaultPacketRequest;
@@ -430,7 +431,7 @@
                     ResourcePath.class,
                     ResourcePath.Discrete.class,
                     ResourcePath.Continuous.class,
-                    ResourcePath.Key.class,
+                    ResourceId.class,
                     ResourceAllocation.class,
                     // Constraints
                     LambdaConstraint.class,
diff --git a/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java b/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
index 0d88e9f..a318068 100644
--- a/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
+++ b/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
@@ -379,7 +379,7 @@
 
     @Test
     public void testResourceKey() {
-        testSerializedEquals(ResourcePath.discrete(DID1, P1).key());
+        testSerializedEquals(ResourcePath.discrete(DID1, P1).id());
     }
 
     @Test
