diff --git a/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java b/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
index 353ab3a..869868f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
@@ -31,7 +31,7 @@
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.newresource.ResourceAllocation;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
 
 import com.google.common.base.Strings;
@@ -106,11 +106,11 @@
         // TODO: Current design cannot deal with sub-resources
         //        (e.g., TX/RX under Port)
 
-        ResourcePath path = ResourcePath.discrete(did, num);
+        Resource resource = Resource.discrete(did, num);
         if (lambda) {
             //print("Lambda resources:");
             Collection<ResourceAllocation> allocations
-                = resourceService.getResourceAllocations(path, OchSignal.class);
+                = resourceService.getResourceAllocations(resource, OchSignal.class);
 
             for (ResourceAllocation a : allocations) {
                 print("%s%s allocated by %s", Strings.repeat(" ", level + 1),
diff --git a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
index b70723e..6c74848 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
@@ -29,7 +29,7 @@
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
 
 import com.google.common.base.Strings;
@@ -76,20 +76,20 @@
             DeviceId deviceId = deviceId(deviceIdStr);
             PortNumber portNumber = PortNumber.fromString(portNumberStr);
 
-            printResource(ResourcePath.discrete(deviceId, portNumber), 0);
+            printResource(Resource.discrete(deviceId, portNumber), 0);
         } else if (deviceIdStr != null) {
             DeviceId deviceId = deviceId(deviceIdStr);
 
-            printResource(ResourcePath.discrete(deviceId), 0);
+            printResource(Resource.discrete(deviceId), 0);
         } else {
-            printResource(ResourcePath.ROOT, 0);
+            printResource(Resource.ROOT, 0);
         }
     }
 
-    private void printResource(ResourcePath resource, int level) {
-        Collection<ResourcePath> children = resourceService.getAvailableResources(resource);
+    private void printResource(Resource resource, int level) {
+        Collection<Resource> children = resourceService.getAvailableResources(resource);
 
-        if (resource.equals(ResourcePath.ROOT)) {
+        if (resource.equals(Resource.ROOT)) {
             print("ROOT");
         } else {
             String resourceName = resource.last().getClass().getSimpleName();
diff --git a/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java b/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
index 843361f..35d9a4c 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.cli.net;
 
-import static org.onosproject.net.newresource.ResourcePath.discrete;
+import static org.onosproject.net.newresource.Resource.discrete;
 
 import java.util.Optional;
 
@@ -31,7 +31,7 @@
 import org.onosproject.net.intent.IntentId;
 import org.onosproject.net.newresource.ResourceAllocation;
 import org.onosproject.net.newresource.ResourceConsumer;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
 
 /**
@@ -73,7 +73,7 @@
 
         ResourceConsumer consumer = IntentId.valueOf(nIntendId);
 
-        ResourcePath resource = discrete(did, portNum,
+        Resource resource = discrete(did, portNum,
                                          createLambda(Integer.parseInt(lambda)));
 
         Optional<ResourceAllocation> allocate = resourceService.allocate(consumer, resource);
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));
     }
 }
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java
index 5549918..a9bf1b7 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java
@@ -49,7 +49,7 @@
 import org.onosproject.net.intent.IntentCompiler;
 import org.onosproject.net.intent.IntentExtensionService;
 import org.onosproject.net.intent.MplsPathIntent;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
 import org.onosproject.net.resource.link.LinkResourceAllocations;
 import org.slf4j.Logger;
@@ -123,10 +123,10 @@
 
         // for short term solution: same label is used for both directions
         // TODO: introduce the concept of Tx and Rx resources of a port
-        Set<ResourcePath> resources = labels.entrySet().stream()
+        Set<Resource> resources = labels.entrySet().stream()
                 .flatMap(x -> Stream.of(
-                        ResourcePath.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue()),
-                        ResourcePath.discrete(x.getKey().dst().deviceId(), x.getKey().dst().port(), x.getValue())
+                        Resource.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue()),
+                        Resource.discrete(x.getKey().dst().deviceId(), x.getKey().dst().port(), x.getValue())
                 ))
                 .collect(Collectors.toSet());
         List<org.onosproject.net.newresource.ResourceAllocation> allocations =
@@ -154,7 +154,7 @@
     }
 
     private Set<MplsLabel> findMplsLabel(ConnectPoint cp) {
-        return resourceService.getAvailableResources(ResourcePath.discrete(cp.deviceId(), cp.port())).stream()
+        return resourceService.getAvailableResources(Resource.discrete(cp.deviceId(), cp.port())).stream()
                 .filter(x -> x.last() instanceof MplsLabel)
                 .map(x -> (MplsLabel) x.last())
                 .collect(Collectors.toSet());
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java
index 2c547ea..9bcd7a9 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java
@@ -50,7 +50,7 @@
 import org.onosproject.net.intent.OpticalConnectivityIntent;
 import org.onosproject.net.intent.impl.IntentCompilationException;
 import org.onosproject.net.newresource.ResourceAllocation;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
 import org.onosproject.net.resource.device.IntentSetMultimap;
 import org.onosproject.net.resource.link.LinkResourceAllocations;
@@ -160,9 +160,9 @@
         log.debug("Compiling optical circuit intent between {} and {}", src, dst);
 
         // Reserve OduClt ports
-        ResourcePath srcPortPath = ResourcePath.discrete(src.deviceId(), src.port());
-        ResourcePath dstPortPath = ResourcePath.discrete(dst.deviceId(), dst.port());
-        List<ResourceAllocation> allocation = resourceService.allocate(intent.id(), srcPortPath, dstPortPath);
+        Resource srcPortResource = Resource.discrete(src.deviceId(), src.port());
+        Resource dstPortResource = Resource.discrete(dst.deviceId(), dst.port());
+        List<ResourceAllocation> allocation = resourceService.allocate(intent.id(), srcPortResource, dstPortResource);
         if (allocation.isEmpty()) {
             throw new IntentCompilationException("Unable to reserve ports for intent " + intent);
         }
@@ -312,7 +312,7 @@
         if (ochCP != null) {
             OchPort ochPort = (OchPort) deviceService.getPort(ochCP.deviceId(), ochCP.port());
             Optional<IntentId> intentId =
-                    resourceService.getResourceAllocation(ResourcePath.discrete(ochCP.deviceId(), ochCP.port()))
+                    resourceService.getResourceAllocation(Resource.discrete(ochCP.deviceId(), ochCP.port()))
                             .stream()
                             .map(ResourceAllocation::consumer)
                             .filter(x -> x instanceof IntentId)
@@ -333,7 +333,7 @@
             }
 
             Optional<IntentId> intentId =
-                    resourceService.getResourceAllocation(ResourcePath.discrete(oduPort.deviceId(), port.number()))
+                    resourceService.getResourceAllocation(Resource.discrete(oduPort.deviceId(), port.number()))
                             .stream()
                             .map(ResourceAllocation::consumer)
                             .filter(x -> x instanceof IntentId)
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
index 2d4545c..44d0894 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
@@ -44,7 +44,7 @@
 import org.onosproject.net.intent.OpticalPathIntent;
 import org.onosproject.net.intent.impl.IntentCompilationException;
 import org.onosproject.net.newresource.ResourceAllocation;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
 import org.onosproject.net.resource.link.LinkResourceAllocations;
 import org.onosproject.net.topology.LinkWeight;
@@ -109,10 +109,10 @@
         log.debug("Compiling optical connectivity intent between {} and {}", src, dst);
 
         // Reserve OCh ports
-        ResourcePath srcPortPath = ResourcePath.discrete(src.deviceId(), src.port());
-        ResourcePath dstPortPath = ResourcePath.discrete(dst.deviceId(), dst.port());
+        Resource srcPortResource = Resource.discrete(src.deviceId(), src.port());
+        Resource dstPortResource = Resource.discrete(dst.deviceId(), dst.port());
         List<org.onosproject.net.newresource.ResourceAllocation> allocation =
-                resourceService.allocate(intent.id(), srcPortPath, dstPortPath);
+                resourceService.allocate(intent.id(), srcPortResource, dstPortResource);
         if (allocation.isEmpty()) {
             throw new IntentCompilationException("Unable to reserve ports for intent " + intent);
         }
@@ -182,10 +182,10 @@
         }
 
         List<OchSignal> minLambda = findFirstLambda(lambdas, slotCount());
-        List<ResourcePath> lambdaResources = path.links().stream()
+        List<Resource> lambdaResources = path.links().stream()
                 .flatMap(x -> Stream.of(
-                        ResourcePath.discrete(x.src().deviceId(), x.src().port()),
-                        ResourcePath.discrete(x.dst().deviceId(), x.dst().port())
+                        Resource.discrete(x.src().deviceId(), x.src().port()),
+                        Resource.discrete(x.dst().deviceId(), x.dst().port())
                 ))
                 .flatMap(x -> minLambda.stream().map(l -> x.child(l)))
                 .collect(Collectors.toList());
@@ -214,8 +214,8 @@
     private Set<OchSignal> findCommonLambdasOverLinks(List<Link> links) {
         return links.stream()
                 .flatMap(x -> Stream.of(
-                        ResourcePath.discrete(x.src().deviceId(), x.src().port()),
-                        ResourcePath.discrete(x.dst().deviceId(), x.dst().port())
+                        Resource.discrete(x.src().deviceId(), x.src().port()),
+                        Resource.discrete(x.dst().deviceId(), x.dst().port())
                 ))
                 .map(resourceService::getAvailableResources)
                 .map(x -> Iterables.filter(x, r -> r.last() instanceof OchSignal))
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
index ffced6c..ec7cfd7 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
@@ -44,7 +44,7 @@
 import org.onosproject.net.intent.PathIntent;
 import org.onosproject.net.intent.constraint.EncapsulationConstraint;
 import org.onosproject.net.intent.impl.IntentCompilationException;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
 import org.onosproject.net.resource.link.LinkResourceAllocations;
 import org.slf4j.Logger;
@@ -250,10 +250,10 @@
         }
 
         //same VLANID is used for both directions
-        Set<ResourcePath> resources = vlanIds.entrySet().stream()
+        Set<Resource> resources = vlanIds.entrySet().stream()
                 .flatMap(x -> Stream.of(
-                        ResourcePath.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue()),
-                        ResourcePath.discrete(x.getKey().dst().deviceId(), x.getKey().dst().port(), x.getValue())
+                        Resource.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue()),
+                        Resource.discrete(x.getKey().dst().deviceId(), x.getKey().dst().port(), x.getValue())
                 ))
                 .collect(Collectors.toSet());
         List<org.onosproject.net.newresource.ResourceAllocation> allocations =
@@ -280,7 +280,7 @@
     }
 
     private Set<VlanId> findVlanId(ConnectPoint cp) {
-        return resourceService.getAvailableResources(ResourcePath.discrete(cp.deviceId(), cp.port())).stream()
+        return resourceService.getAvailableResources(Resource.discrete(cp.deviceId(), cp.port())).stream()
                 .filter(x -> x.last() instanceof VlanId)
                 .map(x -> (VlanId) x.last())
                 .collect(Collectors.toSet());
diff --git a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
index b9b11dc..0b793a9 100644
--- a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
+++ b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
@@ -35,7 +35,7 @@
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.newresource.ResourceAdminService;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -108,15 +108,15 @@
     }
 
     private void registerDeviceResource(Device device) {
-        executor.submit(() -> adminService.registerResources(ResourcePath.discrete(device.id())));
+        executor.submit(() -> adminService.registerResources(Resource.discrete(device.id())));
     }
 
     private void unregisterDeviceResource(Device device) {
-        executor.submit(() -> adminService.unregisterResources(ResourcePath.discrete(device.id())));
+        executor.submit(() -> adminService.unregisterResources(Resource.discrete(device.id())));
     }
 
     private void registerPortResource(Device device, Port port) {
-        ResourcePath portPath = ResourcePath.discrete(device.id(), port.number());
+        Resource portPath = Resource.discrete(device.id(), port.number());
         executor.submit(() -> {
             adminService.registerResources(portPath);
 
@@ -155,7 +155,7 @@
     }
 
     private void unregisterPortResource(Device device, Port port) {
-        ResourcePath resource = ResourcePath.discrete(device.id(), port.number());
+        Resource resource = Resource.discrete(device.id(), port.number());
         executor.submit(() -> adminService.unregisterResources(resource));
     }
 
diff --git a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceManager.java b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceManager.java
index eaf4b59..96466d5 100644
--- a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceManager.java
+++ b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceManager.java
@@ -31,7 +31,7 @@
 import org.onosproject.net.newresource.ResourceEvent;
 import org.onosproject.net.newresource.ResourceListener;
 import org.onosproject.net.newresource.ResourceService;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceStore;
 import org.onosproject.net.newresource.ResourceStoreDelegate;
 
@@ -69,7 +69,7 @@
 
     @Override
     public List<ResourceAllocation> allocate(ResourceConsumer consumer,
-                                             List<ResourcePath> resources) {
+                                             List<Resource> resources) {
         checkNotNull(consumer);
         checkNotNull(resources);
 
@@ -87,7 +87,7 @@
     public boolean release(List<ResourceAllocation> allocations) {
         checkNotNull(allocations);
 
-        List<ResourcePath> resources = allocations.stream()
+        List<Resource> resources = allocations.stream()
                 .map(ResourceAllocation::resource)
                 .collect(Collectors.toList());
         List<ResourceConsumer> consumers = allocations.stream()
@@ -106,7 +106,7 @@
     }
 
     @Override
-    public List<ResourceAllocation> getResourceAllocation(ResourcePath resource) {
+    public List<ResourceAllocation> getResourceAllocation(Resource resource) {
         checkNotNull(resource);
 
         List<ResourceConsumer> consumers = store.getConsumers(resource);
@@ -116,12 +116,12 @@
     }
 
     @Override
-    public <T> Collection<ResourceAllocation> getResourceAllocations(ResourcePath parent, Class<T> cls) {
+    public <T> Collection<ResourceAllocation> getResourceAllocations(Resource parent, Class<T> cls) {
         checkNotNull(parent);
         checkNotNull(cls);
 
         // We access store twice in this method, then the store may be updated by others
-        Collection<ResourcePath> resources = store.getAllocatedResources(parent, cls);
+        Collection<Resource> resources = store.getAllocatedResources(parent, cls);
         return resources.stream()
                 .flatMap(resource -> store.getConsumers(resource).stream()
                         .map(consumer -> new ResourceAllocation(resource, consumer)))
@@ -132,17 +132,17 @@
     public Collection<ResourceAllocation> getResourceAllocations(ResourceConsumer consumer) {
         checkNotNull(consumer);
 
-        Collection<ResourcePath> resources = store.getResources(consumer);
+        Collection<Resource> resources = store.getResources(consumer);
         return resources.stream()
                 .map(x -> new ResourceAllocation(x, consumer))
                 .collect(Collectors.toList());
     }
 
     @Override
-    public Collection<ResourcePath> getAvailableResources(ResourcePath parent) {
+    public Collection<Resource> getAvailableResources(Resource parent) {
         checkNotNull(parent);
 
-        Collection<ResourcePath> children = store.getChildResources(parent);
+        Collection<Resource> children = store.getChildResources(parent);
         return children.stream()
                 // We access store twice in this method, then the store may be updated by others
                 .filter(store::isAvailable)
@@ -150,21 +150,21 @@
     }
 
     @Override
-    public boolean isAvailable(ResourcePath resource) {
+    public boolean isAvailable(Resource resource) {
         checkNotNull(resource);
 
         return store.isAvailable(resource);
     }
 
     @Override
-    public boolean registerResources(List<ResourcePath> resources) {
+    public boolean registerResources(List<Resource> resources) {
         checkNotNull(resources);
 
         return store.register(resources);
     }
 
     @Override
-    public boolean unregisterResources(List<ResourcePath> resources) {
+    public boolean unregisterResources(List<Resource> resources) {
         checkNotNull(resources);
 
         return store.unregister(resources);
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/ObjectiveTrackerTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/ObjectiveTrackerTest.java
index 7cee0d0..480e6e4 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/ObjectiveTrackerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/ObjectiveTrackerTest.java
@@ -41,7 +41,7 @@
 import org.onosproject.net.link.LinkEvent;
 import org.onosproject.net.newresource.ResourceEvent;
 import org.onosproject.net.newresource.ResourceListener;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.topology.Topology;
 import org.onosproject.net.topology.TopologyEvent;
 import org.onosproject.net.topology.TopologyListener;
@@ -232,7 +232,7 @@
     @Test
     public void testResourceEvent() throws Exception {
         ResourceEvent event = new ResourceEvent(RESOURCE_ADDED,
-                ResourcePath.discrete(DeviceId.deviceId("a"), PortNumber.portNumber(1)));
+                Resource.discrete(DeviceId.deviceId("a"), PortNumber.portNumber(1)));
         resourceListener.event(event);
 
         assertThat(
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/MockResourceService.java b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/MockResourceService.java
index 866c513..16c3c9b 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/MockResourceService.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/MockResourceService.java
@@ -21,7 +21,7 @@
 import org.onosproject.net.newresource.ResourceAllocation;
 import org.onosproject.net.newresource.ResourceConsumer;
 import org.onosproject.net.newresource.ResourceListener;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
 
 import java.util.Collection;
@@ -34,10 +34,10 @@
 
 class MockResourceService implements ResourceService {
 
-    private final Map<ResourcePath, ResourceConsumer> assignment = new HashMap<>();
+    private final Map<Resource, ResourceConsumer> assignment = new HashMap<>();
 
     @Override
-    public List<ResourceAllocation> allocate(ResourceConsumer consumer, List<ResourcePath> resources) {
+    public List<ResourceAllocation> allocate(ResourceConsumer consumer, List<Resource> resources) {
         assignment.putAll(
                 resources.stream().collect(Collectors.toMap(x -> x, x -> consumer))
         );
@@ -56,7 +56,7 @@
 
     @Override
     public boolean release(ResourceConsumer consumer) {
-        List<ResourcePath> resources = assignment.entrySet().stream()
+        List<Resource> resources = assignment.entrySet().stream()
                 .filter(x -> x.getValue().equals(consumer))
                 .map(Map.Entry::getKey)
                 .collect(Collectors.toList());
@@ -68,14 +68,14 @@
     }
 
     @Override
-    public List<ResourceAllocation> getResourceAllocation(ResourcePath resource) {
+    public List<ResourceAllocation> getResourceAllocation(Resource resource) {
         return Optional.ofNullable(assignment.get(resource))
                 .map(x -> ImmutableList.of(new ResourceAllocation(resource, x)))
                 .orElse(ImmutableList.of());
     }
 
     @Override
-    public <T> Collection<ResourceAllocation> getResourceAllocations(ResourcePath parent, Class<T> cls) {
+    public <T> Collection<ResourceAllocation> getResourceAllocations(Resource parent, Class<T> cls) {
         return assignment.entrySet().stream()
                 .filter(x -> x.getKey().parent().isPresent())
                 .filter(x -> x.getKey().parent().get().equals(parent))
@@ -92,16 +92,16 @@
     }
 
     @Override
-    public Collection<ResourcePath> getAvailableResources(ResourcePath parent) {
+    public Collection<Resource> getAvailableResources(Resource parent) {
 
-        Collection<ResourcePath> resources = new HashSet<ResourcePath>();
+        Collection<Resource> resources = new HashSet<Resource>();
         resources.add(parent.child(VlanId.vlanId((short) 10)));
         resources.add(parent.child(MplsLabel.mplsLabel(10)));
         return ImmutableList.copyOf(resources);
     }
 
     @Override
-    public boolean isAvailable(ResourcePath resource) {
+    public boolean isAvailable(Resource resource) {
         return true;
     }
 
diff --git a/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java b/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java
index 7339b16..6b1443d 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/newresource/impl/ConsistentResourceStore.java
@@ -29,7 +29,7 @@
 import org.onosproject.net.newresource.ResourceConsumer;
 import org.onosproject.net.newresource.ResourceEvent;
 import org.onosproject.net.newresource.ResourceId;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceStore;
 import org.onosproject.net.newresource.ResourceStoreDelegate;
 import org.onosproject.store.AbstractStore;
@@ -84,13 +84,13 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected StorageService service;
 
-    private ConsistentMap<ResourcePath.Discrete, ResourceConsumer> discreteConsumers;
+    private ConsistentMap<Resource.Discrete, ResourceConsumer> discreteConsumers;
     private ConsistentMap<ResourceId, ContinuousResourceAllocation> continuousConsumers;
-    private ConsistentMap<ResourcePath.Discrete, Set<ResourcePath>> childMap;
+    private ConsistentMap<Resource.Discrete, Set<Resource>> childMap;
 
     @Activate
     public void activate() {
-        discreteConsumers = service.<ResourcePath.Discrete, ResourceConsumer>consistentMapBuilder()
+        discreteConsumers = service.<Resource.Discrete, ResourceConsumer>consistentMapBuilder()
                 .withName(DISCRETE_CONSUMER_MAP)
                 .withSerializer(SERIALIZER)
                 .build();
@@ -98,29 +98,29 @@
                 .withName(CONTINUOUS_CONSUMER_MAP)
                 .withSerializer(SERIALIZER)
                 .build();
-        childMap = service.<ResourcePath.Discrete, Set<ResourcePath>>consistentMapBuilder()
+        childMap = service.<Resource.Discrete, Set<Resource>>consistentMapBuilder()
                 .withName(CHILD_MAP)
                 .withSerializer(SERIALIZER)
                 .build();
 
-        Tools.retryable(() -> childMap.put(ResourcePath.ROOT, new LinkedHashSet<>()),
+        Tools.retryable(() -> childMap.put(Resource.ROOT, new LinkedHashSet<>()),
                         ConsistentMapException.class, MAX_RETRIES, RETRY_DELAY);
         log.info("Started");
     }
 
     @Override
-    public List<ResourceConsumer> getConsumers(ResourcePath resource) {
+    public List<ResourceConsumer> getConsumers(Resource resource) {
         checkNotNull(resource);
-        checkArgument(resource instanceof ResourcePath.Discrete || resource instanceof ResourcePath.Continuous);
+        checkArgument(resource instanceof Resource.Discrete || resource instanceof Resource.Continuous);
 
-        if (resource instanceof ResourcePath.Discrete) {
-            return getConsumer((ResourcePath.Discrete) resource);
+        if (resource instanceof Resource.Discrete) {
+            return getConsumer((Resource.Discrete) resource);
         } else {
-            return getConsumer((ResourcePath.Continuous) resource);
+            return getConsumer((Resource.Continuous) resource);
         }
     }
 
-    private List<ResourceConsumer> getConsumer(ResourcePath.Discrete resource) {
+    private List<ResourceConsumer> getConsumer(Resource.Discrete resource) {
         Versioned<ResourceConsumer> consumer = discreteConsumers.get(resource);
         if (consumer == null) {
             return ImmutableList.of();
@@ -129,7 +129,7 @@
         return ImmutableList.of(consumer.value());
     }
 
-    private List<ResourceConsumer> getConsumer(ResourcePath.Continuous resource) {
+    private List<ResourceConsumer> getConsumer(Resource.Continuous resource) {
         Versioned<ContinuousResourceAllocation> allocations = continuousConsumers.get(resource.id());
         if (allocations == null) {
             return ImmutableList.of();
@@ -142,21 +142,21 @@
     }
 
     @Override
-    public boolean register(List<ResourcePath> resources) {
+    public boolean register(List<Resource> resources) {
         checkNotNull(resources);
 
         TransactionContext tx = service.transactionContextBuilder().build();
         tx.begin();
 
-        TransactionalMap<ResourcePath.Discrete, Set<ResourcePath>> childTxMap =
+        TransactionalMap<Resource.Discrete, Set<Resource>> childTxMap =
                 tx.getTransactionalMap(CHILD_MAP, SERIALIZER);
 
-        Map<ResourcePath.Discrete, List<ResourcePath>> resourceMap = resources.stream()
+        Map<Resource.Discrete, List<Resource>> resourceMap = resources.stream()
                 .filter(x -> x.parent().isPresent())
                 .collect(Collectors.groupingBy(x -> x.parent().get()));
 
-        for (Map.Entry<ResourcePath.Discrete, List<ResourcePath>> entry: resourceMap.entrySet()) {
-            Optional<ResourcePath.Discrete> child = lookup(childTxMap, entry.getKey());
+        for (Map.Entry<Resource.Discrete, List<Resource>> entry: resourceMap.entrySet()) {
+            Optional<Resource.Discrete> child = lookup(childTxMap, entry.getKey());
             if (!child.isPresent()) {
                 return abortTransaction(tx);
             }
@@ -178,31 +178,31 @@
     }
 
     @Override
-    public boolean unregister(List<ResourcePath> resources) {
+    public boolean unregister(List<Resource> resources) {
         checkNotNull(resources);
 
         TransactionContext tx = service.transactionContextBuilder().build();
         tx.begin();
 
-        TransactionalMap<ResourcePath.Discrete, Set<ResourcePath>> childTxMap =
+        TransactionalMap<Resource.Discrete, Set<Resource>> childTxMap =
                 tx.getTransactionalMap(CHILD_MAP, SERIALIZER);
-        TransactionalMap<ResourcePath.Discrete, ResourceConsumer> discreteConsumerTxMap =
+        TransactionalMap<Resource.Discrete, ResourceConsumer> discreteConsumerTxMap =
                 tx.getTransactionalMap(DISCRETE_CONSUMER_MAP, SERIALIZER);
         TransactionalMap<ResourceId, ContinuousResourceAllocation> continuousConsumerTxMap =
                 tx.getTransactionalMap(CONTINUOUS_CONSUMER_MAP, SERIALIZER);
 
         // Extract Discrete instances from resources
-        Map<ResourcePath.Discrete, List<ResourcePath>> resourceMap = resources.stream()
+        Map<Resource.Discrete, List<Resource>> resourceMap = resources.stream()
                 .filter(x -> x.parent().isPresent())
                 .collect(Collectors.groupingBy(x -> x.parent().get()));
 
         // even if one of the resources is allocated to a consumer,
         // all unregistrations are regarded as failure
-        for (Map.Entry<ResourcePath.Discrete, List<ResourcePath>> entry: resourceMap.entrySet()) {
+        for (Map.Entry<Resource.Discrete, List<Resource>> entry: resourceMap.entrySet()) {
             boolean allocated = entry.getValue().stream().anyMatch(x -> {
-                if (x instanceof ResourcePath.Discrete) {
-                    return discreteConsumerTxMap.get((ResourcePath.Discrete) x) != null;
-                } else if (x instanceof ResourcePath.Continuous) {
+                if (x instanceof Resource.Discrete) {
+                    return discreteConsumerTxMap.get((Resource.Discrete) x) != null;
+                } else if (x instanceof Resource.Continuous) {
                     ContinuousResourceAllocation allocations = continuousConsumerTxMap.get(x.id());
                     return allocations != null && !allocations.allocations().isEmpty();
                 } else {
@@ -230,38 +230,38 @@
     }
 
     @Override
-    public boolean allocate(List<ResourcePath> resources, ResourceConsumer consumer) {
+    public boolean allocate(List<Resource> resources, ResourceConsumer consumer) {
         checkNotNull(resources);
         checkNotNull(consumer);
 
         TransactionContext tx = service.transactionContextBuilder().build();
         tx.begin();
 
-        TransactionalMap<ResourcePath.Discrete, Set<ResourcePath>> childTxMap =
+        TransactionalMap<Resource.Discrete, Set<Resource>> childTxMap =
                 tx.getTransactionalMap(CHILD_MAP, SERIALIZER);
-        TransactionalMap<ResourcePath.Discrete, ResourceConsumer> discreteConsumerTxMap =
+        TransactionalMap<Resource.Discrete, ResourceConsumer> discreteConsumerTxMap =
                 tx.getTransactionalMap(DISCRETE_CONSUMER_MAP, SERIALIZER);
         TransactionalMap<ResourceId, ContinuousResourceAllocation> continuousConsumerTxMap =
                 tx.getTransactionalMap(CONTINUOUS_CONSUMER_MAP, SERIALIZER);
 
-        for (ResourcePath resource: resources) {
-            if (resource instanceof ResourcePath.Discrete) {
+        for (Resource resource: resources) {
+            if (resource instanceof Resource.Discrete) {
                 if (!lookup(childTxMap, resource).isPresent()) {
                     return abortTransaction(tx);
                 }
 
-                ResourceConsumer oldValue = discreteConsumerTxMap.put((ResourcePath.Discrete) resource, consumer);
+                ResourceConsumer oldValue = discreteConsumerTxMap.put((Resource.Discrete) resource, consumer);
                 if (oldValue != null) {
                     return abortTransaction(tx);
                 }
-            } else if (resource instanceof ResourcePath.Continuous) {
-                Optional<ResourcePath.Continuous> continuous = lookup(childTxMap, (ResourcePath.Continuous) resource);
+            } else if (resource instanceof Resource.Continuous) {
+                Optional<Resource.Continuous> continuous = lookup(childTxMap, (Resource.Continuous) resource);
                 if (!continuous.isPresent()) {
                     return abortTransaction(tx);
                 }
 
                 ContinuousResourceAllocation allocations = continuousConsumerTxMap.get(continuous.get().id());
-                if (!hasEnoughResource(continuous.get(), (ResourcePath.Continuous) resource, allocations)) {
+                if (!hasEnoughResource(continuous.get(), (Resource.Continuous) resource, allocations)) {
                     return abortTransaction(tx);
                 }
 
@@ -277,7 +277,7 @@
     }
 
     @Override
-    public boolean release(List<ResourcePath> resources, List<ResourceConsumer> consumers) {
+    public boolean release(List<Resource> resources, List<ResourceConsumer> consumers) {
         checkNotNull(resources);
         checkNotNull(consumers);
         checkArgument(resources.size() == consumers.size());
@@ -285,29 +285,29 @@
         TransactionContext tx = service.transactionContextBuilder().build();
         tx.begin();
 
-        TransactionalMap<ResourcePath.Discrete, ResourceConsumer> discreteConsumerTxMap =
+        TransactionalMap<Resource.Discrete, ResourceConsumer> discreteConsumerTxMap =
                 tx.getTransactionalMap(DISCRETE_CONSUMER_MAP, SERIALIZER);
         TransactionalMap<ResourceId, ContinuousResourceAllocation> continuousConsumerTxMap =
                 tx.getTransactionalMap(CONTINUOUS_CONSUMER_MAP, SERIALIZER);
-        Iterator<ResourcePath> resourceIte = resources.iterator();
+        Iterator<Resource> resourceIte = resources.iterator();
         Iterator<ResourceConsumer> consumerIte = consumers.iterator();
 
         while (resourceIte.hasNext() && consumerIte.hasNext()) {
-            ResourcePath resource = resourceIte.next();
+            Resource resource = resourceIte.next();
             ResourceConsumer consumer = consumerIte.next();
 
-            if (resource instanceof ResourcePath.Discrete) {
+            if (resource instanceof Resource.Discrete) {
                 // if this single release fails (because the resource is allocated to another consumer,
                 // the whole release fails
-                if (!discreteConsumerTxMap.remove((ResourcePath.Discrete) resource, consumer)) {
+                if (!discreteConsumerTxMap.remove((Resource.Discrete) resource, consumer)) {
                     return abortTransaction(tx);
                 }
-            } else if (resource instanceof ResourcePath.Continuous) {
-                ResourcePath.Continuous continuous = (ResourcePath.Continuous) resource;
+            } else if (resource instanceof Resource.Continuous) {
+                Resource.Continuous continuous = (Resource.Continuous) resource;
                 ContinuousResourceAllocation allocation = continuousConsumerTxMap.get(continuous.id());
                 ImmutableList<ResourceAllocation> newAllocations = allocation.allocations().stream()
                         .filter(x -> !(x.consumer().equals(consumer) &&
-                                ((ResourcePath.Continuous) x.resource()).value() == continuous.value()))
+                                ((Resource.Continuous) x.resource()).value() == continuous.value()))
                         .collect(GuavaCollectors.toImmutableList());
 
                 if (!continuousConsumerTxMap.replace(continuous.id(), allocation,
@@ -321,18 +321,18 @@
     }
 
     @Override
-    public boolean isAvailable(ResourcePath resource) {
+    public boolean isAvailable(Resource resource) {
         checkNotNull(resource);
-        checkArgument(resource instanceof ResourcePath.Discrete || resource instanceof ResourcePath.Continuous);
+        checkArgument(resource instanceof Resource.Discrete || resource instanceof Resource.Continuous);
 
-        if (resource instanceof ResourcePath.Discrete) {
-            return getConsumer((ResourcePath.Discrete) resource).isEmpty();
+        if (resource instanceof Resource.Discrete) {
+            return getConsumer((Resource.Discrete) resource).isEmpty();
         } else {
-            return isAvailable((ResourcePath.Continuous) resource);
+            return isAvailable((Resource.Continuous) resource);
         }
     }
 
-    private boolean isAvailable(ResourcePath.Continuous resource) {
+    private boolean isAvailable(Resource.Continuous resource) {
         Versioned<ContinuousResourceAllocation> allocation = continuousConsumers.get(resource.id());
         if (allocation == null) {
             return false;
@@ -342,16 +342,16 @@
     }
 
     @Override
-    public Collection<ResourcePath> getResources(ResourceConsumer consumer) {
+    public Collection<Resource> getResources(ResourceConsumer consumer) {
         checkNotNull(consumer);
 
         // NOTE: getting all entries may become performance bottleneck
         // TODO: revisit for better backend data structure
-        Stream<ResourcePath.Discrete> discreteStream = discreteConsumers.entrySet().stream()
+        Stream<Resource.Discrete> discreteStream = discreteConsumers.entrySet().stream()
                 .filter(x -> x.getValue().value().equals(consumer))
                 .map(Map.Entry::getKey);
 
-        Stream<ResourcePath.Continuous> continuousStream = continuousConsumers.values().stream()
+        Stream<Resource.Continuous> continuousStream = continuousConsumers.values().stream()
                 .flatMap(x -> x.value().allocations().stream()
                         .map(y -> Maps.immutableEntry(x.value().original(), y)))
                 .filter(x -> x.getValue().consumer().equals(consumer))
@@ -361,11 +361,11 @@
     }
 
     @Override
-    public Collection<ResourcePath> getChildResources(ResourcePath parent) {
+    public Collection<Resource> getChildResources(Resource parent) {
         checkNotNull(parent);
-        checkArgument(parent instanceof ResourcePath.Discrete);
+        checkArgument(parent instanceof Resource.Discrete);
 
-        Versioned<Set<ResourcePath>> children = childMap.get((ResourcePath.Discrete) parent);
+        Versioned<Set<Resource>> children = childMap.get((Resource.Discrete) parent);
         if (children == null) {
             return Collections.emptyList();
         }
@@ -374,26 +374,26 @@
     }
 
     @Override
-    public <T> Collection<ResourcePath> getAllocatedResources(ResourcePath parent, Class<T> cls) {
+    public <T> Collection<Resource> getAllocatedResources(Resource parent, Class<T> cls) {
         checkNotNull(parent);
         checkNotNull(cls);
-        checkArgument(parent instanceof ResourcePath.Discrete);
+        checkArgument(parent instanceof Resource.Discrete);
 
-        Versioned<Set<ResourcePath>> children = childMap.get((ResourcePath.Discrete) parent);
+        Versioned<Set<Resource>> children = childMap.get((Resource.Discrete) parent);
         if (children == null) {
             return Collections.emptyList();
         }
 
-        Stream<ResourcePath.Discrete> discrete = children.value().stream()
+        Stream<Resource.Discrete> discrete = children.value().stream()
                 .filter(x -> x.last().getClass().equals(cls))
-                .filter(x -> x instanceof ResourcePath.Discrete)
-                .map(x -> (ResourcePath.Discrete) x)
+                .filter(x -> x instanceof Resource.Discrete)
+                .map(x -> (Resource.Discrete) x)
                 .filter(discreteConsumers::containsKey);
 
-        Stream<ResourcePath.Continuous> continuous = children.value().stream()
+        Stream<Resource.Continuous> continuous = children.value().stream()
                 .filter(x -> x.last().getClass().equals(cls))
-                .filter(x -> x instanceof ResourcePath.Continuous)
-                .map(x -> (ResourcePath.Continuous) x)
+                .filter(x -> x instanceof Resource.Continuous)
+                .map(x -> (Resource.Continuous) x)
                 .filter(x -> continuousConsumers.containsKey(x.id()))
                 .filter(x -> continuousConsumers.get(x.id()) != null)
                 .filter(x -> !continuousConsumers.get(x.id()).value().allocations().isEmpty());
@@ -414,7 +414,7 @@
 
     // Appends the specified ResourceAllocation to the existing values stored in the map
     private boolean appendValue(TransactionalMap<ResourceId, ContinuousResourceAllocation> map,
-                                ResourcePath.Continuous original, ResourceAllocation value) {
+                                Resource.Continuous original, ResourceAllocation value) {
         ContinuousResourceAllocation oldValue = map.putIfAbsent(original.id(),
                 new ContinuousResourceAllocation(original, ImmutableList.of(value)));
         if (oldValue == null) {
@@ -496,14 +496,14 @@
      * @return the resource which is regarded as the same as the specified resource
      */
     // Naive implementation, which traverses all elements in the list
-    private <T extends ResourcePath> Optional<T> lookup(
-            TransactionalMap<ResourcePath.Discrete, Set<ResourcePath>> map, T resource) {
+    private <T extends Resource> Optional<T> lookup(
+            TransactionalMap<Resource.Discrete, Set<Resource>> map, T resource) {
         // if it is root, always returns itself
         if (!resource.parent().isPresent()) {
             return Optional.of(resource);
         }
 
-        Set<ResourcePath> values = map.get(resource.parent().get());
+        Set<Resource> values = map.get(resource.parent().get());
         if (values == null) {
             return Optional.empty();
         }
@@ -525,17 +525,17 @@
      * @param allocation current allocation of the resource
      * @return true if there is enough resource volume. Otherwise, false.
      */
-    private boolean hasEnoughResource(ResourcePath.Continuous original,
-                                      ResourcePath.Continuous request,
+    private boolean hasEnoughResource(Resource.Continuous original,
+                                      Resource.Continuous request,
                                       ContinuousResourceAllocation allocation) {
         if (allocation == null) {
             return request.value() <= original.value();
         }
 
         double allocated = allocation.allocations().stream()
-                .filter(x -> x.resource() instanceof ResourcePath.Continuous)
-                .map(x -> (ResourcePath.Continuous) x.resource())
-                .mapToDouble(ResourcePath.Continuous::value)
+                .filter(x -> x.resource() instanceof Resource.Continuous)
+                .map(x -> (Resource.Continuous) x.resource())
+                .mapToDouble(Resource.Continuous::value)
                 .sum();
         double left = original.value() - allocated;
         return request.value() <= left;
@@ -543,16 +543,16 @@
 
     // internal use only
     private static final class ContinuousResourceAllocation {
-        private final ResourcePath.Continuous original;
+        private final Resource.Continuous original;
         private final ImmutableList<ResourceAllocation> allocations;
 
-        private ContinuousResourceAllocation(ResourcePath.Continuous original,
+        private ContinuousResourceAllocation(Resource.Continuous original,
                                              ImmutableList<ResourceAllocation> allocations) {
             this.original = original;
             this.allocations = allocations;
         }
 
-        private ResourcePath.Continuous original() {
+        private Resource.Continuous original() {
             return original;
         }
 
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 c7a236d..44b255e 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
@@ -174,7 +174,7 @@
 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.newresource.Resource;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.DefaultPacketRequest;
 import org.onosproject.net.packet.PacketPriority;
@@ -433,9 +433,9 @@
                     DefaultLinkResourceAllocations.class,
                     BandwidthResourceAllocation.class,
                     LambdaResourceAllocation.class,
-                    ResourcePath.class,
-                    ResourcePath.Discrete.class,
-                    ResourcePath.Continuous.class,
+                    Resource.class,
+                    Resource.Discrete.class,
+                    Resource.Continuous.class,
                     ResourceId.class,
                     ResourceAllocation.class,
                     // Constraints
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 9ee9cd9..a986278 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
@@ -62,7 +62,7 @@
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.flow.FlowRuleBatchEntry;
 import org.onosproject.net.intent.IntentId;
-import org.onosproject.net.newresource.ResourcePath;
+import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.net.resource.link.BandwidthResource;
 import org.onosproject.net.resource.link.BandwidthResourceAllocation;
@@ -374,19 +374,19 @@
     }
 
     @Test
-    public void testResourcePath() {
-        testSerializedEquals(ResourcePath.discrete(DID1, P1, VLAN1));
+    public void testResource() {
+        testSerializedEquals(Resource.discrete(DID1, P1, VLAN1));
     }
 
     @Test
     public void testResourceKey() {
-        testSerializedEquals(ResourcePath.discrete(DID1, P1).id());
+        testSerializedEquals(Resource.discrete(DID1, P1).id());
     }
 
     @Test
     public void testResourceAllocation() {
         testSerializedEquals(new org.onosproject.net.newresource.ResourceAllocation(
-                ResourcePath.discrete(DID1, P1, VLAN1),
+                Resource.discrete(DID1, P1, VLAN1),
                 IntentId.valueOf(30)));
     }
 
