Split document aggregator in its own module and rename things
diff --git a/remote-content-api/document-aggregator/README.md b/remote-content-api/document-aggregator/README.md
new file mode 100644
index 0000000..201e994
--- /dev/null
+++ b/remote-content-api/document-aggregator/README.md
@@ -0,0 +1,8 @@
+Apache Sling Document Aggregator
+----
+
+TODO: add badges
+
+TODO flesh this out
+
+For now, see the sibling sample-graphql-api module which uses this.
\ No newline at end of file
diff --git a/remote-content-api/document-aggregator/bnd.bnd b/remote-content-api/document-aggregator/bnd.bnd
new file mode 100644
index 0000000..d9d9b6a
--- /dev/null
+++ b/remote-content-api/document-aggregator/bnd.bnd
@@ -0,0 +1 @@
+# nothing needed here so far
\ No newline at end of file
diff --git a/remote-content-api/document-aggregator/pom.xml b/remote-content-api/document-aggregator/pom.xml
new file mode 100644
index 0000000..cad67f9
--- /dev/null
+++ b/remote-content-api/document-aggregator/pom.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.sling</groupId>
+    <artifactId>sling-bundle-parent</artifactId>
+    <version>38</version>
+    <relativePath />
+  </parent>
+
+  <artifactId>org.apache.sling.document.aggregator</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+
+  <name>Apache Sling Document Aggregator</name>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <http.port>8080</http.port>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>biz.aQute.bnd</groupId>
+        <artifactId>bnd-maven-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>biz.aQute.bnd</groupId>
+        <artifactId>bnd-baseline-maven-plugin</artifactId>
+        <configuration>
+          <!-- TODO remove this once we have a release of this module -->
+          <failOnMissing>false</failOnMissing>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.api</artifactId>
+      <version>2.18.4</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.commons.johnzon</artifactId>
+      <version>1.2.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jetbrains</groupId>
+      <artifactId>annotations</artifactId>
+      <version>16.0.3</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/Annotations.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/Annotations.java
similarity index 98%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/Annotations.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/Annotations.java
index 4f00c4f..564b641 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/Annotations.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/Annotations.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.api;
+package org.apache.sling.documentaggregator.api;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/AnnotationsRegistry.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/AnnotationsRegistry.java
similarity index 93%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/AnnotationsRegistry.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/AnnotationsRegistry.java
index 543411f..7c24196 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/AnnotationsRegistry.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/AnnotationsRegistry.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.api;
+package org.apache.sling.documentaggregator.api;
 
 import org.osgi.annotation.versioning.ProviderType;
 
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/DocumentMapper.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/DocumentAggregator.java
similarity index 80%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/DocumentMapper.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/DocumentAggregator.java
index 31435d0..e2441c2 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/DocumentMapper.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/DocumentAggregator.java
@@ -17,20 +17,18 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.api;
+package org.apache.sling.documentaggregator.api;
 
 import org.apache.sling.api.resource.Resource;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.annotation.versioning.ProviderType;
 
 /**
- * Maps Sling {@link Resource} to a {@link MappingTarget.TargetNode}
+ * Maps Sling {@link Resource} to a {@link DocumentTree.DocumentNode}
  */
 @ProviderType
-public interface DocumentMapper {
+public interface DocumentAggregator {
 
-    String ROLE = "sling.document.mapper.role";
-    
     interface UrlBuilder {
         String pathToUrl(String path);
     }
@@ -44,5 +42,5 @@
         }
     }
     
-    void map(@NotNull Resource r, @NotNull MappingTarget.TargetNode destination, Options opt);
+    void aggregate(@NotNull Resource r, @NotNull DocumentTree.DocumentNode destination, Options opt);
 }
\ No newline at end of file
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/MappingTarget.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/DocumentTree.java
similarity index 77%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/MappingTarget.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/DocumentTree.java
index a774763..d8558e0 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/api/MappingTarget.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/DocumentTree.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.api;
+package org.apache.sling.documentaggregator.api;
 
 import org.apache.sling.api.adapter.Adaptable;
 import org.jetbrains.annotations.NotNull;
@@ -28,15 +28,15 @@
  * document tree, etc.
  */
 @ProviderType
