diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
similarity index 87%
rename from core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
rename to core/api/src/main/java/org/onosproject/net/newresource/Resource.java
index 2e86509..72b9a57 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
@@ -29,10 +29,10 @@
 import static com.google.common.base.Preconditions.checkState;
 
 /**
- * An object that is used to locate a resource in a network.
- * A ResourcePath represents a path that is hierarchical and composed of a sequence
- * of elementary resources that are not globally identifiable. A ResourcePath can be a globally
- * unique resource identifier.
+ * An object that represent a resource in a network.
+ * A Resource can represents path-like hierarchical structure with its ID. An ID of resource is
+ * composed of a sequence of elementary resources that are not globally identifiable. A Resource
+ * can be globally identifiable by its ID.
  *
  * Two types of resource are considered. One is discrete type and the other is continuous type.
  * Discrete type resource is a resource whose amount is measured as a discrete unit. VLAN ID and
@@ -41,18 +41,18 @@
  * A double value is associated with a continuous type value.
  *
  * Users of this class must keep the semantics of resources regarding the hierarchical structure.
- * For example, resource path, Device:1/Port:1/VLAN ID:100, is valid, but resource path,
+ * For example, resource, Device:1/Port:1/VLAN ID:100, is valid, but resource,
  * VLAN ID:100/Device:1/Port:1 is not valid because a link is not a sub-component of a VLAN ID.
  */
 @Beta
