diff --git a/experimental/uloapi/pom.xml b/experimental/uloapi/pom.xml
index fc4516873b8c7c05d087abdb3b7fae52cdc581fc..f468e7e9acbdc4bb021121a4782641a3646545bd 100644
--- a/experimental/uloapi/pom.xml
+++ b/experimental/uloapi/pom.xml
@@ -18,7 +18,7 @@
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>info.mathhub.uloapi.Main</mainClass>
+                            <mainClass>info.mathhub.uloapi.rest.Main</mainClass>
                         </manifest>
                     </archive>
                     <descriptorRefs>
@@ -41,7 +41,7 @@
                 <artifactId>exec-maven-plugin</artifactId>
                 <version>1.2.1</version>
                 <configuration>
-                    <mainClass>info.mathhub.uloapi.Main</mainClass>
+                    <mainClass>info.mathhub.uloapi.rest.Main</mainClass>
                 </configuration>
             </plugin>
         </plugins>
@@ -51,7 +51,7 @@
         <dependency>
             <groupId>com.sparkjava</groupId>
             <artifactId>spark-core</artifactId>
-            <version>2.5</version>
+            <version>2.9.1</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
@@ -68,5 +68,10 @@
             <artifactId>logback-classic</artifactId>
             <version>1.2.3</version>
         </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.6</version>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/experimental/uloapi/src/main/java/info/mathhub/uloapi/Main.java b/experimental/uloapi/src/main/java/info/mathhub/uloapi/Main.java
