diff --git a/core/api/src/main/java/org/onosproject/rest/ApiDocProvider.java b/core/api/src/main/java/org/onosproject/rest/ApiDocProvider.java
new file mode 100644
index 0000000..50cac4c
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/rest/ApiDocProvider.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2015 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.rest;
+
+import com.google.common.annotations.Beta;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.InputStream;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Entity capable of providing REST API documentation resources.
+ */
+@Beta
+public class ApiDocProvider {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private static final String DOCS = "/apidoc/swagger.json";
+    private static final String MODEL = "/apidoc/model.json";
+
+    private final String key;
+    private final String name;
+    private final ClassLoader classLoader;
+
+    /**
+     * Creates a new REST API documentation provider.
+     *
+     * @param key         REST API key
+     * @param name        REST API name
+     * @param classLoader class loader
+     */
+    public ApiDocProvider(String key, String name, ClassLoader classLoader) {
+        this.key = checkNotNull(key, "Key cannot be null");
+        this.name = checkNotNull(name, "Name cannot be null");
+        this.classLoader = checkNotNull(classLoader, "Class loader cannot be null");
+    }
+
+    /**
+     * Returns the REST API key.
+     *
+     * @return REST API key
+     */
+    public String key() {
+        return key;
+    }
+
+    /**
+     * Returns the REST API name.
+     *
+     * @return REST API name
+     */
+    public String name() {
+        return name;
+    }
+
+    /**
+     * Returns input stream containing Swagger UI compatible JSON.
+     *
+     * @return input stream with Swagger JSON data
+     */
+    public InputStream docs() {
+        return get(DOCS);
+    }
+
+    /**
+     * Returns input stream containing JSON model schema.
+     *
+     * @return input stream with JSON model schema
+     */
+    public InputStream model() {
+        return get(MODEL);
+    }
+
+    private InputStream get(String resource) {
+        InputStream stream = classLoader.getResourceAsStream(resource);
+        if (stream == null) {
+            log.warn("Unable to find JSON resource {}", resource);
+        }
+        return stream;
+    }
+
+}