-public interface MappingTarget {
+public interface DocumentTree {
     String TARGET_TYPE = "sling.mapping.target.type";
 
-    interface TargetNode extends Adaptable {
-        TargetNode addChild(String name);
-        TargetNode addValue(String name, Object value);
-        TargetNode addValue(String name, Object [] value);
+    interface DocumentNode extends Adaptable {
+        DocumentNode addChild(String name);
+        DocumentNode addValue(String name, Object value);
+        DocumentNode addValue(String name, Object [] value);
         void close();
     }
 
-    @NotNull TargetNode newTargetNode();
+    @NotNull DocumentNode newTargetNode();
 }
\ No newline at end of file
diff --git a/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/package-info.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/package-info.java
new file mode 100644
index 0000000..fdca395
--- /dev/null
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/api/package-info.java
@@ -0,0 +1,21 @@
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements.  See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership.  The ASF licenses this file
+ ~ to you 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.
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+@Version("0.0.1")
+package org.apache.sling.documentaggregator.api;
+import org.osgi.annotation.versioning.Version;
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/ContentDocumentMapper.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/DocumentAggregatorImpl.java
similarity index 81%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/ContentDocumentMapper.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/DocumentAggregatorImpl.java
index 7561acc..6f0424b 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/ContentDocumentMapper.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/DocumentAggregatorImpl.java
@@ -17,22 +17,22 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.impl;
+package org.apache.sling.documentaggregator.impl;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
-import org.apache.sling.remotecontent.documentmapper.api.Annotations;
-import org.apache.sling.remotecontent.documentmapper.api.AnnotationsRegistry;
-import org.apache.sling.remotecontent.documentmapper.api.DocumentMapper;
-import org.apache.sling.remotecontent.documentmapper.api.MappingTarget;
+import org.apache.sling.documentaggregator.api.Annotations;
+import org.apache.sling.documentaggregator.api.AnnotationsRegistry;
+import org.apache.sling.documentaggregator.api.DocumentAggregator;
+import org.apache.sling.documentaggregator.api.DocumentTree;
 import org.jetbrains.annotations.NotNull;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Component(service = DocumentMapper.class, property = { DocumentMapper.ROLE + "=content" })
-public class ContentDocumentMapper implements DocumentMapper {
+@Component(service = DocumentAggregator.class)
+public class DocumentAggregatorImpl implements DocumentAggregator {
 
     private final PropertiesMapper propertiesMapper = new PropertiesMapper();
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -41,7 +41,7 @@
     private AnnotationsRegistry annotationsRegistry;
 
     @Override
-    public void map(@NotNull Resource originalResource, @NotNull MappingTarget.TargetNode dest, DocumentMapper.Options opt) {
+    public void aggregate(@NotNull Resource originalResource, @NotNull DocumentTree.DocumentNode dest, DocumentAggregator.Options opt) {
         Annotations annot = annotationsRegistry.getAnnotations(originalResource.getResourceType());
         dest.addValue("path", originalResource.getPath());
         final String substPath = annot.childSubstitutePath();
@@ -57,11 +57,11 @@
         mapResource(r, dest, opt, r.getResourceType(), annot, annot.isDocumentRoot());
     }
 
-    private void mapResource(@NotNull Resource r, @NotNull MappingTarget.TargetNode dest, 
-        DocumentMapper.Options opt, String documentResourceType, Annotations documentAnnot, boolean recurse) {
+    private void mapResource(@NotNull Resource r, @NotNull DocumentTree.DocumentNode dest, 
+        DocumentAggregator.Options opt, String documentResourceType, Annotations documentAnnot, boolean recurse) {
 
         final Annotations resourceAnnot = annotationsRegistry.getAnnotations(r.getResourceType());
-        final MappingTarget.TargetNode debug = opt.debug ? dest.addChild("sling:dmap:debug") : null;
+        final DocumentTree.DocumentNode debug = opt.debug ? dest.addChild("sling:dmap:debug") : null;
         if(debug != null) {
             debug.addValue("sling:dmap:path", r.getPath());
             debug.addValue("sling:dmap:resourceType", r.getResourceType());
@@ -91,7 +91,7 @@
             if(derefPath != null) {
                 final Resource dereferenced = r.getResourceResolver().getResource(derefPath);
                 if(dereferenced != null) {
-                    final MappingTarget.TargetNode derefNode = dest.addChild("sling:dmap:resolved");
+                    final DocumentTree.DocumentNode derefNode = dest.addChild("sling:dmap:resolved");
                     derefNode.addValue("sling:dmap:resolvedFrom", derefPathPropertyName);
                     derefNode.addValue("sling:dmap:resolvePath", derefPath);
                     mapResource(dereferenced, derefNode, opt, documentResourceType, documentAnnot, recurse);
@@ -112,7 +112,7 @@
                 }
                 final String childResourceType = child.getResourceType();
                 if(annotationsRegistry.getAnnotations(childResourceType).visitContent()) {
-                    final MappingTarget.TargetNode childDest = dest.addChild(child.getName());
+                    final DocumentTree.DocumentNode childDest = dest.addChild(child.getName());
                     mapResource(child, childDest, opt, childResourceType, documentAnnot, true);
                 }
             }
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/JsonMappingTarget.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/JsonMappingTarget.java
similarity index 76%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/JsonMappingTarget.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/JsonMappingTarget.java
index 575638f..0f96063 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/JsonMappingTarget.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/JsonMappingTarget.java
@@ -17,19 +17,19 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.impl;
+package org.apache.sling.documentaggregator.impl;
 
-import org.apache.sling.remotecontent.documentmapper.api.MappingTarget;
+import org.apache.sling.documentaggregator.api.DocumentTree;
 
 import org.jetbrains.annotations.NotNull;
 import org.osgi.service.component.annotations.Component;
 
 /** MappingTarget that outputs to a JSON document */
-@Component(service = MappingTarget.class, property = { MappingTarget.TARGET_TYPE + "=json" })
-public class JsonMappingTarget implements MappingTarget {
+@Component(service = DocumentTree.class, property = { DocumentTree.TARGET_TYPE + "=json" })
+public class JsonMappingTarget implements DocumentTree {
 
     @Override
-    public @NotNull TargetNode newTargetNode() {
+    public @NotNull DocumentNode newTargetNode() {
         return new JsonTargetNode("ROOT_THIS_NAME_SHOULD_NOT_APPEAR_IN_OUTPUT");
     }
 }
\ No newline at end of file
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/JsonTargetNode.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/JsonTargetNode.java
similarity index 82%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/JsonTargetNode.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/JsonTargetNode.java
index 77f98c1..9cb7dce 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/JsonTargetNode.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/JsonTargetNode.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.impl;
+package org.apache.sling.documentaggregator.impl;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -26,11 +26,11 @@
 import javax.json.Json;
 import javax.json.JsonObjectBuilder;
 
-import org.apache.sling.remotecontent.documentmapper.api.MappingTarget;
-import org.apache.sling.remotecontent.documentmapper.api.MappingTarget.TargetNode;
+import org.apache.sling.documentaggregator.api.DocumentTree;
+import org.apache.sling.documentaggregator.api.DocumentTree.DocumentNode;
 
 /** A TargetNode that outputs to a JSON document */
-public class JsonTargetNode implements MappingTarget.TargetNode {
+public class JsonTargetNode implements DocumentTree.DocumentNode {
 
     private final String name;
     private final JsonObjectBuilder builder;
@@ -42,7 +42,7 @@
     }
 
     @Override
-    public TargetNode addChild(String name) {
+    public DocumentNode addChild(String name) {
         if(children == null) {
             children = new ArrayList<>();
         }
@@ -52,13 +52,13 @@
     }
 
     @Override
-    public TargetNode addValue(String name, Object value) {
+    public DocumentNode addValue(String name, Object value) {
         builder.add(name, String.valueOf(value));
         return this;
     }
 
     @Override
-    public TargetNode addValue(String name, Object[] value) {
+    public DocumentNode addValue(String name, Object[] value) {
         builder.add(name, String.valueOf(Arrays.asList(value)));
         return this;
     }
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/MapMappingTarget.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/MapMappingTarget.java
similarity index 76%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/MapMappingTarget.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/MapMappingTarget.java
index 10718fb..5aaf833 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/MapMappingTarget.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/MapMappingTarget.java
@@ -17,19 +17,19 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.impl;
+package org.apache.sling.documentaggregator.impl;
 
-import org.apache.sling.remotecontent.documentmapper.api.MappingTarget;
+import org.apache.sling.documentaggregator.api.DocumentTree;
 
 import org.jetbrains.annotations.NotNull;
 import org.osgi.service.component.annotations.Component;
 
 /** MappingTarget that outputs to a JSON document */
-@Component(service = MappingTarget.class, property = { MappingTarget.TARGET_TYPE + "=map" })
-public class MapMappingTarget implements MappingTarget {
+@Component(service = DocumentTree.class, property = { DocumentTree.TARGET_TYPE + "=map" })
+public class MapMappingTarget implements DocumentTree {
 
     @Override
-    public @NotNull TargetNode newTargetNode() {
+    public @NotNull DocumentNode newTargetNode() {
         return new MapTargetNode("ROOT_THIS_NAME_SHOULD_NOT_APPEAR_IN_OUTPUT");
     }
 }
\ No newline at end of file
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/MapTargetNode.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/MapTargetNode.java
similarity index 79%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/MapTargetNode.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/MapTargetNode.java
index c12f7f7..722d2ad 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/MapTargetNode.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/MapTargetNode.java
@@ -17,35 +17,35 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.impl;
+package org.apache.sling.documentaggregator.impl;
 
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.sling.remotecontent.documentmapper.api.MappingTarget;
-import org.apache.sling.remotecontent.documentmapper.api.MappingTarget.TargetNode;
+import org.apache.sling.documentaggregator.api.DocumentTree;
+import org.apache.sling.documentaggregator.api.DocumentTree.DocumentNode;
 
 /** A TargetNode that outputs to a Map document */
-public class MapTargetNode extends HashMap<String, Object> implements MappingTarget.TargetNode {
+public class MapTargetNode extends HashMap<String, Object> implements DocumentTree.DocumentNode {
 
     MapTargetNode(String name) {
     }
 
     @Override
-    public TargetNode addChild(String name) {
+    public DocumentNode addChild(String name) {
         final MapTargetNode child = new MapTargetNode(name);
         put(name, child);
         return child;
     }
 
     @Override
-    public TargetNode addValue(String name, Object value) {
+    public DocumentNode addValue(String name, Object value) {
         put(name, value);
         return this;
     }
 
     @Override
-    public TargetNode addValue(String name, Object[] value) {
+    public DocumentNode addValue(String name, Object[] value) {
         put(name, value);
         return this;
     }
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/PropertiesMapper.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/PropertiesMapper.java
similarity index 85%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/PropertiesMapper.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/PropertiesMapper.java
index 825c238..ac273cb 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/PropertiesMapper.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/PropertiesMapper.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.impl;
+package org.apache.sling.documentaggregator.impl;
 
 import java.util.Arrays;
 import java.util.Calendar;
@@ -25,11 +25,11 @@
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
-import org.apache.sling.remotecontent.documentmapper.api.Annotations;
-import org.apache.sling.remotecontent.documentmapper.api.MappingTarget;
+import org.apache.sling.documentaggregator.api.Annotations;
+import org.apache.sling.documentaggregator.api.DocumentTree;
 
 class PropertiesMapper {
-    void mapProperties(MappingTarget.TargetNode dest, Resource r, Annotations annot) {
+    void mapProperties(DocumentTree.DocumentNode dest, Resource r, Annotations annot) {
         final ValueMap vm = r.adaptTo(ValueMap.class);
         if(vm != null) {
             for(Map.Entry<String, Object> e : vm.entrySet()) {
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/PropertiesSelector.java b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/PropertiesSelector.java
similarity index 93%
rename from remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/PropertiesSelector.java
rename to remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/PropertiesSelector.java
index e303d2b..187a62c 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/documentmapper/impl/PropertiesSelector.java
+++ b/remote-content-api/document-aggregator/src/main/java/org/apache/sling/documentaggregator/impl/PropertiesSelector.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.sling.remotecontent.documentmapper.impl;
+package org.apache.sling.documentaggregator.impl;
 
 interface PropertiesSelector {
     boolean renderProperty(String name);
diff --git a/remote-content-api/pom.xml b/remote-content-api/pom.xml
index a1ff8dc..eb2b88e 100644
--- a/remote-content-api/pom.xml
+++ b/remote-content-api/pom.xml
@@ -36,6 +36,7 @@
 
   <modules>
       <module>sample-graphql-api</module>
+      <module>document-aggregator</module>
   </modules>
 
   <build>
diff --git a/remote-content-api/sample-graphql-api/README.md b/remote-content-api/sample-graphql-api/README.md
index 3454984..f1f2a4f 100644
--- a/remote-content-api/sample-graphql-api/README.md
+++ b/remote-content-api/sample-graphql-api/README.md
@@ -1,10 +1,11 @@
 # Apache Sling Document-Oriented Content API - Sample GraphQL API
 
-To start this use
+To start this, build the sibling modules with `mvn clean install` in the parent folder
+of this one and then, in this folder, run
 
     mvn clean install exec:java
 
-In this folder, and open http://localhost:8080 - which might require logging in
+Then open http://localhost:8080 - which might require logging in
 at http://localhost:8080/system/console first.
 
 This should redirect you to the main GraphQL endpoint, currently 
diff --git a/remote-content-api/sample-graphql-api/pom.xml b/remote-content-api/sample-graphql-api/pom.xml
index 505163c..25afa71 100644
--- a/remote-content-api/sample-graphql-api/pom.xml
+++ b/remote-content-api/sample-graphql-api/pom.xml
@@ -133,14 +133,14 @@
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
-      <artifactId>org.apache.sling.commons.johnzon</artifactId>
-      <version>1.2.2</version>
+      <artifactId>org.apache.sling.repoinit.parser</artifactId>
+      <version>1.6.8</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
-      <artifactId>org.apache.sling.repoinit.parser</artifactId>
-      <version>1.6.8</version>
+      <artifactId>org.apache.sling.document.aggregator</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentDataFetcher.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentDataFetcher.java
index 1472361..48e6d1c 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentDataFetcher.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentDataFetcher.java
@@ -23,11 +23,10 @@
 import java.util.Map;
 
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.documentaggregator.api.DocumentAggregator;
+import org.apache.sling.documentaggregator.api.DocumentTree;
 import org.apache.sling.graphql.api.SlingDataFetcher;
 import org.apache.sling.graphql.api.SlingDataFetcherEnvironment;
-import org.apache.sling.remotecontent.documentmapper.api.DocumentMapper;
-import org.apache.sling.remotecontent.documentmapper.api.DocumentMapper.UrlBuilder;
-import org.apache.sling.remotecontent.documentmapper.api.MappingTarget;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.osgi.service.component.annotations.Component;
@@ -36,11 +35,11 @@
 @Component(service = SlingDataFetcher.class, property = {"name=samples/document"})
 public class DocumentDataFetcher implements SlingDataFetcher<Object> {
 
-    @Reference(target="(" + MappingTarget.TARGET_TYPE + "=map)")
-    private MappingTarget mappingTarget;
+    @Reference(target="(" + DocumentTree.TARGET_TYPE + "=map)")
+    private DocumentTree mappingTarget;
 
     @Reference
-    private DocumentMapper documentMapper;
+    private DocumentAggregator documentAggregator;
 
     @Override
     public @Nullable Object get(@NotNull SlingDataFetcherEnvironment e) throws Exception {
@@ -49,14 +48,14 @@
         final Map<String, Object> data = new HashMap<>();
         data.put("path", path);
         data.put("selectors", e.getArgument("selectors"));
-        final DocumentMapper.Options opt = new DocumentMapper.Options(e.getArgument("debug", false), new UrlBuilderStub());
+        final DocumentAggregator.Options opt = new DocumentAggregator.Options(e.getArgument("debug", false), new UrlBuilderStub());
 
         // Get the target Resource
         final Resource target = e.getCurrentResource().getResourceResolver().getResource(path);
 
-        // Use DocumentMapper to build the body
-        final MappingTarget.TargetNode body = mappingTarget.newTargetNode();
-        documentMapper.map(target, body, opt);
+        // Use the aggregator to build the body
+        final DocumentTree.DocumentNode body = mappingTarget.newTargetNode();
+        documentAggregator.aggregate(target, body, opt);
         body.close();
         data.put("body", body.adaptTo(Map.class));
         return data;
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentsDataFetcher.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentsDataFetcher.java
index a56843f..22a10cd 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentsDataFetcher.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/DocumentsDataFetcher.java
@@ -27,10 +27,10 @@
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.documentaggregator.api.DocumentAggregator;
+import org.apache.sling.documentaggregator.api.DocumentTree;
 import org.apache.sling.graphql.api.SlingDataFetcher;
 import org.apache.sling.graphql.api.SlingDataFetcherEnvironment;
-import org.apache.sling.remotecontent.documentmapper.api.DocumentMapper;
-import org.apache.sling.remotecontent.documentmapper.api.MappingTarget;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.osgi.service.component.annotations.Component;
@@ -39,27 +39,27 @@
 @Component(service = SlingDataFetcher.class, property = {"name=samples/documents"})
 public class DocumentsDataFetcher implements SlingDataFetcher<Object> {
 
-    @Reference(target="(" + MappingTarget.TARGET_TYPE + "=map)")
-    private MappingTarget mappingTarget;
+    @Reference(target="(" + DocumentTree.TARGET_TYPE + "=map)")
+    private DocumentTree mappingTarget;
 
     @Reference
-    private DocumentMapper documentMapper;
+    private DocumentAggregator documentAggregator;
 
-    private void addDocumentData(final Map<String, Object> data, String key, Resource r, DocumentMapper mapper, DocumentMapper.Options opt) {
-        final MappingTarget.TargetNode target = mappingTarget.newTargetNode();
-        mapper.map(r, target, opt);
+    private void addDocumentData(final Map<String, Object> data, String key, Resource r, DocumentAggregator aggregator, DocumentAggregator.Options opt) {
+        final DocumentTree.DocumentNode target = mappingTarget.newTargetNode();
+        aggregator.aggregate(r, target, opt);
         target.close();
         data.put(key, target.adaptTo(Map.class));
 
     }
 
-    private Map<String, Object> toDocument(Resource r, DocumentMapper.Options opt) {
+    private Map<String, Object> toDocument(Resource r, DocumentAggregator.Options opt) {
         final Map<String, Object> data = new HashMap<>();
         data.put("path", r.getPath());
 
         // TODO for now those are the same...
-        addDocumentData(data, "body", r, documentMapper, opt);
-        addDocumentData(data, "summary", r, documentMapper, opt);
+        addDocumentData(data, "body", r, documentAggregator, opt);
+        addDocumentData(data, "summary", r, documentAggregator, opt);
 
         return data;
     }
@@ -69,7 +69,7 @@
         // Use a suffix as we might not keep these built-in language in the long term
         final String langSuffix = "2020";
 
-        final DocumentMapper.Options opt = new DocumentMapper.Options(e.getArgument("debug", false), new UrlBuilderStub());
+        final DocumentAggregator.Options opt = new DocumentAggregator.Options(e.getArgument("debug", false), new UrlBuilderStub());
 
         String lang = e.getArgument("lang", "xpath" + langSuffix);
         if(!lang.endsWith(langSuffix)) {
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/UrlBuilderStub.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/UrlBuilderStub.java
index b5a161a..f1a534d 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/UrlBuilderStub.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/UrlBuilderStub.java
@@ -19,7 +19,7 @@
 
 package org.apache.sling.remotecontent.samples.graphql;
 
-import org.apache.sling.remotecontent.documentmapper.api.DocumentMapper.UrlBuilder;
+import org.apache.sling.documentaggregator.api.DocumentAggregator.UrlBuilder;
 
 class UrlBuilderStub implements UrlBuilder {
     @Override
diff --git a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/annotations/AnnotationsRegistryImpl.java b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/annotations/AnnotationsRegistryImpl.java
index 4915be7..d220f3e 100644
--- a/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/annotations/AnnotationsRegistryImpl.java
+++ b/remote-content-api/sample-graphql-api/src/main/java/org/apache/sling/remotecontent/samples/graphql/annotations/AnnotationsRegistryImpl.java
@@ -22,8 +22,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.sling.remotecontent.documentmapper.api.Annotations;
-import org.apache.sling.remotecontent.documentmapper.api.AnnotationsRegistry;
+import org.apache.sling.documentaggregator.api.Annotations;
+import org.apache.sling.documentaggregator.api.AnnotationsRegistry;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 
diff --git a/remote-content-api/sample-graphql-api/src/main/resources/features/feature-sample-graphql-api.json b/remote-content-api/sample-graphql-api/src/main/resources/features/feature-sample-graphql-api.json
index 3a3b62c..5968071 100644
--- a/remote-content-api/sample-graphql-api/src/main/resources/features/feature-sample-graphql-api.json
+++ b/remote-content-api/sample-graphql-api/src/main/resources/features/feature-sample-graphql-api.json
@@ -7,6 +7,7 @@
   "variables":{},
   "bundles":[
     "org.apache.sling:org.apache.sling.experimental.remotecontent.sample.graphql.api:0.0.1-SNAPSHOT",
+    "org.apache.sling:org.apache.sling.document.aggregator:0.0.1-SNAPSHOT",
     "org.apache.sling:org.apache.sling.servlet-helpers:1.4.2",
     "org.apache.sling:org.apache.sling.graphql.core:0.0.8",
     "com.graphql-java:graphql-java:jar:15.0",