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 715fef0..4a350a9 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
@@ -35,6 +35,7 @@
 import org.onosproject.net.newresource.ResourceService;
 
 import com.google.common.base.Strings;
+import org.onosproject.net.newresource.Resources;
 
 /**
  * Lists allocated resources.
@@ -106,7 +107,7 @@
         // TODO: Current design cannot deal with sub-resources
         //        (e.g., TX/RX under Port)
 
-        Resource resource = Resource.discrete(did, num).resource();
+        Resource resource = Resources.discrete(did, num).resource();
         if (lambda) {
             //print("Lambda resources:");
             Collection<ResourceAllocation> allocations
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 bf9201b..c64518c 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
@@ -46,6 +46,7 @@
 import com.google.common.collect.Range;
 import com.google.common.collect.RangeSet;
 import com.google.common.collect.TreeRangeSet;
+import org.onosproject.net.newresource.Resources;
 
 /**
  * Lists available resources.
@@ -89,11 +90,11 @@
             DeviceId deviceId = deviceId(deviceIdStr);
             PortNumber portNumber = PortNumber.fromString(portNumberStr);
 
-            printResource(Resource.discrete(deviceId, portNumber).resource(), 0);
+            printResource(Resources.discrete(deviceId, portNumber).resource(), 0);
         } else if (deviceIdStr != null) {
             DeviceId deviceId = deviceId(deviceIdStr);
 
-            printResource(Resource.discrete(deviceId).resource(), 0);
+            printResource(Resources.discrete(deviceId).resource(), 0);
         } else {
             printResource(Resource.ROOT, 0);
         }
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 8e72843..984987f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
@@ -15,8 +15,6 @@
  */
 package org.onosproject.cli.net;
 
-import static org.onosproject.net.newresource.Resource.discrete;
-
 import java.util.Optional;
 
 import org.apache.karaf.shell.commands.Argument;
@@ -33,6 +31,7 @@
 import org.onosproject.net.newresource.ResourceConsumer;
 import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
+import org.onosproject.net.newresource.Resources;
 
 /**
  * Test tool to allocate resources.
@@ -73,8 +72,8 @@
 
         ResourceConsumer consumer = IntentId.valueOf(nIntendId);
 
-        Resource resource = discrete(did, portNum,
-                                         createLambda(Integer.parseInt(lambda))).resource();
+        Resource resource = Resources.discrete(did, portNum,
+                createLambda(Integer.parseInt(lambda))).resource();
 
         Optional<ResourceAllocation> allocate = resourceService.allocate(consumer, resource);
         if (allocate.isPresent()) {
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
index f5301f7..431fcd8 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
@@ -98,7 +98,7 @@
 
     @Override
     public Optional<DiscreteResource> parent() {
-        return id.parent().map(x -> Resource.discrete(x).resource());
+        return id.parent().map(x -> Resources.discrete(x).resource());
     }
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
index f1876d5..4ed281c 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
@@ -80,17 +80,17 @@
     public DiscreteResource child(Object child) {
         checkArgument(!(child instanceof Class<?>));
 
-        return Resource.discrete(id.child(child)).resource();
+        return Resources.discrete(id.child(child)).resource();
     }
 
     @Override
     public ContinuousResource child(Class<?> child, double value) {
-        return Resource.continuous(id.child(child)).resource(value);
+        return Resources.continuous(id.child(child)).resource(value);
     }
 
     @Override
     public Optional<DiscreteResource> parent() {
-        return id.parent().map(x -> Resource.discrete(x).resource());
+        return id.parent().map(x -> Resources.discrete(x).resource());
     }
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
index 804dfba..4b83344 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
@@ -50,14 +50,14 @@
     public DiscreteResourceId child(Object child) {
         checkArgument(!(child instanceof Class<?>));
 
-        return Resource.discrete(this, child).id();
+        return Resources.discrete(this, child).id();
     }
 
     @Override
     public ContinuousResourceId child(Class<?> child) {
         checkNotNull(child);
 
-        return Resource.continuous(this, child).id();
+        return Resources.continuous(this, child).id();
     }
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/Resource.java b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
index 749d87e..c402b42 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
@@ -16,17 +16,10 @@
 package org.onosproject.net.newresource;
 
 import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
 /**
  * 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
@@ -106,189 +99,4 @@
      * @return the ID of this resource path
      */
     ResourceId id();
