Merge pull request #48 from headwirecom/feature/SLING-9522

SLING-9522 - Added how-to series for the Feature Model
diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 0000000..0ff430a
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,7 @@
+github:
+  description: "Apache Sling Website"
+  homepage: "https://sling.apache.org/"
+  labels:
+    - sling
+    - website
+    - jbake
diff --git a/.gitignore b/.gitignore
index f373eb5..3311f97 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,5 +6,6 @@
 .*
 !.gitignore
 !.sling-module.json
+!.asf.yaml
 .DS_Store
 *.iml
diff --git a/README.md b/README.md
index 1508876..71c68d3 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,16 @@
 
 Please use a `sling.` prefix for new site-related variables in `jbake.properties`, to differentiate from JBake built-in variables.
 
+## Front Matter
+A number of Markdown front matter variables are taken into account, here's an example:
+
+    title=Tutorials & How-Tos               
+    type=page
+    status=published
+    tags=tutorials,beginner
+    tableOfContents=false
+    ~~~~~~
+
 ## Syntax highlighting
 The site uses [highlight.js](https://highlightjs.org/) for that.
 
@@ -54,6 +64,8 @@
  * Tamaya - https://github.com/apache/incubator-tamaya-site
  * OpenNLP - https://github.com/apache/opennlp-site
  * Incubator - https://github.com/apache/incubator
+ 
+And [this query for the `jbake` topic](https://github.com/search?q=topic%3Ajbake+org%3Aapache&type=Repositories) might find others.
 
 ## JBake and other technotes
 * Currently using 2.6.5 via the `jbake-maven-plugin`, see under `/bin`, docs at http://jbake.org/docs/2.6.5
diff --git a/src/main/jbake/content/documentation/bundles.md b/src/main/jbake/content/documentation/bundles.md
index d0aabee..6e39640 100644
--- a/src/main/jbake/content/documentation/bundles.md
+++ b/src/main/jbake/content/documentation/bundles.md
@@ -62,7 +62,7 @@
 * [Junit Server-Side Tests Support](/documentation/bundles/org-apache-sling-junit-bundles.html)
 * [Sling Pipes](/documentation/bundles/sling-pipes.html)
 * [Sling Metrics](/documentation/bundles/metrics.html)
-* [Servlet Helpers](/documentation/bundles/servlet-helpers.html)
+* [Servlet Helpers and Internal Requests](/documentation/bundles/servlet-helpers.html)
 * [Context-Aware Configuration](/documentation/bundles/context-aware-configuration/context-aware-configuration.html)
 * [HApi - Hypermedia API tools](/documentation/bundles/hapi.html)
 * [Capabilities](https://github.com/apache/sling-org-apache-sling-capabilities)
@@ -74,6 +74,7 @@
 * [XML Support](/documentation/bundles/xml-support.html)
 * [Sling Resource Editor](/documentation/bundles/resource-editor.html)
 * [Sling Dynamic Include (org.apache.sling.dynamic-include)](/documentation/bundles/dynamic-includes.html)
+* [GraphQL Core and Samples](/documentation/bundles/graphql-core.html)
 
 ## Troubleshooting
 * [Request Processing Analyzer (org.apache.sling.reqanalyzer)](/documentation/bundles/request-analysis.html)
diff --git a/src/main/jbake/content/documentation/bundles/content-distribution.md b/src/main/jbake/content/documentation/bundles/content-distribution.md
index 75551ee..90066d6 100644
--- a/src/main/jbake/content/documentation/bundles/content-distribution.md
+++ b/src/main/jbake/content/documentation/bundles/content-distribution.md
@@ -45,6 +45,18 @@
 
     $ curl -v -u admin:admin http://localhost:8080/libs/sling/distribution/services/agents/publish -d 'action=ADD' -d 'path=/content/sample1'
 
+#### Events
+
+The following OSGi [events|https://github.com/apache/sling-org-apache-sling-distribution-api/blob/master/src/main/java/org/apache/sling/distribution/event] will be raised during the forward distribution process.
+
+| Event                                                     | Instance |
+| --------------------------------------------------------- | -------- |
+| `org/apache/sling/distribution/agent/package/created`     | source   |
+| `org/apache/sling/distribution/agent/package/queued`      | source   |
+| `org/apache/sling/distribution/agent/package/distributed` | source   |
+| `org/apache/sling/distribution/agent/package/dropped`     | source   |
+| `org/apache/sling/distribution/importer/package/imported`    | target   |
+
 ### Reverse distribution
 
 A reverse distribution setup allows one to transfer content from a farm of source instances to a target instance. That is done by pulling the content from source instances into the target instance.
@@ -65,15 +77,15 @@
             packageExporter.endpoints=["http://localhost:4503/libs/sling/distribution/services/exporters/reverse"]
 
 * on source instance: one queue agent and one exporter for that agent
-            
+
         org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-reverse.json            
             name="reverse"
-            
+
         org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-reverse
             name="reverse"
             agent.target="(name=reverse)"
-            
-            
+
+
 #### Trigger reverse distribution
 
 Reverse distribution can be triggered by sending a `POST` HTTP request to the agent resource on the target instance with the parameter `action=PULL`.
@@ -105,19 +117,19 @@
 
 
 * on each farm instance: one local exporter and one local importer
-            
+
         org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-reverse.json            
             name="reverse"
-            
+
         org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-reverse
             name="reverse"
             agent.target="(name=reverse)"
-          
+
         org.apache.sling.distribution.packaging.impl.importer.LocalDistributionPackageImporterFactory-default
             name="reverse"
             agent.target="(name=reverse)"
 
-            
+
 
 
 ### Multidatacenter sync distribution
@@ -145,17 +157,17 @@
             packageExporter.endpoints=["http://localhost:4503/libs/sling/distribution/services/exporters/reverse", "http://localhost:4504/libs/sling/distribution/services/exporters/reverse"]
             packageImporter.endpoints=["http://localhost:4503/libs/sling/distribution/services/importers/default", "http://localhost:4504/libs/sling/distribution/services/importers/default"]
             passiveQueues=["dc2queue", "dc3queue"]
-            
+
         org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-dc2queue
             name="dc2queue"
             agent.target="(name=intradcsync)"
             queue="dc2queue"
-            
+
         org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-dc3queue
             name="dc3queue"
             agent.target="(name=intradcsync)"
             queue="dc3queue"
-            
+
         org.apache.sling.distribution.agent.impl.SyncDistributionAgentFactory-interdcsync           
             name="interdcsync"
             packageExporter.endpoints=["http://localhost:5502/libs/sling/distribution/services/exporters/dc1queue", "http://localhost:6502/libs/sling/distribution/services/exporters/dc1queue"]
@@ -163,14 +175,14 @@
 
 
 * on each farm instance: one local exporter and one local importer
-            
+
         org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-reverse.json            
             name="reverse"
-            
+
         org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-reverse
             name="reverse"
             agent.target="(name=reverse)"
-          
+
         org.apache.sling.distribution.packaging.impl.importer.LocalDistributionPackageImporterFactory-default
             name="default"
 
diff --git a/src/main/jbake/content/documentation/bundles/content-loading-jcr-contentloader.md b/src/main/jbake/content/documentation/bundles/content-loading-jcr-contentloader.md
index dc67019..aa59a23 100644
--- a/src/main/jbake/content/documentation/bundles/content-loading-jcr-contentloader.md
+++ b/src/main/jbake/content/documentation/bundles/content-loading-jcr-contentloader.md
@@ -4,7 +4,7 @@
 tags=contentloading,nodetypes
 ~~~~~~
 
-Apache Sling provides support for initial content loading into a repository and for registering node types. The `sling-jcr-contentloader` bundle provides loading of content from a bundle into the repository and the `sling-jcr-base` bundle provides node type registration.
+Apache Sling provides support for initial content loading into a repository and for registering node types. The `sling-jcr-contentloader` bundle provides loading of content from a bundle into the repository and the `sling-jcr-base` bundle provides node type registration. See [Content-Package based development](/documentation/development/content-packages.html) for an alternative for deploying content to the repository.
 
 ## Initial Content Loading
 
diff --git a/src/main/jbake/content/documentation/bundles/content-package-installer-factory.md b/src/main/jbake/content/documentation/bundles/content-package-installer-factory.md
index 91f6ea8..6371370 100644
--- a/src/main/jbake/content/documentation/bundles/content-package-installer-factory.md
+++ b/src/main/jbake/content/documentation/bundles/content-package-installer-factory.md
@@ -1,7 +1,7 @@
 title=Content Package Installer Factory		
 type=page
 status=published
-tags=installer
+tags=installer,contentloading
 ~~~~~~
 
 The content package installer factory provides support for [Jackrabbit FileVault Content Packages](https://jackrabbit.apache.org/filevault/index.html) to the [OSGI installer](/documentation/bundles/osgi-installer.html). The provisioning of artifacts is handled by installer providers like the [file installer](/documentation/bundles/file-installer-provider.html) or the [JCR installer](/documentation/bundles/jcr-installer-provider.html).
@@ -10,6 +10,29 @@
 
 Content Packages must be provided with extension `.zip`. They will be automatically installed/uninstalled via the [JcrPackageManager API](https://jackrabbit.apache.org/filevault/apidocs/org/apache/jackrabbit/vault/packaging/JcrPackageManager.html). The (un-)installation behaviour can be further tweaked via the OSGi configuration provided for PID `org.apache.sling.installer.factory.packages.impl.PackageTransformer`
 
+## Configuration
+
+As of version 1.0.4 the bundle requires a service user mapping to function correctly. An example mapping, using the provisioning model is
+
+
+    org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-installer-factories
+      user.mapping=[
+        "org.apache.sling.installer.factory.packages\=sling-package-install"
+      ]
+
+
+The service user requires needs access to all locations which are covered by packages and to `/etc/packages` itself.
+
+A sample user configuration using repoinit is
+
+
+    create service user sling-package-install
+
+    set ACL for sling-package-install
+        allow  jcr:all     on  /
+        allow  jcr:namespaceManagement,jcr:nodeTypeDefinitionManagement on :repository
+    end
+
 
 # Project Info
 
diff --git a/src/main/jbake/content/documentation/bundles/graphql-core.md b/src/main/jbake/content/documentation/bundles/graphql-core.md
new file mode 100644
index 0000000..9bd9bef
--- /dev/null
+++ b/src/main/jbake/content/documentation/bundles/graphql-core.md
@@ -0,0 +1,17 @@
+title=Sling GraphQL Core and Samples
+type=page
+status=published
+tags=graphql,content,query
+tableOfContents=false
+~~~~~~
+
+The [Sling GraphQL Core](https://github.com/apache/sling-org-apache-sling-graphql-core/) module 
+allows for running GraphQL queries in Sling, using dynamically built GraphQL schemas and OSGi
+services for data fetchers (aka "resolvers") which provide the data.
+
+See the [o.a.s.graphql.core Git repository](https://github.com/apache/sling-org-apache-sling-graphql-core/)
+for more information.
+
+The [GraphQL Sample Website module](https://github.com/apache/sling-samples/tree/master/org.apache.sling.graphql.samples.website)
+provides a complete sample which uses GraphQL queries (and Handlebars templates) on both the server and client sides,
+to demonstrate the various modes that the GraphQL Core module supports.
\ No newline at end of file
diff --git a/src/main/jbake/content/documentation/bundles/jcr-installer-provider.md b/src/main/jbake/content/documentation/bundles/jcr-installer-provider.md
index 3ee9ccb..ae82646 100644
--- a/src/main/jbake/content/documentation/bundles/jcr-installer-provider.md
+++ b/src/main/jbake/content/documentation/bundles/jcr-installer-provider.md
@@ -16,17 +16,17 @@
 
 The JCR installer provider does not check or scan the artifacts itself, the detection and installation is deferred to the OSGi installer.
 
-### Runmode Support
+## Run Mode Support
 
-The JCR installer supports run modes for installing artifacts. By default folders named `install` are checked for artifacts. If Apache Sling is started with one (or more run modes), all folders named `install.[RUNMODE]` are scanned as well. To be precise, the folder name can be followed by any number of run modes separated by dot (`.`). For example, if started with run modes `dev`, `a1`, and `public`, folders like `install.dev`, `install.a1`, `install.public` are searched as well as `install.dev.a1`, or `install.a1.dev`.
+The JCR installer supports [run modes](sling-settings-org-apache-sling-settings.html) for installing artifacts. By default folders named `install` are checked for artifacts. If Apache Sling is started with one (or more run modes), all folders named `install.[RUNMODE]` are scanned as well. To be precise, the folder name can be followed by any number of run modes separated by dot (`.`). For example, if started with run modes `dev`, `a1`, and `public`, folders like `install.dev`, `install.a1`, `install.public` are searched as well as `install.dev.a1`, or `install.a1.dev`.
 
 Artifacts from folders with a run mode get a higher priority. For example by default, an `install` folder underneath `/libs` gets the priority `50`. For each run mode in the folder name, this priority is increased by `1`, so `install.dev` has `51` and `install.a1.dev` has `52`.
 
-### Start Level Support
+## Start Level Support
 
 If the parent folder of a bundle has a name which is a number, this is used as the start level (when installing the bundle for the first time, compare with [SLING-2011](https://issues.apache.org/jira/browse/SLING-2011)). So e.g. a bundle in the path `/libs/sling/install/15/somebundle.jar` is having the start level `15`. 
 
-# Write Back Support
+## Write Back Support
 
 The JCR installer supports writing back of configurations which are changed by some other ways, e.g by using the Apache Felix web console. If this is a new configuration which was not originally stored in the repository, a new configuration is stored under `/apps/sling/install`. The highest search path is used together with a configurable folder (`sling/install` in this case).
 If a configuration is changed which already exists in the repository, then it depends where the original configuration is stored. If its under `/libs` a new configuration at the same path under `/apps` is created. Otherwise the configuration is directly modified.
@@ -34,6 +34,10 @@
 
 Write back can be turned off by configuration.
 
+## Pausing the provider
+
+In version 3.1.8 ([SLING-3747](https://issues.apache.org/jira/browse/SLING-3747)) a mechanism has been added which pauses the scanning of artifacts. Whenever there is at least one child node below `/system/sling/installer/jcr/pauseInstallation` (path configurable), the provider will be paused i.e. not provide any artifacts to the OSGi installer. This is reasonable to do while executing operations which rely on certain services not being restarted. Every deployment of new bundles and configurations might potentially lead to restarts of existing services, e.g. due to new bundles being picked up by the [Dynamic Class Loader Provider](https://lists.apache.org/thread.html/57d56e31da3c1cb743cf524e0c85e46959f3af9ed946f2c4a41d33c0@%3Cdev.sling.apache.org%3E) or new OSGi configurations leading to restarts of (transitively) bound services).
+
 # Example
 Here's a quick walkthrough of the JCR installer functionality.
 
diff --git a/src/main/jbake/content/documentation/bundles/osgi-installer.md b/src/main/jbake/content/documentation/bundles/osgi-installer.md
index 878c2ef..d807714 100644
--- a/src/main/jbake/content/documentation/bundles/osgi-installer.md
+++ b/src/main/jbake/content/documentation/bundles/osgi-installer.md
@@ -106,7 +106,10 @@
 
 The OSGi installer provides a [Sling Health Check](/documentation/bundles/sling-health-check-tool.html) which validates that the processed OSGi installer resources have the correct state ([SLING-5888](https://issues.apache.org/jira/browse/SLING-5888)).
 By default it will only check resources with a URL prefix `jcrinstall:/apps/`, so only the resources being provided through the [JCR Installer Provider](/documentation/bundles/jcr-installer-provider.html) initially located below the repository resource `/apps/` are considered.
+
 The health check will fail in the following cases:
+* Bundles Installation Failure
+* Configuration Installation Failure
 
 ### Bundles Installation Failure
 
diff --git a/src/main/jbake/content/documentation/bundles/repository-initialization.md b/src/main/jbake/content/documentation/bundles/repository-initialization.md
index 678cddc..86e7ec3 100644
--- a/src/main/jbake/content/documentation/bundles/repository-initialization.md
+++ b/src/main/jbake/content/documentation/bundles/repository-initialization.md
@@ -1,4 +1,4 @@
-title=Repository Initalization
+title=Repository Initialization
 type=page
 status=published
 tags=repoinit,jcr,repository
@@ -148,10 +148,11 @@
         allow jcr:namespaceManagement on :repository 
     end
 	
-	# register namespace requires 
-	# o.a.s.repoinit.parser 1.0.4
-	# and o.a.s.jcr.repoinit 1.0.2
-	register namespace ( NSprefix ) uri:someURI/v1.42
+    # register namespace requires 
+    # o.a.s.repoinit.parser 1.0.4
+    # and o.a.s.jcr.repoinit 1.0.2
+    # below registers a namespace with the prefix 'myprefix' and the uri 'http://my.prefix/content/v1.42'.
+    register namespace ( myprefix ) http://my.prefix/content/v1.42
 
 	# register nodetypes in CND format
 	# (same bundle requirements as register namespaces)
diff --git a/src/main/jbake/content/documentation/bundles/resource-filter.md b/src/main/jbake/content/documentation/bundles/resource-filter.md
index 851bbec..af83b3a 100644
--- a/src/main/jbake/content/documentation/bundles/resource-filter.md
+++ b/src/main/jbake/content/documentation/bundles/resource-filter.md
@@ -1,7 +1,7 @@
 title=Resource Filter		
 type=page
 status=published
-tags=requests
+tags=requests,query
 ~~~~~~
 
 [TOC]
diff --git a/src/main/jbake/content/documentation/bundles/servlet-helpers.md b/src/main/jbake/content/documentation/bundles/servlet-helpers.md
index e8f538d..1ffcb34 100644
--- a/src/main/jbake/content/documentation/bundles/servlet-helpers.md
+++ b/src/main/jbake/content/documentation/bundles/servlet-helpers.md
@@ -1,21 +1,103 @@
-title=Sling Servlet Helpers		
+title=Sling Servlet Helpers and Internal Requests
 type=page
 status=published
-tags=servlets
+tags=servlets,requests,scripts,servletresolver
 ~~~~~~
 
-The Sling Servlet Helpers bundle provides mock implementations of the
-`SlingHttpServletRequest`, `SlingHttpServletResponse` and related classes.
+The [Sling Servlet Helpers](https://github.com/apache/sling-org-apache-sling-servlet-helpers) 
+bundle provides mock implementations of the `SlingHttpServletRequest`, `SlingHttpServletResponse`
+and related classes, along with fluent `SlingInternalRequest` and `ServletInternalRequest`
+helpers for internal requests.
 
-Those mock implementations are meant to be used in tests and also with services
-like the `SlingRequestProcessor` when making requests to that service outside of
-an HTTP request processing context.
+The mock request/response implementations are meant to be used in tests and
+also with services like the `SlingRequestProcessor` when making requests to
+that service outside of an HTTP request processing context.
+
+They are used under the hood by the `SlingInternalRequest` and 
+`ServletInternalRequest` helpers to provide a simple and foolproof way
+of executing internal Sling requests.
+
+The [GraphQL Core](https://github.com/apache/sling-org-apache-sling-graphql-core/) module,
+for example, uses them for internal requests that retrieve a GraphQL schema dynamically,
+taking into account the current Resource and request selectors.
 
 See the [automated tests](https://github.com/apache/sling-org-apache-sling-servlet-helpers) 
-of the `servlet-helpers` module for more info.
+of the `servlet-helpers` module for more info, besides the general 
+descriptions found below.
 
 
-## Usage
+## InternalRequest helpers
+
+The internal request helpers use either a `SlingRequestProcessor` to execute internal requests using
+the full Sling request processing pipeline, or a `ServletResolver` to resolve and call a Servlet or Script
+directly. The necessary "mocking" of requests are responses happens under the hood which leads to much
+simpler code than using the mock request/response classes directly.
+
+The latter direct-to-servlet (or script) mode is more efficient but less faithful to the way HTTP requests
+are processed, as it bypasses all Servlet Filters, in particular.
+
+Here's an example using the `SlingInternalRequest` helper - see the test code for more. The
+`ServletInternalRequest` API is very similar but takes a `ServletResolver` and an actual `Resource`
+as its starting points.
+
+    OutputStream os = new SlingInternalRequest(resourceResolver, slingRequestProcessor, path)
+      .withResourceType("website/article/news")
+      .withResourceSuperType("website/article")
+      .withSelectors("print", "a4")
+      .withExtension("pdf")
+      .execute()
+      .checkStatus(200)
+      .checkResponseContentType("application/pdf")
+      .getResponse()
+      .getOutputStream()
+
+Not all servlets and scripts are suitable to be called by the `ServletInternalRequest`, depending
+on their "environmental" requirements like `Request` attributes for example.
+
+
+In case of doubt you can start with the `SlingInternalRequest` helper which uses the `SlingRequestProcessor`
+so that servlets or scripts should see no difference compared to HTTP requests. And once that works you can
+try the more efficient `ServletInternalRequest` helper to check if your scripts and servlets support
+that mode.
+
+In both cases, the standard [Sling Servlet/Script resolution mechanism](/documentation/the-sling-engine/servlets.html)
+is used, which can be useful to execute scripts that are resolved based on the current resource type, for non-HTTP
+operations. Inventing HTTP method names for this is fine and allows for reusing this powerful resolution mechanism
+in other contexts.
+
+### Troubleshooting internal requests
+
+To help map log messages to internal requests, as several of those might be used to handle a single
+HTTP request, the `InternalRequest` parent class of the helpers discussed above sets a log4j 
+_Mapped Diagnostic Context_ (MDC) value with the `sling.InternalRequest`key.
+
+The value of that key provides the essential attributes of the current request, so that using a log
+formatting pattern that displays it, like:
+
+    %-5level [%-50logger{50}] %message ## %mdc{sling.InternalRequest} %n
+
+Causes the internal request information to be logged, like in this example (lines folded
+for readability):
+
+    DEBUG [o.a.s.s.internalrequests.SlingInternalRequest     ]
+       Executing request using the SlingRequestProcessor
+       ## GET P=/content/tags/monitor+array S=null EXT=json RT=samples/tag(null)
+    WARN  [org.apache.sling.engine.impl.request.RequestData  ]
+      SlingRequestProgressTracker not found in request attributes
+      ## GET P=/content/tags/monitor+array S=null EXT=json RT=samples/tag(null)
+    DEBUG [o.a.s.s.resolver.internal.SlingServletResolver    ]
+      Using cached servlet /apps/samples/tag/json.gql
+      ## GET P=/content/tags/monitor+array S=null EXT=json RT=samples/tag(null)
+
+In these log messages, `GET P=/content/tags/monitor+array S=null EXT=json RT=samples/tag(null)` points
+to the current internal request, showing its method, path, selectors, extension, resource type and
+resource supertype.
+
+
+## Mock Request/Response classes
+
+These are useful for testing or if you need to do something that the internal request helpers
+do not support.
 
 ### SlingHttpServletRequest
 
@@ -82,3 +164,4 @@
 
     // validate response body as binary data
     assertArrayEquals(TEST_DATA, response.getOutput());
+    
diff --git a/src/main/jbake/content/documentation/bundles/sling-health-check-tool.md b/src/main/jbake/content/documentation/bundles/sling-health-check-tool.md
index 95d4ebe..2516646 100644
--- a/src/main/jbake/content/documentation/bundles/sling-health-check-tool.md
+++ b/src/main/jbake/content/documentation/bundles/sling-health-check-tool.md
@@ -32,7 +32,7 @@
 Typically necessary steps:
 
 * Use the `Organize Imports` functionality of your IDE to fix the imports (mostly it is just replacing `org.apache.sling.hc.api` with `org.apache.felix.hc.api`, however the commonly used class `FormattingResultLog` has been moved from `org.apache.sling.hc.util` to `org.apache.felix.hc.api`)
-* For the case the annotation `@SlingHealthCheck` is used, replace that one with the new Felix annotations from [org.apache.felix.healthcheck.annotation](https://github.com/apache/felix/blob/trunk/healthcheck/README.md#annotations-to-simplify-configuration-of-custom-health-checks)
+* For the case the annotation `@SlingHealthCheck` is used, replace that one with the new Felix annotations from [org.apache.felix.healthcheck.annotation](https://github.com/apache/felix-dev/blob/master/healthcheck/)
 * There is no `util` package in the api bundle anymore, apart from `FormattingResultLog` the other classes in the package were rarely used. The class `SimpleConstraintChecker` has moved to `org.apache.felix.hc.generalchecks.util` in bundle `generalchecks` (maven dependency to `org.apache.felix.healthcheck.generalchecks` needs to be added for that case). For the other classes there is no replacement.
 
 Only necessary if the the respective feature is used:
diff --git a/src/main/jbake/content/documentation/bundles/sling-query.md b/src/main/jbake/content/documentation/bundles/sling-query.md
index ccaf8c3..edaffb5 100644
--- a/src/main/jbake/content/documentation/bundles/sling-query.md
+++ b/src/main/jbake/content/documentation/bundles/sling-query.md
@@ -1,7 +1,7 @@
 title=Sling Query		
 type=page
 status=published
-tags=slingquery
+tags=slingquery,query
 ~~~~~~
 
 SlingQuery is a Sling resource tree traversal tool inspired by the [jQuery](http://api.jquery.com/category/traversing/tree-traversal/) JavaScript API.
diff --git a/src/main/jbake/content/documentation/development.md b/src/main/jbake/content/documentation/development.md
index ee0fd65..3a6ec93 100644
--- a/src/main/jbake/content/documentation/development.md
+++ b/src/main/jbake/content/documentation/development.md
@@ -16,6 +16,7 @@
 
 * [Getting and Building Sling](/documentation/development/getting-and-building-sling.html)
 * [Defining and Launching a Sling based Application](/documentation/development/slingstart.html)
+* [Content-Package based development](/documentation/development/content-packages.html)
 * [Embedding Sling](/documentation/development/embedding-sling.html)
 * [Logging](/documentation/development/logging.html)
 * [Client Request Logging](/documentation/development/client-request-logging.html)
diff --git a/src/main/jbake/content/documentation/development/content-packages.md b/src/main/jbake/content/documentation/development/content-packages.md
new file mode 100644
index 0000000..fcf1516
--- /dev/null
+++ b/src/main/jbake/content/documentation/development/content-packages.md
@@ -0,0 +1,115 @@
+title=Content-Package based development
+type=page
+status=published
+tags=development,contentloading
+~~~~~~
+
+# Content-Package based development
+
+Sling offers first-class support for [Apache Jackrabbit FileVault](https://jackrabbit.apache.org/filevault/) content packages. FileVault offers a way of mapping content on filesystem to the JCR repository and the other way around. Content packages are an alternative to [the content loader mechanism](/documentation/bundles/content-loading-jcr-contentloader.html), offering a richer tool set and better support for deploying additional entities, such as users, groups, and access control entries.
+
+There are three components of the content packages support:
+
+- client-side tooling for building and installing content packages
+- server-side support for installing content packages at runtime
+- server-side support for installing content packages at build time
+
+The server-side support for Apache Sling is made of:
+
+- the [Composum Package Manager](https://www.composum.com/home/nodes/pckgmgr.html), implementing the HTTP API that receives and installs content packages
+- the [Apache Sling Content Package Installer Factory](/documentation/bundles/content-package-installer-factory.html), allowing the deployment of content packages at build time.
+
+Content packages can be included at build time using either the [provisioning model](/documentation/development/slingstart.html) or the [feature model](/documentation/development/feature-model.html).
+
+The client-side support depends on the toolset used to build the project.
+
+For Maven projects, this support consists of
+
+- the [filevault-package-maven-plugin](https://jackrabbit.apache.org/filevault-package-maven-plugin/) builds content packages from Maven projects
+- the [wcmio-content-package-maven-plugin](https://wcm.io/tooling/maven/plugins/wcmio-content-package-maven-plugin/) uploads content packages at runtime to a Sling instance using an HTTP API
+
+For Javascript projects, the suport consists of the [Sling Packager](https://github.com/apache/sling-slingpackager/).
+
+## Creating a content package
+
+### Maven projects
+
+There are two options for getting started with content package projects via Maven.
+
+The first one is the [Sling Project Archetype](https://github.com/apache/sling-project-archetype), which creates a multi-module project that includes content packages as part of its output. To use it, run the following command
+
+    $ mvn archetype:generate -Dfilter=org.apache.sling:sling-project-archetype
+
+then select the latest version of the archetype and fill in the required information.
+
+The second one is [Content-Package Archetype](https://github.com/apache/sling-content-package-archetype) , which creates a single content package. Similar to the `sling-project-archetype`, generating a project only requires:
+
+    $ mvn archetype:generate -Dfilter=org.apache.sling:sling-content-archetype
+
+Using one archetype or the other is largely a matter of preference. The `sling-project-archetype` takes a more batteries-included approach, while the `sling-content-archetype` creates only a minimal content package.
+
+### Node projects
+
+An example project using the Sling Packager can be found at [peregrine-cms/simple-sling-vue-example](https://github.com/peregrine-cms/simple-sling-vue-example) on GitHub.
+
+## Deploying a content package at runtime
+
+### Maven projects
+
+Building a content package is achieved using the Maven command line
+
+    $ mvn package
+    
+After starting up Sling, the resulting file can then be deployed using the wcmio-content-package-maven-plugin
+
+    $ mvn wcmio-content-package:install
+   
+### Node projects
+
+Content packages are built with
+
+    $ npx slingpackager package <folder>
+
+After starting up Sling, the resulting file can then be deployed with
+
+    $ npx slingpackager upload <content-package.zip> -i
+ 
+### Composum UI
+
+The [Composum package manager](https://www.composum.com/home/nodes/pckgmgr.html) allows performing multiple operations through its user interface. To access the package manager, ensure that you are logged in to the Sling Starter and then navigate to the Composum Package Manager at [http://localhost:8080/bin/packages.html](http://localhost:8080/bin/packages.html).
+
+Some of the possible operations are:
+
+- building content packages from existing content
+- uploading and installing existing content packages
+- uninstalling existing content packages
+
+### OSGi Installer
+
+Installing packages through the [OSGi installer](../bundles/osgi-installer.html) is supported via the [Content Package Installer Factory](../bundles/content-package-installer-factory.html).
+
+### Notes
+
+Inspecting the content package reveals that is is just a ZIP file with additional metadata. Of definite interest are the manifest - `META-INF/MANIFEST.MF` and the filter definition - `META-INF/vault/filter.xml`. More information can be found at <https://jackrabbit.apache.org/filevault/metadata.html>.
+
+The [Sling IDE Tooling](/documentation/development/ide-tooling.html) has support for exporting and importing content incrementally to a Sling instance, and can be used alongside the Maven-based tooling.
+
+## Installing a content package at build time
+
+For the content package to be installed at build time, it must be available in a Maven repository at the time when the Sling application is built.
+
+For the provisioning model, the content package must be added to an `artifacts` section, with the zip extension.
+
+    [feature name=my-app]
+
+    [artifacts]
+      org.apache.sling.sample/org.apache.sling.sample001/1.0-SNAPSHOT/zip
+      
+For the feature model, the content package must be added to the `content-packages` section, also with a zip extension:
+
+    {
+      "id": "...",
+      "content-packages:ARTIFACTS|true": [
+        "org.apache.sling.sample:org.apache.sling.sample001:zip:1.0-SNAPSHOT"
+      ]
+    }
diff --git a/src/main/jbake/content/releases.md b/src/main/jbake/content/releases.md
index 3d4a583..5d478d6 100644
--- a/src/main/jbake/content/releases.md
+++ b/src/main/jbake/content/releases.md
@@ -6,8 +6,17 @@
 ~~~~~~
 This is a list of all our releases, available from our [downloads](/downloads.cgi) page.
 
+## June 2020
+
+* Models Validation Implementation 1.0.0 (10th)
+
 ## May 2020
 
+* Installer Factory Feature 0.4.0 (28th)
+* Sling Project Archetype 1.0.4, Sling Kickstart Project 0.0.2, Sling Kickstart Maven Plugin 0.0.2 (18th) 
+* Parent 39, Bundle Parent 39, JAR Resource Bundle 1.0.2 (14th)
+* Archetype Parent 6 (12th)
+* Slingfeature Maven Plugin 1.3.0, Installer Packages Factory 1.0.4, Form Based Authentication 1.0.20 (11th)
 * Installer Factory Feature Model 0.3.0 (6th)
 * Installer Factory Feature Model 0.2.0, Slingfeature Maven Plugin 1.2.4, Slingstart Maven Plugin 1.9.12 (3rd)
 * Installer Core 3.11.4, Testing JCR Mock 1.4.6, Testing OSGi Mock 2.4.16, Testing Sling Mock 2.5.0, Testing Sling Mock Oak 2.1.10-1.16.0 (2nd)
diff --git a/src/main/jbake/templates/downloads.tpl b/src/main/jbake/templates/downloads.tpl
index 9471fbd..95eed45 100644
--- a/src/main/jbake/templates/downloads.tpl
+++ b/src/main/jbake/templates/downloads.tpl
@@ -35,10 +35,11 @@
   "Maven Launchpad Plugin|maven-launchpad-plugin|2.3.4|Y",
   "Scripting Bundle Maven Plugin 0.1.0|scriptingbundle-maven-plugin|0.1.0|Y",
   "Sling Maven Plugin|sling-maven-plugin|2.4.2|Y",
-  "Sling Feature Maven Plugin|slingfeature-maven-plugin|1.2.4|Y",
+  "Sling Feature Maven Plugin|slingfeature-maven-plugin|1.3.0|Y",
   "Sling Feature Converter Maven Plugin|sling-feature-converter-maven-plugin|1.0.4|Y",
   "Slingstart Maven Plugin|slingstart-maven-plugin|1.9.12|Y",
   "HTL Maven Plugin|htl-maven-plugin|1.3.4-1.4.0|Y",
+  "Sling Kickstart Maven Plugin|sling-kickstart-maven-plugin|0.0.2|Y",
 ]
 
 def bndPlugins=[
@@ -50,7 +51,7 @@
   "Adapter Annotations|adapter-annotations|1.0.0|Y|jar",
   "API|org.apache.sling.api|2.22.0|Y|jar",
   "Auth Core|org.apache.sling.auth.core|1.4.6|Y|jar",
-  "Auth Form|org.apache.sling.auth.form|1.0.14|Y|jar",
+  "Form Based Authentication|org.apache.sling.auth.form|1.0.20|Y|jar",
   "Authentication XING API|org.apache.sling.auth.xing.api|0.0.2|Y|jar",
   "Authentication XING Login|org.apache.sling.auth.xing.login|0.0.2|Y|jar",
   "Authentication XING OAuth|org.apache.sling.auth.xing.oauth|0.0.2|Y|jar",
@@ -135,10 +136,10 @@
   "Health Check Support|org.apache.sling.hc.support|1.0.6|Y|jar",
   "Health Check JUnit Bridge|org.apache.sling.hc.junit.bridge|1.0.2|Y|jar",
   "Installer Core|org.apache.sling.installer.core|3.11.4|Y|jar",
-  "Installer Configuration Support|org.apache.sling.installer.factory.configuration|1.3.0|Y|jar",
+  "Installer Configuration Support|org.apache.sling.installer.factory.configuration|1.3.2|Y|jar",
   "Installer Console|org.apache.sling.installer.console|1.1.0|Y|jar",
-  "Installer Content Package Support|org.apache.sling.installer.factory.packages|1.0.2|Y|jar",
-  "Installer Factory Feature Model|org.apache.sling.installer.factory.model|0.3.0|Y|jar",
+  "Installer Content Package Support|org.apache.sling.installer.factory.packages|1.0.4|Y|jar",
+  "Installer Factory Feature Model|org.apache.sling.installer.factory.model|0.4.0|Y|jar",
   "Installer File Provider|org.apache.sling.installer.provider.file|1.2.2|Y|jar",
   "Installer Health Checks|org.apache.sling.installer.hc|2.0.2|Y|jar",
   "Installer JCR Provider|org.apache.sling.installer.provider.jcr|3.2.2|Y|jar",
@@ -166,6 +167,7 @@
   "JUnit Scriptable Tests Provider|org.apache.sling.junit.scriptable|1.0.12|Y|jar",
   "JUnit Tests Teleporter|org.apache.sling.junit.teleporter|1.0.20|Y|jar",
   "JUnit Health Checks|org.apache.sling.junit.healthcheck|1.0.6|Y|jar",
+  "Kickstart Project|org.apache.sling.kickstart|0.0.2|Y|jar",
   "Launchpad API|org.apache.sling.launchpad.api|1.2.0|Y|jar",
   "Launchpad Base|org.apache.sling.launchpad.base|6.0.2-2.6.36|Y|jar",
   "Launchpad Base - Application Launcher|org.apache.sling.launchpad.base|6.0.2-2.6.36|Y|war",
@@ -183,6 +185,7 @@
   "Models bnd Plugin|org.apache.sling.bnd.models|1.0.0|Y|jar",
   "Models Implementation|org.apache.sling.models.impl|1.4.12|Y|jar",
   "Models Jackson Exporter|org.apache.sling.models.jacksonexporter|1.0.8|Y|jar",
+  "Models Validation Implementation|org.apache.sling.models.validation-impl|1.0.0|Y|jar",
   "NoSQL Generic Resource Provider|org.apache.sling.nosql.generic|1.1.0|Y|jar",
   "NoSQL Couchbase Client|org.apache.sling.nosql.couchbase-client|1.0.2|Y|jar",
   "NoSQL Couchbase Resource Provider|org.apache.sling.nosql.couchbase-resourceprovider|1.1.0|Y|jar",