diff --git a/core/api/src/main/java/org/onosproject/net/resource/DiscreteResourceSet.java b/core/api/src/main/java/org/onosproject/net/resource/DiscreteResourceSet.java
new file mode 100644
index 0000000..37a3f0f
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/resource/DiscreteResourceSet.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2016-present 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.resource;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableSet;
+
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+
+/**
+ * Represents a set of discrete type resources.
+ * This class is intended to be used by ConsistentResourceStore though it is exposed to the public.
+ */
+@Beta
+public final class DiscreteResourceSet {
+    private final Set<DiscreteResource> values;
+    private final DiscreteResourceCodec codec;
+
+    /**
+     * Creates an instance with resources and the codec for them.
+     *
+     * @param values resources to be contained in the instance
+     * @param codec codec for the specified resources
+     * @return an instance
+     */
+    public static DiscreteResourceSet of(Set<DiscreteResource> values, DiscreteResourceCodec codec) {
+        checkNotNull(values);
+        checkNotNull(codec);
+        checkArgument(!values.isEmpty());
+
+        return new DiscreteResourceSet(ImmutableSet.copyOf(values), codec);
+    }
+
+    /**
+     * Creates the instance representing an empty resource set.
+     *
+     * @return an empty resource set
+     */
+    public static DiscreteResourceSet empty() {
+        return new DiscreteResourceSet(ImmutableSet.of(), NoOpCodec.INSTANCE);
+    }
+
+    private DiscreteResourceSet(Set<DiscreteResource> values, DiscreteResourceCodec codec) {
+        this.values = values;
+        this.codec = codec;
+    }
+
+    private DiscreteResourceSet() {
+        this.values = null;
+        this.codec = null;
+    }
+
+    /**
+     * Returns resources contained in this instance.
+     *
+     * @return resources
+     */
+    public Set<DiscreteResource> values() {
+        return values;
+    }
+
+    /**
+     * Returns the parent resource of the resources contained in this instance.
+     *
+     * @return the parent resource of the resources
+     */
+    public DiscreteResourceId parent() {
+        if (values.isEmpty()) {
+            // Dummy value avoiding null
+            return ResourceId.ROOT;
+        }
+        Optional<DiscreteResourceId> parent = values.iterator().next().id().parent();
+        checkState(parent.isPresent());
+
+        return parent.get();
+    }
+
+    /**
+     * Returns the codec for the resources contained in this instance.
+     *
+     * @return the codec for the resources
+     */
+    public DiscreteResourceCodec codec() {
+        return codec;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(values, codec);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj == null || getClass() != obj.getClass()) {
+            return false;
+        }
+
+        final DiscreteResourceSet other = (DiscreteResourceSet) obj;
+        return Objects.equals(this.values, other.values)
+                && Objects.equals(this.codec, other.codec);
+    }
+
+}
