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()));