-public abstract class ResourcePath {
+public abstract class Resource {
 
     private final Discrete parent;
     private final ResourceId id;
 
     public static final Discrete ROOT = new Discrete();
 
-    public static ResourcePath discrete(DeviceId device) {
+    public static Resource discrete(DeviceId device) {
         return new Discrete(ResourceId.of(device));
     }
 
@@ -63,7 +63,7 @@
      * @param components following components of the path. The order represents hierarchical structure of the resource.
      * @return resource path instance
      */
-    public static ResourcePath discrete(DeviceId device, Object... components) {
+    public static Resource discrete(DeviceId device, Object... components) {
         return new Discrete(ResourceId.of(device, components));
     }
 
@@ -75,7 +75,7 @@
      * @param components following components of the path. The order represents hierarchical structure of the resource.
      * @return resource path instance
      */
-    public static ResourcePath discrete(DeviceId device, PortNumber port, Object... components) {
+    public static Resource discrete(DeviceId device, PortNumber port, Object... components) {
         return new Discrete(ResourceId.of(device, port, components));
     }
 
@@ -87,7 +87,7 @@
      * @param components following components of the path. The order represents hierarchical structure of the resource.
      * @return resource path instance
      */
-    public static ResourcePath continuous(double value, DeviceId device, Object... components) {
+    public static Resource continuous(double value, DeviceId device, Object... components) {
         checkArgument(components.length > 0,
                 "Length of components must be greater thant 0, but " + components.length);
 
@@ -103,7 +103,7 @@
      * @param components following components of the path. The order represents hierarchical structure of the resource.
      * @return resource path instance
      */
-    public static ResourcePath continuous(double value, DeviceId device, PortNumber port, Object... components) {
+    public static Resource continuous(double value, DeviceId device, PortNumber port, Object... components) {
         return new Continuous(ResourceId.of(device, port, components), value);
     }
 
@@ -112,7 +112,7 @@
      *
      * @param id id of the path
      */
-    protected ResourcePath(ResourceId id) {
+    protected Resource(ResourceId id) {
         checkNotNull(id);
 
         this.id = id;
@@ -124,7 +124,7 @@
     }
 
     // for serialization
-    private ResourcePath() {
+    private Resource() {
         this.parent = null;
         this.id = ResourceId.ROOT;
     }
@@ -156,7 +156,7 @@
      * @param child child object
      * @return a child resource path
      */
-    public ResourcePath child(Object child) {
+    public Resource child(Object child) {
         checkState(this instanceof Discrete);
 
         return new Discrete(id().child(child));
@@ -170,7 +170,7 @@
      * @param value value
      * @return a child resource path
      */
-    public ResourcePath child(Object child, double value) {
+    public Resource child(Object child, double value) {
         checkState(this instanceof Discrete);
 
         return new Continuous(id.child(child), value);
@@ -208,10 +208,10 @@
         if (this == obj) {
             return true;
         }
-        if (!(obj instanceof ResourcePath)) {
+        if (!(obj instanceof Resource)) {
             return false;
         }
-        final ResourcePath that = (ResourcePath) obj;
+        final Resource that = (Resource) obj;
         return Objects.equals(this.id, that.id);
     }
 
@@ -231,7 +231,7 @@
      * </p>
      */
     @Beta
-    public static final class Discrete extends ResourcePath {
+    public static final class Discrete extends Resource {
         private Discrete() {
             super();
         }
@@ -249,7 +249,7 @@
      * implementation only. It is not for resource API user.
      */
     @Beta
-    public static final class Continuous extends ResourcePath {
+    public static final class Continuous extends Resource {
         private final double value;
 
         private Continuous(ResourceId id, double value) {
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceAdminService.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceAdminService.java
index 28c429b..ee4b630 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceAdminService.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceAdminService.java
@@ -32,7 +32,7 @@
      * @return true if registration is successfully done, false otherwise. Registration
      * succeeds when each resource is not registered or unallocated.
      */
-    default boolean registerResources(ResourcePath... resources) {
+    default boolean registerResources(Resource... resources) {
         return registerResources(ImmutableList.copyOf(resources));
     }
 
@@ -43,7 +43,7 @@
      * @return true if registration is successfully done, false otherwise. Registration
      * succeeds when each resource is not registered or unallocated.
      */
-    boolean registerResources(List<ResourcePath> resources);
+    boolean registerResources(List<Resource> resources);
 
     /**
      * Unregisters the specified resources.
@@ -52,7 +52,7 @@
      * @return true if unregistration is successfully done, false otherwise. Unregistration
      * succeeds when each resource is not registered or unallocated.
      */
-    default boolean unregisterResources(ResourcePath... resources) {
+    default boolean unregisterResources(Resource... resources) {
         return unregisterResources(ImmutableList.copyOf(resources));
     }
 
@@ -63,5 +63,5 @@
      * @return true if unregistration is successfully done, false otherwise. Unregistration
      * succeeds when each resource is not registered or unallocated.
      */
-    boolean unregisterResources(List<ResourcePath> resources);
+    boolean unregisterResources(List<Resource> resources);
 }
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceAllocation.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceAllocation.java
index 2d68fa5..07976a9 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceAllocation.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceAllocation.java
@@ -28,7 +28,7 @@
 @Beta
 public class ResourceAllocation {
 
-    private final ResourcePath resource;
+    private final Resource resource;
     private final ResourceConsumer consumer;
 
     /**
@@ -37,7 +37,7 @@
      * @param resource resource of the subject
      * @param consumer consumer of this resource
      */
-    public ResourceAllocation(ResourcePath resource, ResourceConsumer consumer) {
+    public ResourceAllocation(Resource resource, ResourceConsumer consumer) {
         this.resource = checkNotNull(resource);
         this.consumer = consumer;
     }
@@ -53,7 +53,7 @@
      *
      * @return the specifier of the resource this allocation uses
      */
-    public ResourcePath resource() {
+    public Resource resource() {
         return resource;
     }
 
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceEvent.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceEvent.java
index 98abf30..c54b505 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceEvent.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceEvent.java
@@ -24,7 +24,7 @@
  * Describes an event related to a resource.
  */
 @Beta
-public final class ResourceEvent extends AbstractEvent<ResourceEvent.Type, ResourcePath> {
+public final class ResourceEvent extends AbstractEvent<ResourceEvent.Type, Resource> {
 
     /**
      * Type of resource events.
@@ -48,7 +48,7 @@
      * @param type type of resource event
      * @param subject subject of resource event
      */
-    public ResourceEvent(Type type, ResourcePath subject) {
+    public ResourceEvent(Type type, Resource subject) {
         super(checkNotNull(type), checkNotNull(subject));
     }
 }
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceService.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceService.java
index 79a7bba..3076ec9 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceService.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceService.java
@@ -38,7 +38,7 @@
      * @param resource resource to be allocated
      * @return allocation information enclosed by Optional. If the allocation fails, the return value is empty
      */
-    default Optional<ResourceAllocation> allocate(ResourceConsumer consumer, ResourcePath resource) {
+    default Optional<ResourceAllocation> allocate(ResourceConsumer consumer, Resource resource) {
         checkNotNull(consumer);
         checkNotNull(resource);
 
@@ -65,7 +65,7 @@
      * @param resources resources to be allocated
      * @return non-empty list of allocation information if succeeded, otherwise empty list
      */
-    List<ResourceAllocation> allocate(ResourceConsumer consumer, List<ResourcePath> resources);
+    List<ResourceAllocation> allocate(ResourceConsumer consumer, List<Resource> resources);
 
     /**
      * Transactionally allocates the specified resources to the specified user.
@@ -75,7 +75,7 @@
      * @param resources resources to be allocated
      * @return non-empty list of allocation information if succeeded, otherwise empty list
      */
-    default List<ResourceAllocation> allocate(ResourceConsumer consumer, ResourcePath... resources) {
+    default List<ResourceAllocation> allocate(ResourceConsumer consumer, Resource... resources) {
         checkNotNull(consumer);
         checkNotNull(resources);
 
@@ -132,18 +132,18 @@
      * @return list of allocation information.
      * If the resource is not allocated, the return value is an empty list.
      */
-    List<ResourceAllocation> getResourceAllocation(ResourcePath resource);
+    List<ResourceAllocation> getResourceAllocation(Resource resource);
 
     /**
      * Returns allocated resources being as children of the specified parent and being the specified resource type.
      *
-     * @param parent parent resource path
+     * @param parent parent resource
      * @param cls class to specify a type of resource
      * @param <T> type of the resource
      * @return non-empty collection of resource allocations if resources are allocated with the subject and type,
      * empty collection if no resource is allocated with the subject and type
      */
-    <T> Collection<ResourceAllocation> getResourceAllocations(ResourcePath parent, Class<T> cls);
+    <T> Collection<ResourceAllocation> getResourceAllocations(Resource parent, Class<T> cls);
 
     /**
      * Returns resources allocated to the specified consumer.
@@ -154,12 +154,12 @@
     Collection<ResourceAllocation> getResourceAllocations(ResourceConsumer consumer);
 
     /**
-     * Returns resource paths that point available child resources under the specified resource path.
+     * Returns resources that point available child resources under the specified resource.
      *
-     * @param parent parent resource path
-     * @return available resource paths under the specified resource path
+     * @param parent parent resource
+     * @return available resources under the specified resource
      */
-    Collection<ResourcePath> getAvailableResources(ResourcePath parent);
+    Collection<Resource> getAvailableResources(Resource parent);
 
     /**
      * Returns the availability of the specified resource.
@@ -167,7 +167,7 @@
      * @param resource resource to check the availability
      * @return true if available, otherwise false
      */
-    boolean isAvailable(ResourcePath resource);
+    boolean isAvailable(Resource resource);
 
     // TODO: listener and event mechanism need to be considered
 }
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java
index b0c24bd..ac30548 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java
@@ -36,7 +36,7 @@
      * @param resources resources to be registered
      * @return true if the registration succeeds, false otherwise
      */
-    boolean register(List<ResourcePath> resources);
+    boolean register(List<Resource> resources);
 
     /**
      * Unregisters the resources in transactional way.
@@ -47,7 +47,7 @@
      * @param resources resources to be unregistered
      * @return true if the registration succeeds, false otherwise
      */
-    boolean unregister(List<ResourcePath> resources);
+    boolean unregister(List<Resource> resources);
 
     /**
      * Allocates the specified resources to the specified consumer in transactional way.
@@ -59,7 +59,7 @@
      * @param consumer resource consumer which the resources are allocated to
      * @return true if the allocation succeeds, false otherwise.
      */
-    boolean allocate(List<ResourcePath> resources, ResourceConsumer consumer);
+    boolean allocate(List<Resource> resources, ResourceConsumer consumer);
 
     /**
      * Releases the specified resources allocated to the specified corresponding consumers
@@ -73,7 +73,7 @@
      * @param consumers resource consumers to whom the resource allocated to
      * @return true if succeeds, otherwise false
      */
-    boolean release(List<ResourcePath> resources, List<ResourceConsumer> consumers);
+    boolean release(List<Resource> resources, List<ResourceConsumer> consumers);
 
     /**
      * Returns the resource consumers to whom the specified resource is allocated.
@@ -84,7 +84,7 @@
      * @return resource consumers who are allocated the resource.
      * Returns empty list if there is no such consumer.
      */
-    List<ResourceConsumer> getConsumers(ResourcePath resource);
+    List<ResourceConsumer> getConsumers(Resource resource);
 
     /**
      * Returns the availability of the specified resource.
@@ -92,7 +92,7 @@
      * @param resource resource to check the availability
      * @return true if available, otherwise false
      */
-    boolean isAvailable(ResourcePath resource);
+    boolean isAvailable(Resource resource);
 
     /**
      * Returns a collection of the resources allocated to the specified consumer.
@@ -100,7 +100,7 @@
      * @param consumer resource consumer whose allocated resource are searched for
      * @return a collection of the resources allocated to the specified consumer
      */
-    Collection<ResourcePath> getResources(ResourceConsumer consumer);
+    Collection<Resource> getResources(ResourceConsumer consumer);
 
     /**
      * Returns a collection of the child resources of the specified parent.
@@ -108,7 +108,7 @@
      * @param parent parent of the resource to be returned
      * @return a collection of the child resources of the specified resource
      */
-    Collection<ResourcePath> getChildResources(ResourcePath parent);
+    Collection<Resource> getChildResources(Resource parent);
 
     /**
      * Returns a collection of the resources which are children of the specified parent and
@@ -120,5 +120,5 @@
      * @return a collection of the resources which belongs to the specified subject and
      * whose type is the specified class.
      */
-    <T> Collection<ResourcePath> getAllocatedResources(ResourcePath parent, Class<T> cls);
+    <T> Collection<Resource> getAllocatedResources(Resource parent, Class<T> cls);
 }
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourceAllocationTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourceAllocationTest.java
index d21c4b1..a9a8ed2 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourceAllocationTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourceAllocationTest.java
@@ -32,9 +32,9 @@
 
     @Test
     public void testEquals() {
-        ResourceAllocation alloc1 = new ResourceAllocation(ResourcePath.discrete(D1, P1, VLAN1), IID1);
-        ResourceAllocation sameAsAlloc1 = new ResourceAllocation(ResourcePath.discrete(D1, P1, VLAN1), IID1);
-        ResourceAllocation alloc2 = new ResourceAllocation(ResourcePath.discrete(D2, P1, VLAN1), IID1);
+        ResourceAllocation alloc1 = new ResourceAllocation(Resource.discrete(D1, P1, VLAN1), IID1);
+        ResourceAllocation sameAsAlloc1 = new ResourceAllocation(Resource.discrete(D1, P1, VLAN1), IID1);
+        ResourceAllocation alloc2 = new ResourceAllocation(Resource.discrete(D2, P1, VLAN1), IID1);
 
         new EqualsTester()
                 .addEqualityGroup(alloc1, sameAsAlloc1)
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
similarity index 62%
rename from core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
rename to core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
index ea7ff5e..dd4432d 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
@@ -28,7 +28,7 @@
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
 
-public class ResourcePathTest {
+public class ResourceTest {
 
     private static final DeviceId D1 = DeviceId.deviceId("of:001");
     private static final DeviceId D2 = DeviceId.deviceId("of:002");
@@ -39,11 +39,11 @@
 
     @Test
     public void testEquals() {
-        ResourcePath resource1 = ResourcePath.discrete(D1, P1, VLAN1);
-        ResourcePath sameAsResource1 = ResourcePath.discrete(D1, P1, VLAN1);
-        ResourcePath resource2 = ResourcePath.discrete(D2, P1, VLAN1);
-        ResourcePath resource3 = ResourcePath.continuous(BW1.bps(), D1, P1, BW1);
-        ResourcePath sameAsResource3 = ResourcePath.continuous(BW1.bps(), D1, P1, BW1);
+        Resource resource1 = Resource.discrete(D1, P1, VLAN1);
+        Resource sameAsResource1 = Resource.discrete(D1, P1, VLAN1);
+        Resource resource2 = Resource.discrete(D2, P1, VLAN1);
+        Resource resource3 = Resource.continuous(BW1.bps(), D1, P1, BW1);
+        Resource sameAsResource3 = Resource.continuous(BW1.bps(), D1, P1, BW1);
 
         new EqualsTester()
                 .addEqualityGroup(resource1, sameAsResource1)
@@ -54,19 +54,19 @@
 
     @Test
     public void testComponents() {
-        ResourcePath port = ResourcePath.discrete(D1, P1);
+        Resource port = Resource.discrete(D1, P1);
 
         assertThat(port.components(), contains(D1, P1));
     }
 
     @Test
     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();
+        ResourceId id1 = Resource.discrete(D1, P1, VLAN1).id();
+        ResourceId sameAsId1 = Resource.discrete(D1, P1, VLAN1).id();
+        ResourceId id2 = Resource.discrete(D2, P1, VLAN1).id();
+        ResourceId id3 = Resource.continuous(BW1.bps(), D1, P1, BW1).id();
         // intentionally set a different value
-        ResourceId sameAsId3 = ResourcePath.continuous(BW2.bps(), D1, P1, BW1).id();
+        ResourceId sameAsId3 = Resource.continuous(BW2.bps(), D1, P1, BW1).id();
 
         new EqualsTester()
                 .addEqualityGroup(id1, sameAsId1)
@@ -76,32 +76,32 @@
 
     @Test
     public void testChild() {
-        ResourcePath r1 = ResourcePath.discrete(D1).child(P1);
-        ResourcePath sameAsR2 = ResourcePath.discrete(D1, P1);
+        Resource r1 = Resource.discrete(D1).child(P1);
+        Resource sameAsR2 = Resource.discrete(D1, P1);
 
         assertThat(r1, is(sameAsR2));
     }
 
     @Test
     public void testThereIsParent() {
-        ResourcePath path = ResourcePath.discrete(D1, P1, VLAN1);
-        ResourcePath parent = ResourcePath.discrete(D1, P1);
+        Resource resource = Resource.discrete(D1, P1, VLAN1);
+        Resource parent = Resource.discrete(D1, P1);
 
-        assertThat(path.parent(), is(Optional.of(parent)));
+        assertThat(resource.parent(), is(Optional.of(parent)));
     }
 
     @Test
     public void testNoParent() {
-        ResourcePath path = ResourcePath.discrete(D1);
+        Resource resource = Resource.discrete(D1);
 
-        assertThat(path.parent(), is(Optional.of(ResourcePath.ROOT)));
+        assertThat(resource.parent(), is(Optional.of(Resource.ROOT)));
     }
 
     @Test
     public void testBase() {
-        ResourcePath path = ResourcePath.discrete(D1);
+        Resource resource = Resource.discrete(D1);
 
-        DeviceId child = (DeviceId) path.last();
+        DeviceId child = (DeviceId) resource.last();
         assertThat(child, is(D1));
     }
 }