deleted file mode 100644
index 03e9e8c7e0df60fc59091524f355b488b2c07821..0000000000000000000000000000000000000000
--- a/experimental/uloapi/src/main/java/info/mathhub/uloapi/Main.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package info.mathhub.uloapi;
-
-import static spark.Spark.*;
-
-public class Main {
-    private Main() {};
-
-    public static void main(String[] args) {
-        get("/", Routes.index);
-        get("/favicon.ico", Routes.createError(404));
-    }
-}
diff --git a/experimental/uloapi/src/main/java/info/mathhub/uloapi/Routes.java b/experimental/uloapi/src/main/java/info/mathhub/uloapi/Routes.java
deleted file mode 100644
index a1d9b2a63854e0d238e35d5c4609a832870086d0..0000000000000000000000000000000000000000
--- a/experimental/uloapi/src/main/java/info/mathhub/uloapi/Routes.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package info.mathhub.uloapi;
-
-import spark.*;
-
-/**
- * This class contains all routes of our application.
- */
-public class Routes {
-    private Routes() {};
-
-    public static final Route index = (Request request, Response response) -> {
-        return "<h1>Index /</h1>";
-    };
-
-    public static Route createError(int status) {
-       return (Request request, Response response) -> {
-           response.status(status);
-           return String.format("Error %d", status);
-       };
-    }
-}
diff --git a/experimental/uloapi/src/main/java/info/mathhub/uloapi/query/Query.java b/experimental/uloapi/src/main/java/info/mathhub/uloapi/query/Query.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3d861222bf8b3c884ab43102b30452eb1c34760
--- /dev/null
+++ b/experimental/uloapi/src/main/java/info/mathhub/uloapi/query/Query.java
@@ -0,0 +1,7 @@
+package info.mathhub.uloapi.query;
+
+public class Query {
+    public Statistics getStatistics() {
+        return new Statistics(10);
+    }
+}
diff --git a/experimental/uloapi/src/main/java/info/mathhub/uloapi/query/Statistics.java b/experimental/uloapi/src/main/java/info/mathhub/uloapi/query/Statistics.java
new file mode 100644
index 0000000000000000000000000000000000000000..f32b9dbb4063094e28e3b677d17b2721cbbe45db
--- /dev/null
+++ b/experimental/uloapi/src/main/java/info/mathhub/uloapi/query/Statistics.java
@@ -0,0 +1,15 @@
+package info.mathhub.uloapi.query;
+
+/**
+ * Contains statistic information about the backing storage.
+ */
+public class Statistics {
+    /**
+     * The number of triplets in the backing storage.
+     */
+    public long numTriplets;
+
+    Statistics(int numTriplets) {
+        this.numTriplets = numTriplets;
+    }
+}
diff --git a/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/Filters.java b/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/Filters.java
new file mode 100644
index 0000000000000000000000000000000000000000..26fca38491d15c921b4af8c9fca1bbdb7d025fc1
--- /dev/null
+++ b/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/Filters.java
@@ -0,0 +1,13 @@
+package info.mathhub.uloapi.rest;
+
+import spark.Filter;
+import spark.Request;
+import spark.Response;
+
+public class Filters {
+    private Filters() {};
+
+    public static final Filter setJsonContentType = (Request request, Response response) -> {
+        response.type("application/json");
+    };
+}
diff --git a/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/JsonTransformer.java b/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/JsonTransformer.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd28154467659be765b3c30485523630481d6a45
--- /dev/null
+++ b/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/JsonTransformer.java
@@ -0,0 +1,17 @@
+package info.mathhub.uloapi.rest;
+
+import com.google.gson.Gson;
+import spark.ResponseTransformer;
+
+/**
+ * A {@link spark.ResponseTransformer} that converts everything to
+ * JSON.
+ */
+public class JsonTransformer implements ResponseTransformer {
+    private final Gson instance = new Gson();
+
+    @Override
+    public String render(Object model) throws Exception {
+        return this.instance.toJson(model);
+    }
+}
diff --git a/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/Main.java b/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/Main.java
new file mode 100644
index 0000000000000000000000000000000000000000..496dc5c8dbb26f53a596c438d60363c043d04dc4
--- /dev/null
+++ b/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/Main.java
@@ -0,0 +1,19 @@
+package info.mathhub.uloapi.rest;
+
+import static spark.Spark.*;
+
+/**
+ * Entry point of the JSON/REST API for the underlying ULO/RDF store.
+ */
+public class Main {
+    private Main() {};
+
+    public static void main(String[] args) {
+        get("/", Routes.index);
+        get("/statistics", Routes.statistics, new JsonTransformer());
+        get("/name/:name", Routes.name, new JsonTransformer());
+        notFound(Routes.notFound);
+
+        after(Filters.setJsonContentType);
+    }
+}
diff --git a/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/Routes.java b/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/Routes.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7ba8fc0ac943b93847929d71c3144d7bb24c790
--- /dev/null
+++ b/experimental/uloapi/src/main/java/info/mathhub/uloapi/rest/Routes.java
@@ -0,0 +1,48 @@
+package info.mathhub.uloapi.rest;
+
+import info.mathhub.uloapi.query.Query;
+import org.eclipse.jetty.http.HttpStatus;
+import spark.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This class contains all routes of our application.
+ */
+public class Routes {
+    private Routes() {};
+
+    public static final Route index = (Request request, Response response) -> {
+        return "{}";
+    };
+
+    public static final Route statistics = (Request request, Response response) -> {
+        return new Query().getStatistics();
+    };
+
+    public static final Route name = (Request request, Response response) -> {
+        final Map<String, Object> json = new HashMap<>();
+
+        json.put("name", request.params(":name"));
+        json.put("attributes", request.attributes());
+        json.put("ip", request.ip());
+
+        return json;
+    };
+
+    public static final Route notFound = (Request request, Response response) -> {
+        return createError(HttpStatus.NOT_FOUND_404);
+    };
+
+    public static final Route notAcceptable = (Request request, Response response) -> {
+        return createError(HttpStatus.NOT_ACCEPTABLE_406);
+    };
+
+    private static Route createError(int status) {
+       return (Request request, Response response) -> {
+           response.status(status);
+           return String.format("Error %d", status);
+       };
+    }
+}