-
-    /**
-     * Create a factory for discrete-type with the specified resource ID.
-     *
-     * @param id resource ID
-     * @return {@link DiscreteFactory}
-     */
-    static DiscreteFactory discrete(DiscreteResourceId id) {
-        checkNotNull(id);
-
-        return new DiscreteFactory(id);
-    }
-
-    /**
-     * Creates a factory for discrete-type with the specified parent ID and child.
-     *
-     * @param parent ID of the parent
-     * @param child child
-     * @return {@link DiscreteFactory}
-     */
-    static DiscreteFactory discrete(DiscreteResourceId parent, Object child) {
-        checkNotNull(parent);
-        checkNotNull(child);
-        checkArgument(!(child instanceof Class<?>));
-
-        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
-                .addAll(parent.components())
-                .add(child)
-                .build()));
-    }
-
-    /**
-     * Create a factory for discrete-type with the specified device ID.
-     *
-     * @param device device ID
-     * @return {@link DiscreteFactory}
-     */
-    static DiscreteFactory discrete(DeviceId device) {
-        checkNotNull(device);
-
-        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.of(device)));
-    }
-
-    /**
-     * Create a factory for discrete-type with the specified device ID and components.
-     *
-     * @param device device ID
-     * @param components resource ID components other than the device ID
-     * @return {@link DiscreteFactory}
-     */
-    static DiscreteFactory discrete(DeviceId device, Object... components) {
-        checkNotNull(device);
-        checkNotNull(components);
-
-        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
-                .add(device)
-                .add(components)
-                .build()));
-    }
-
-    /**
-     * Create a factory for discrete-type with the specified device ID, port number and components.
-     *
-     * @param device device ID
-     * @param port port number
-     * @param components resource ID components other than the device ID and port number
-     * @return {@link DiscreteFactory}
-     */
-    static DiscreteFactory discrete(DeviceId device, PortNumber port, Object... components) {
-        checkNotNull(device);
-        checkNotNull(port);
-        checkNotNull(components);
-
-        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
-                .add(device)
-                .add(port)
-                .add(components)
-                .build()));
-    }
-
-    /**
-     * Create a factory for continuous-type with the specified resource ID.
-     *
-     * @param id resource ID
-     * @return {@link ContinuousFactory}
-     */
-    static ContinuousFactory continuous(ContinuousResourceId id) {
-        checkNotNull(id);
-
-        return new ContinuousFactory(id);
-    }
-
-    /**
-     * Creates a factory for continuous-type wit the specified parent ID and child.
-     *
-     * @param parent ID of the parent
-     * @param child child
-     * @return {@link ContinuousFactory}
-     */
-    static ContinuousFactory continuous(DiscreteResourceId parent, Class<?> child) {
-        checkNotNull(parent);
-        checkNotNull(child);
-
-        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
-                .addAll(parent.components()), child));
-    }
-
-    /**
-     * Create a factory for continuous-type with the specified device ID and type.
-     *
-     * @param device device ID
-     * @param cls type of resource the returned factory will create
-     * @return {@link ContinuousFactory}
-     */
-    static ContinuousFactory continuous(DeviceId device, Class<?> cls) {
-        checkNotNull(device);
-        checkNotNull(cls);
-
-        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder().add(device), cls));
-    }
-
-    /**
-     * Create a factory for continuous-type with the specified device ID and components.
-     * The last element of the components must be a {@link Class} instance. Otherwise,
-     * an {@link IllegalArgumentException} is thrown.
-     *
-     * @param device device ID
-     * @param components resource ID components other than the device ID.
-     * @return {@link ContinuousFactory}
-     */
-    static ContinuousFactory continuous(DeviceId device, Object... components) {
-        checkNotNull(device);
-        checkNotNull(components);
-        checkArgument(components.length > 1);
-
-        Object last = components[components.length - 1];
-        checkArgument(last instanceof Class<?>);
-
-        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
-                .add(device)
-                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last));
-    }
-
-    /**
-     * Create a factory for continuous-type with the specified device ID, port number and type.
-     *
-     * @param device device ID
-     * @param port port number
-     * @param cls type of resource the returned factory will create
-     * @return {@link ContinuousFactory}
-     */
-    static ContinuousFactory continuous(DeviceId device, PortNumber port, Class<?> cls) {
-        checkNotNull(device);
-        checkNotNull(port);
-        checkNotNull(cls);
-
-        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
-                .add(device)
-                .add(port), cls));
-    }
-
-    /**
-     * Create a factory for continuous-type with the specified device ID and components.
-     * The last element of the components must be a {@link Class} instance. Otherwise,
-     * an {@link IllegalArgumentException} is thrown.
-     *
-     * @param device device ID
-     * @param port port number
-     * @param components resource ID components other than the device ID and port number.
-     * @return {@link ContinuousFactory}
-     */
-    static ContinuousFactory continuous(DeviceId device, PortNumber port, Object... components) {
-        checkNotNull(device);
-        checkNotNull(port);
-        checkNotNull(components);
-        checkArgument(components.length > 1);
-
-        Object last = components[components.length - 1];
-        checkArgument(last instanceof Class<?>);
-
-        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
-                .add(device)
-                .add(port)
-                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last));
-    }
 }
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/Resources.java b/core/api/src/main/java/org/onosproject/net/newresource/Resources.java
new file mode 100644
index 0000000..13b226e
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/newresource/Resources.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.newresource;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+import java.util.Arrays;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Utility class for resource related classes.
+ */
+@Beta
+public final class Resources {
+    // public construction is prohibited
+    private Resources() {}
+
+    /**
+     * Create a factory for discrete-type with the specified resource ID.
+     *
+     * @param id resource ID
+     * @return {@link DiscreteFactory}
+     */
+    public static DiscreteFactory discrete(DiscreteResourceId id) {
+        checkNotNull(id);
+
+        return new DiscreteFactory(id);
+    }
+
+    /**
+     * Creates a factory for discrete-type with the specified parent ID and child.
+     *
+     * @param parent ID of the parent
+     * @param child child
+     * @return {@link DiscreteFactory}
+     */
+    public static DiscreteFactory discrete(DiscreteResourceId parent, Object child) {
+        checkNotNull(parent);
+        checkNotNull(child);
+        checkArgument(!(child instanceof Class<?>));
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
+                .addAll(parent.components())
+                .add(child)
+                .build()));
+    }
+
+    /**
+     * Create a factory for discrete-type with the specified device ID.
+     *
+     * @param device device ID
+     * @return {@link DiscreteFactory}
+     */
+    public static DiscreteFactory discrete(DeviceId device) {
+        checkNotNull(device);
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.of(device)));
+    }
+
+    /**
+     * Create a factory for discrete-type with the specified device ID and components.
+     *
+     * @param device device ID
+     * @param components resource ID components other than the device ID
+     * @return {@link DiscreteFactory}
+     */
+    public static DiscreteFactory discrete(DeviceId device, Object... components) {
+        checkNotNull(device);
+        checkNotNull(components);
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
+                .add(device)
+                .add(components)
+                .build()));
+    }
+
+    /**
+     * Create a factory for discrete-type with the specified device ID, port number and components.
+     *
+     * @param device device ID
+     * @param port port number
+     * @param components resource ID components other than the device ID and port number
+     * @return {@link DiscreteFactory}
+     */
+    public static DiscreteFactory discrete(DeviceId device, PortNumber port, Object... components) {
+        checkNotNull(device);
+        checkNotNull(port);
+        checkNotNull(components);
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
+                .add(device)
+                .add(port)
+                .add(components)
+                .build()));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified resource ID.
+     *
+     * @param id resource ID
+     * @return {@link ContinuousFactory}
+     */
+    public static ContinuousFactory continuous(ContinuousResourceId id) {
+        checkNotNull(id);
+
+        return new ContinuousFactory(id);
+    }
+
+    /**
+     * Creates a factory for continuous-type wit the specified parent ID and child.
+     *
+     * @param parent ID of the parent
+     * @param child child
+     * @return {@link ContinuousFactory}
+     */
+    public static ContinuousFactory continuous(DiscreteResourceId parent, Class<?> child) {
+        checkNotNull(parent);
+        checkNotNull(child);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .addAll(parent.components()), child));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID and type.
+     *
+     * @param device device ID
+     * @param cls type of resource the returned factory will create
+     * @return {@link ContinuousFactory}
+     */
+    public static ContinuousFactory continuous(DeviceId device, Class<?> cls) {
+        checkNotNull(device);
+        checkNotNull(cls);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder().add(device), cls));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID and components.
+     * The last element of the components must be a {@link Class} instance. Otherwise,
+     * an {@link IllegalArgumentException} is thrown.
+     *
+     * @param device device ID
+     * @param components resource ID components other than the device ID.
+     * @return {@link ContinuousFactory}
+     */
+    public static ContinuousFactory continuous(DeviceId device, Object... components) {
+        checkNotNull(device);
+        checkNotNull(components);
+        checkArgument(components.length > 1);
+
+        Object last = components[components.length - 1];
+        checkArgument(last instanceof Class<?>);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .add(device)
+                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID, port number and type.
+     *
+     * @param device device ID
+     * @param port port number
+     * @param cls type of resource the returned factory will create
+     * @return {@link ContinuousFactory}
+     */
+    public static ContinuousFactory continuous(DeviceId device, PortNumber port, Class<?> cls) {
+        checkNotNull(device);
+        checkNotNull(port);
+        checkNotNull(cls);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .add(device)
+                .add(port), cls));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID and components.
+     * The last element of the components must be a {@link Class} instance. Otherwise,
+     * an {@link IllegalArgumentException} is thrown.
+     *
+     * @param device device ID
+     * @param port port number
+     * @param components resource ID components other than the device ID and port number.
+     * @return {@link ContinuousFactory}
+     */
+    public static ContinuousFactory continuous(DeviceId device, PortNumber port, Object... components) {
+        checkNotNull(device);
+        checkNotNull(port);
+        checkNotNull(components);
+        checkArgument(components.length > 1);
+
+        Object last = components[components.length - 1];
+        checkArgument(last instanceof Class<?>);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .add(device)
+                .add(port)
+                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last));
+    }
+}
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 c8c1b17..4a5a450 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(Resource.discrete(D1, P1, VLAN1).resource(), IID1);
-        ResourceAllocation sameAsAlloc1 = new ResourceAllocation(Resource.discrete(D1, P1, VLAN1).resource(), IID1);
-        ResourceAllocation alloc2 = new ResourceAllocation(Resource.discrete(D2, P1, VLAN1).resource(), IID1);
+        ResourceAllocation alloc1 = new ResourceAllocation(Resources.discrete(D1, P1, VLAN1).resource(), IID1);
+        ResourceAllocation sameAsAlloc1 = new ResourceAllocation(Resources.discrete(D1, P1, VLAN1).resource(), IID1);
+        ResourceAllocation alloc2 = new ResourceAllocation(Resources.discrete(D2, P1, VLAN1).resource(), IID1);
 
         new EqualsTester()
                 .addEqualityGroup(alloc1, sameAsAlloc1)
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourceIdTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourceIdTest.java
index 1d2257b..aa97892 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourceIdTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourceIdTest.java
@@ -32,20 +32,20 @@
 
     @Test
     public void testDiscreteToString() {
-        ResourceId resource = Resource.discrete(D1, P1).id();
+        ResourceId resource = Resources.discrete(D1, P1).id();
 
         assertThat(resource.toString(), is(Arrays.asList(D1, P1).toString()));
     }
 
     @Test
     public void testContinuousToString() {
-        ResourceId resource = Resource.continuous(D1, P1, Bandwidth.class).id();
+        ResourceId resource = Resources.continuous(D1, P1, Bandwidth.class).id();
 
         assertThat(resource.toString(), is(Arrays.asList(D1, P1, Bandwidth.class.getSimpleName()).toString()));
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testInitWithNonClassInstance() {
-        Resource.continuous(D1, P1, BW1).id();
+        Resources.continuous(D1, P1, BW1).id();
     }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
index a14b947..59f327f 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
@@ -39,11 +39,11 @@
 
     @Test
     public void testEquals() {
-        Resource resource1 = Resource.discrete(D1, P1, VLAN1).resource();
-        Resource sameAsResource1 = Resource.discrete(D1, P1, VLAN1).resource();
-        Resource resource2 = Resource.discrete(D2, P1, VLAN1).resource();
-        Resource resource3 = Resource.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
-        Resource sameAsResource3 = Resource.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
+        Resource resource1 = Resources.discrete(D1, P1, VLAN1).resource();
+        Resource sameAsResource1 = Resources.discrete(D1, P1, VLAN1).resource();
+        Resource resource2 = Resources.discrete(D2, P1, VLAN1).resource();
+        Resource resource3 = Resources.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
+        Resource sameAsResource3 = Resources.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
 
         new EqualsTester()
                 .addEqualityGroup(resource1, sameAsResource1)
@@ -54,19 +54,19 @@
 
     @Test
     public void testComponents() {
-        Resource port = Resource.discrete(D1, P1).resource();
+        Resource port = Resources.discrete(D1, P1).resource();
 
         assertThat(port.components(), contains(D1, P1));
     }
 
     @Test
     public void testIdEquality() {
-        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(D1, P1, Bandwidth.class).resource(BW1.bps()).id();
+        ResourceId id1 = Resources.discrete(D1, P1, VLAN1).id();
+        ResourceId sameAsId1 = Resources.discrete(D1, P1, VLAN1).id();
+        ResourceId id2 = Resources.discrete(D2, P1, VLAN1).id();
+        ResourceId id3 = Resources.continuous(D1, P1, Bandwidth.class).resource(BW1.bps()).id();
         // intentionally set a different value
-        ResourceId sameAsId3 = Resource.continuous(D1, P1, Bandwidth.class).resource(BW2.bps()).id();
+        ResourceId sameAsId3 = Resources.continuous(D1, P1, Bandwidth.class).resource(BW2.bps()).id();
 
         new EqualsTester()
                 .addEqualityGroup(id1, sameAsId1)
@@ -76,30 +76,30 @@
 
     @Test
     public void testChild() {
-        Resource r1 = Resource.discrete(D1).resource().child(P1);
-        Resource sameAsR2 = Resource.discrete(D1, P1).resource();
+        Resource r1 = Resources.discrete(D1).resource().child(P1);
+        Resource sameAsR2 = Resources.discrete(D1, P1).resource();
 
         assertThat(r1, is(sameAsR2));
     }
 
     @Test
     public void testThereIsParent() {
-        Resource resource = Resource.discrete(D1, P1, VLAN1).resource();
-        Resource parent = Resource.discrete(D1, P1).resource();
+        Resource resource = Resources.discrete(D1, P1, VLAN1).resource();
+        Resource parent = Resources.discrete(D1, P1).resource();
 
         assertThat(resource.parent(), is(Optional.of(parent)));
     }
 
     @Test
     public void testNoParent() {
-        Resource resource = Resource.discrete(D1).resource();
+        Resource resource = Resources.discrete(D1).resource();
 
         assertThat(resource.parent(), is(Optional.of(Resource.ROOT)));
     }
 
     @Test
     public void testBase() {
-        Resource resource = Resource.discrete(D1).resource();
+        Resource resource = Resources.discrete(D1).resource();
 
         DeviceId child = (DeviceId) resource.last();
         assertThat(child, is(D1));
@@ -107,7 +107,7 @@
 
     @Test
     public void testVolumeOfDiscrete() {
-        Resource resource = Resource.discrete(D1).resource();
+        Resource resource = Resources.discrete(D1).resource();
 
         DeviceId volume = resource.volume();
         assertThat(volume, is(D1));
@@ -115,7 +115,7 @@
 
     @Test
     public void testVolumeOfContinuous() {
-        Resource resource = Resource.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
+        Resource resource = Resources.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
 
         double volume = resource.volume();
         assertThat(volume, is(BW1.bps()));
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 511c0c2..c8c7e8f 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
@@ -51,6 +51,7 @@
 import org.onosproject.net.intent.MplsPathIntent;
 import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
+import org.onosproject.net.newresource.Resources;
 import org.onosproject.net.resource.link.LinkResourceAllocations;
 import org.slf4j.Logger;
 
@@ -125,9 +126,9 @@
         // TODO: introduce the concept of Tx and Rx resources of a port
         Set<Resource> resources = labels.entrySet().stream()
                 .flatMap(x -> Stream.of(
-                        Resource.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue())
+                        Resources.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue())
                                 .resource(),
-                        Resource.discrete(x.getKey().dst().deviceId(), x.getKey().dst().port(), x.getValue())
+                        Resources.discrete(x.getKey().dst().deviceId(), x.getKey().dst().port(), x.getValue())
                                 .resource()
                 ))
                 .collect(Collectors.toSet());
@@ -156,7 +157,7 @@
     }
 
     private Set<MplsLabel> findMplsLabel(ConnectPoint cp) {
-        return resourceService.getAvailableResources(Resource.discrete(cp.deviceId(), cp.port()).resource()).stream()
+        return resourceService.getAvailableResources(Resources.discrete(cp.deviceId(), cp.port()).resource()).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 a08b843..d2f92d5 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
@@ -52,6 +52,7 @@
 import org.onosproject.net.newresource.ResourceAllocation;
 import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
+import org.onosproject.net.newresource.Resources;
 import org.onosproject.net.resource.device.IntentSetMultimap;
 import org.onosproject.net.resource.link.LinkResourceAllocations;
 import org.osgi.service.component.ComponentContext;
@@ -160,8 +161,8 @@
         log.debug("Compiling optical circuit intent between {} and {}", src, dst);
 
         // Reserve OduClt ports
-        Resource srcPortResource = Resource.discrete(src.deviceId(), src.port()).resource();
-        Resource dstPortResource = Resource.discrete(dst.deviceId(), dst.port()).resource();
+        Resource srcPortResource = Resources.discrete(src.deviceId(), src.port()).resource();
+        Resource dstPortResource = Resources.discrete(dst.deviceId(), dst.port()).resource();
         List<ResourceAllocation> allocation = resourceService.allocate(intent.id(), srcPortResource, dstPortResource);
         if (allocation.isEmpty()) {
             throw new IntentCompilationException("Unable to reserve ports for intent " + intent);
@@ -312,7 +313,8 @@
         if (ochCP != null) {
             OchPort ochPort = (OchPort) deviceService.getPort(ochCP.deviceId(), ochCP.port());
             Optional<IntentId> intentId =
-                    resourceService.getResourceAllocations(Resource.discrete(ochCP.deviceId(), ochCP.port()).resource())
+                    resourceService.getResourceAllocations(
+                            Resources.discrete(ochCP.deviceId(), ochCP.port()).resource())
                             .stream()
                             .map(ResourceAllocation::consumer)
                             .filter(x -> x instanceof IntentId)
@@ -334,7 +336,7 @@
 
             Optional<IntentId> intentId =
                     resourceService.getResourceAllocations(
-                            Resource.discrete(oduPort.deviceId(), port.number()).resource())
+                            Resources.discrete(oduPort.deviceId(), port.number()).resource())
                             .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 690f3c2..2f04cfd 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
@@ -46,6 +46,7 @@
 import org.onosproject.net.newresource.ResourceAllocation;
 import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
+import org.onosproject.net.newresource.Resources;
 import org.onosproject.net.resource.link.LinkResourceAllocations;
 import org.onosproject.net.topology.LinkWeight;
 import org.onosproject.net.topology.Topology;
@@ -109,8 +110,8 @@
         log.debug("Compiling optical connectivity intent between {} and {}", src, dst);
 
         // Reserve OCh ports
-        Resource srcPortResource = Resource.discrete(src.deviceId(), src.port()).resource();
-        Resource dstPortResource = Resource.discrete(dst.deviceId(), dst.port()).resource();
+        Resource srcPortResource = Resources.discrete(src.deviceId(), src.port()).resource();
+        Resource dstPortResource = Resources.discrete(dst.deviceId(), dst.port()).resource();
         List<ResourceAllocation> allocation = resourceService.allocate(intent.id(), srcPortResource, dstPortResource);
         if (allocation.isEmpty()) {
             throw new IntentCompilationException("Unable to reserve ports for intent " + intent);
@@ -183,8 +184,8 @@
         List<OchSignal> minLambda = findFirstLambda(lambdas, slotCount());
         List<Resource> lambdaResources = path.links().stream()
                 .flatMap(x -> Stream.of(
-                        Resource.discrete(x.src().deviceId(), x.src().port()).resource(),
-                        Resource.discrete(x.dst().deviceId(), x.dst().port()).resource()
+                        Resources.discrete(x.src().deviceId(), x.src().port()).resource(),
+                        Resources.discrete(x.dst().deviceId(), x.dst().port()).resource()
                 ))
                 .flatMap(x -> minLambda.stream().map(l -> x.child(l)))
                 .collect(Collectors.toList());
@@ -213,8 +214,8 @@
     private Set<OchSignal> findCommonLambdasOverLinks(List<Link> links) {
         return links.stream()
                 .flatMap(x -> Stream.of(
-                        Resource.discrete(x.src().deviceId(), x.src().port()).resource(),
-                        Resource.discrete(x.dst().deviceId(), x.dst().port()).resource()
+                        Resources.discrete(x.src().deviceId(), x.src().port()).resource(),
+                        Resources.discrete(x.dst().deviceId(), x.dst().port()).resource()
                 ))
                 .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 842e5e0..7473ce5 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
@@ -46,6 +46,7 @@
 import org.onosproject.net.intent.impl.IntentCompilationException;
 import org.onosproject.net.newresource.Resource;
 import org.onosproject.net.newresource.ResourceService;
+import org.onosproject.net.newresource.Resources;
 import org.onosproject.net.resource.link.LinkResourceAllocations;
 import org.slf4j.Logger;
 
@@ -252,9 +253,9 @@
         //same VLANID is used for both directions
         Set<Resource> resources = vlanIds.entrySet().stream()
                 .flatMap(x -> Stream.of(
-                        Resource.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue())
+                        Resources.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue())
                                 .resource(),
-                        Resource.discrete(x.getKey().dst().deviceId(), x.getKey().dst().port(), x.getValue())
+                        Resources.discrete(x.getKey().dst().deviceId(), x.getKey().dst().port(), x.getValue())
                                 .resource()
                 ))
                 .collect(Collectors.toSet());
@@ -282,7 +283,7 @@
     }
 
     private Set<VlanId> findVlanId(ConnectPoint cp) {
-        return resourceService.getAvailableResources(Resource.discrete(cp.deviceId(), cp.port()).resource()).stream()
+        return resourceService.getAvailableResources(Resources.discrete(cp.deviceId(), cp.port()).resource()).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 2a85fbb..64691d5 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
@@ -40,6 +40,7 @@
 import org.onosproject.net.newresource.ResourceAdminService;
 import org.onosproject.net.newresource.BandwidthCapacity;
 import org.onosproject.net.newresource.Resource;
+import org.onosproject.net.newresource.Resources;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -118,15 +119,15 @@
     }
 
     private void registerDeviceResource(Device device) {
-        executor.submit(() -> adminService.registerResources(Resource.discrete(device.id()).resource()));
+        executor.submit(() -> adminService.registerResources(Resources.discrete(device.id()).resource()));
     }
 
     private void unregisterDeviceResource(Device device) {
-        executor.submit(() -> adminService.unregisterResources(Resource.discrete(device.id()).resource()));
+        executor.submit(() -> adminService.unregisterResources(Resources.discrete(device.id()).resource()));
     }
 
     private void registerPortResource(Device device, Port port) {
-        Resource portPath = Resource.discrete(device.id(), port.number()).resource();
+        Resource portPath = Resources.discrete(device.id(), port.number()).resource();
         executor.submit(() -> {
             adminService.registerResources(portPath);
 
@@ -174,7 +175,7 @@
     }
 
     private void unregisterPortResource(Device device, Port port) {
-        Resource resource = Resource.discrete(device.id(), port.number()).resource();
+        Resource resource = Resources.discrete(device.id(), port.number()).resource();
         executor.submit(() -> adminService.unregisterResources(resource));
     }
 
diff --git a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceNetworkConfigListener.java b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceNetworkConfigListener.java
index b8d373b..e98a3c3 100644
--- a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceNetworkConfigListener.java
+++ b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceNetworkConfigListener.java
@@ -17,7 +17,6 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.net.newresource.Resource.continuous;
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.util.Set;
@@ -30,6 +29,7 @@
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.newresource.BandwidthCapacity;
 import org.onosproject.net.newresource.ResourceAdminService;
+import org.onosproject.net.newresource.Resources;
 import org.slf4j.Logger;
 
 import com.google.common.annotations.Beta;
@@ -93,8 +93,8 @@
 
         switch (event.type()) {
         case CONFIG_ADDED:
-            if (!adminService.registerResources(continuous(cp.deviceId(),
-                                                           cp.port(), Bandwidth.class)
+            if (!adminService.registerResources(Resources.continuous(cp.deviceId(),
+                    cp.port(), Bandwidth.class)
                     .resource(bwCapacity.capacity().bps()))) {
                 log.info("Failed to register Bandwidth for {}, attempting update", cp);
 
@@ -115,9 +115,9 @@
 
         case CONFIG_REMOVED:
             // FIXME Following should be an update to the value based on port speed
-            if (!adminService.unregisterResources(continuous(cp.deviceId(),
-                                                             cp.port(),
-                                                             Bandwidth.class).resource(0))) {
+            if (!adminService.unregisterResources(Resources.continuous(cp.deviceId(),
+                    cp.port(),
+                    Bandwidth.class).resource(0))) {
                 log.warn("Failed to unregister Bandwidth for {}", cp);
             }
             break;
@@ -147,12 +147,13 @@
         // but both unregisterResources(..) and  registerResources(..)
         // returns true (success)
 
-        if (!adminService.unregisterResources(continuous(cp.deviceId(), cp.port(), Bandwidth.class).resource(0))) {
+        if (!adminService.unregisterResources(
+                Resources.continuous(cp.deviceId(), cp.port(), Bandwidth.class).resource(0))) {
             log.warn("unregisterResources for {} failed", cp);
         }
-        return adminService.registerResources(continuous(cp.deviceId(),
-                                                         cp.port(),
-                                                         Bandwidth.class).resource(bwCapacity.capacity().bps()));
+        return adminService.registerResources(Resources.continuous(cp.deviceId(),
+                cp.port(),
+                Bandwidth.class).resource(bwCapacity.capacity().bps()));
     }
 
 }
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 7c1036e..eb5a4bc 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.Resource;
+import org.onosproject.net.newresource.Resources;
 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,
-                Resource.discrete(DeviceId.deviceId("a"), PortNumber.portNumber(1)).resource());
+                Resources.discrete(DeviceId.deviceId("a"), PortNumber.portNumber(1)).resource());
         resourceListener.event(event);
 
         assertThat(
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 8d2d368..9a0e94f 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.Resource;
+import org.onosproject.net.newresource.Resources;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.net.resource.link.BandwidthResource;
 import org.onosproject.net.resource.link.BandwidthResourceAllocation;
@@ -388,18 +388,18 @@
 
     @Test
     public void testResource() {
-        testSerializedEquals(Resource.discrete(DID1, P1, VLAN1).resource());
+        testSerializedEquals(Resources.discrete(DID1, P1, VLAN1).resource());
     }
 
     @Test
     public void testResourceId() {
-        testSerializedEquals(Resource.discrete(DID1, P1).id());
+        testSerializedEquals(Resources.discrete(DID1, P1).id());
     }
 
     @Test
     public void testResourceAllocation() {
         testSerializedEquals(new org.onosproject.net.newresource.ResourceAllocation(
-                Resource.discrete(DID1, P1, VLAN1).resource(),
+                Resources.discrete(DID1, P1, VLAN1).resource(),
                 IntentId.valueOf(30)));
     }
 
