You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by dk...@apache.org on 2019/06/13 23:04:15 UTC

[sling-org-apache-sling-app-cms] branch dklco/conf-cleanup created (now c253ab1)

This is an automated email from the ASF dual-hosted git repository.

dklco pushed a change to branch dklco/conf-cleanup
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-app-cms.git.


      at c253ab1  Initial crack at a better structure for the /conf content and fixing the breadcrumbs

This branch includes the following new commits:

     new 1a40627  Fixing an issue where the reload content is cached in browser
     new c253ab1  Initial crack at a better structure for the /conf content and fixing the breadcrumbs

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[sling-org-apache-sling-app-cms] 01/02: Fixing an issue where the reload content is cached in browser

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dklco pushed a commit to branch dklco/conf-cleanup
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-app-cms.git

commit 1a406273e27c727b0fae9c708d47b71b82063d42
Author: Dan Klco <dk...@apache.org>
AuthorDate: Wed Jun 12 22:10:49 2019 -0500

    Fixing an issue where the reload content is cached in browser
---
 ui/src/main/frontend/src/js/cms.js | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/ui/src/main/frontend/src/js/cms.js b/ui/src/main/frontend/src/js/cms.js
index 0a8355b..6130912 100644
--- a/ui/src/main/frontend/src/js/cms.js
+++ b/ui/src/main/frontend/src/js/cms.js
@@ -109,6 +109,11 @@
                     containers.forEach(function (container) {
                         var request = new XMLHttpRequest(),
                             link = container.dataset.path;
+                        if (link.indexOf('?') === -1) {
+                            link += '?tstamp=' + Date.now();
+                        } else {
+                            link += '&tstamp=' + Date.now();
+                        }
                         request.open('GET', link, true);
                         request.onload = function () {
                             var tmp = document.createElement('div');


[sling-org-apache-sling-app-cms] 02/02: Initial crack at a better structure for the /conf content and fixing the breadcrumbs

Posted by dk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dklco pushed a commit to branch dklco/conf-cleanup
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-app-cms.git

commit c253ab1cec4efb3bcb40128b0159025d8fa56a69
Author: Dan Klco <dk...@apache.org>
AuthorDate: Thu Jun 13 18:03:47 2019 -0500

    Initial crack at a better structure for the /conf content and fixing the breadcrumbs
---
 .../sling/cms/core/insights/impl/FakeResponse.java |   4 +-
 .../cms/core/insights/impl/InsightFactoryImpl.java |   4 +-
 .../core/internal/ResourceEditorAssociation.java   |  80 +++++++++++++
 .../internal/ResourceEditorAssociationConfig.java  |  37 ++++++
 .../ResourceEditorAssociationProvider.java         |  38 +++++++
 .../sling/cms/core/models/ContentBreadcrumb.java   | 126 +++++++++++++++++++++
 .../apache/sling/cms/core/models/package-info.java |   2 +-
 .../main/resources/OSGI-INF/l10n/bundle.properties |  26 ++++-
 .../internal/ResourceEditorAssociationTest.java    |  94 +++++++++++++++
 ui/src/main/resources/jcr_root/conf/global.json    |  30 +++--
 .../caconfig/fileeditor/config/edit.json           |  42 +++----
 .../sling-cms/components/caconfig/readability.json |   6 +-
 .../sling-cms/components/caconfig/rewriter.json    |   6 +-
 .../components/caconfig/rewriter/config.json       |   4 +
 .../rewriter/{rewriter.jsp => config/config.jsp}   |  24 ++--
 .../components/caconfig/rewriter/config/edit.json  |  25 ++++
 .../components/caconfig/rewriter/edit.json         |  25 ----
 .../rewriter/{rewriter.jsp => include.jsp}         |  16 +--
 .../components/caconfig/sitesettings.json          |   6 +-
 .../components/caconfig/sitesettings/config.json   |   4 +
 .../{sitesettings.jsp => config/config.jsp}        |   0
 .../caconfig/sitesettings/{ => config}/edit.json   |   0
 .../sitesettings/{sitesettings.jsp => include.jsp} |   8 +-
 .../sling-cms/components/caconfig/templates.json   |   5 +
 .../{site/site.jsp => templates/templates.jsp}     |  13 +--
 .../cms/contentbreadcrumb/contentbreadcrumb.jsp    |  31 ++---
 .../content/config/{list.json => bucket.json}      |  63 +----------
 .../{taxonomy/list.json => config/buckets.json}    |  32 +++---
 .../{taxonomy/list.json => config/configs.json}    |  32 +++---
 .../libs/sling-cms/content/config/create.json      |   8 +-
 .../libs/sling-cms/content/config/edit.json        |   6 -
 .../libs/sling-cms/content/site/content.json       |   5 +-
 .../libs/sling-cms/content/site/sites.json         |   5 +-
 .../libs/sling-cms/content/siteconfig/editor.json  |  15 +--
 .../jcr_root/libs/sling-cms/content/start.json     |   4 +-
 .../libs/sling-cms/content/static/content.json     |   5 +-
 .../libs/sling-cms/content/taxonomy/list.json      |   3 +-
 .../sling-cms/content/usergenerated/content.json   |   3 +-
 ...nal.ResourceEditorAssociation-confbucket.config |  20 ++++
 ...al.ResourceEditorAssociation-confbuckets.config |  20 ++++
 ...ernal.ResourceEditorAssociation-confroot.config |  20 ++++
 ....internal.ResourceEditorAssociation-site.config |  21 ++++
 ...al.ResourceEditorAssociation-sitecontent.config |  21 ++++
 ...internal.ResourceEditorAssociation-sites.config |  22 ++++
 ...nternal.ResourceEditorAssociation-static.config |  20 ++++
 ...ernal.ResourceEditorAssociation-taxonomy.config |  20 ++++
 ...e.internal.ResourceEditorAssociation-ugc.config |  20 ++++
 47 files changed, 752 insertions(+), 269 deletions(-)

diff --git a/core/src/main/java/org/apache/sling/cms/core/insights/impl/FakeResponse.java b/core/src/main/java/org/apache/sling/cms/core/insights/impl/FakeResponse.java
index 2827c11..bbe8933 100644
--- a/core/src/main/java/org/apache/sling/cms/core/insights/impl/FakeResponse.java
+++ b/core/src/main/java/org/apache/sling/cms/core/insights/impl/FakeResponse.java
@@ -166,7 +166,7 @@ public class FakeResponse implements HttpServletResponse {
 
     @Override
     public void reset() {
-        throw new UnsupportedOperationException();
+        // do nothing
     }
 
     @Override
@@ -226,7 +226,7 @@ public class FakeResponse implements HttpServletResponse {
 
     @Override
     public void setLocale(Locale locale) {
-        throw new UnsupportedOperationException();
+        // do nothing
     }
 
     @Override
diff --git a/core/src/main/java/org/apache/sling/cms/core/insights/impl/InsightFactoryImpl.java b/core/src/main/java/org/apache/sling/cms/core/insights/impl/InsightFactoryImpl.java
index 37986d0..9932b48 100644
--- a/core/src/main/java/org/apache/sling/cms/core/insights/impl/InsightFactoryImpl.java
+++ b/core/src/main/java/org/apache/sling/cms/core/insights/impl/InsightFactoryImpl.java
@@ -31,7 +31,7 @@ import org.apache.sling.cms.insights.InsightRequest;
 import org.apache.sling.engine.SlingRequestProcessor;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
 
 /**
  * Implementation of the InsightFactory service interface
@@ -39,7 +39,7 @@ import org.osgi.service.component.annotations.ReferenceCardinality;
 @Component(immediate = true, service = { InsightFactory.class })
 public class InsightFactoryImpl implements InsightFactory {
 
-    @Reference(cardinality = ReferenceCardinality.MULTIPLE)
+    @Reference(policyOption = ReferencePolicyOption.GREEDY)
     private List<InsightProvider> providers;
 
     @Reference
diff --git a/core/src/main/java/org/apache/sling/cms/core/internal/ResourceEditorAssociation.java b/core/src/main/java/org/apache/sling/cms/core/internal/ResourceEditorAssociation.java
new file mode 100644
index 0000000..c431830
--- /dev/null
+++ b/core/src/main/java/org/apache/sling/cms/core/internal/ResourceEditorAssociation.java
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ */
+package org.apache.sling.cms.core.internal;
+
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.resource.Resource;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.metatype.annotations.Designate;
+
+/**
+ * OSGi Component for setting the editor based on a path pattern. Used for
+ * constructing breadcrumbs.
+ */
+@Component(service = ResourceEditorAssociation.class, configurationPolicy = ConfigurationPolicy.REQUIRE, immediate = true)
+@Designate(ocd = ResourceEditorAssociationConfig.class, factory = true)
+public class ResourceEditorAssociation {
+
+    private Pattern pathPattern;
+    private String editor;
+    private String resourceType;
+    private String parentType;
+
+    @Activate
+    public void activate(ResourceEditorAssociationConfig config) {
+        this.pathPattern = Pattern.compile(config.pathPattern());
+        this.editor = config.editor();
+        this.resourceType = config.resourceType();
+        this.parentType = config.parentType();
+    }
+
+    public boolean matches(Resource resource) {
+        if (StringUtils.isNotBlank(parentType) && !hasParentType(resource)) {
+            return false;
+        }
+        if (StringUtils.isNotBlank(resourceType) && !resourceType.equals(resource.getResourceType())) {
+            return false;
+        }
+        return pathPattern.matcher(resource.getPath()).matches();
+    }
+
+    private boolean hasParentType(Resource resource) {
+        Resource parent = resource.getParent();
+        if (parent != null && !parent.getResourceType().equals(parentType)) {
+            return hasParentType(parent);
+        }
+        return parent != null && parent.getResourceType().equals(parentType);
+    }
+
+    public String getEditor() {
+        return editor;
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        return "ResourceEditorAssociation [pathPattern=" + pathPattern + ", editor=" + editor + ", resourceType="
+                + resourceType + ", parentType=" + parentType + "]";
+    }
+
+}
diff --git a/core/src/main/java/org/apache/sling/cms/core/internal/ResourceEditorAssociationConfig.java b/core/src/main/java/org/apache/sling/cms/core/internal/ResourceEditorAssociationConfig.java
new file mode 100644
index 0000000..644d36c
--- /dev/null
+++ b/core/src/main/java/org/apache/sling/cms/core/internal/ResourceEditorAssociationConfig.java
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+package org.apache.sling.cms.core.internal;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+@ObjectClassDefinition(name = "%cms.resource.editor.assn.name", description = "%cms.resource.editor.assn.name", localization = "OSGI-INF/l10n/bundle")
+public @interface ResourceEditorAssociationConfig {
+
+    @AttributeDefinition(name = "%editor.name", description = "%editor.description")
+    String editor();
+
+    @AttributeDefinition(name = "%parentType.name", description = "%parentType.description")
+    String parentType();
+
+    @AttributeDefinition(name = "%path.pattern.name", description = "%path.pattern.description")
+    String pathPattern();
+
+    @AttributeDefinition(name = "%resourceType.name", description = "%resourceType.description")
+    String resourceType();
+
+}
diff --git a/core/src/main/java/org/apache/sling/cms/core/internal/ResourceEditorAssociationProvider.java b/core/src/main/java/org/apache/sling/cms/core/internal/ResourceEditorAssociationProvider.java
new file mode 100644
index 0000000..f1d09b7
--- /dev/null
+++ b/core/src/main/java/org/apache/sling/cms/core/internal/ResourceEditorAssociationProvider.java
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+package org.apache.sling.cms.core.internal;
+
+import java.util.List;
+
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
+
+/**
+ * Service for retrieving the ResourceEditorAssociation configurations.
+ */
+@Component(service = ResourceEditorAssociationProvider.class)
+public class ResourceEditorAssociationProvider {
+
+    @Reference(policyOption = ReferencePolicyOption.GREEDY)
+    private List<ResourceEditorAssociation> associations;
+
+    public List<ResourceEditorAssociation> getAssociations() {
+        return associations;
+    }
+
+}
diff --git a/core/src/main/java/org/apache/sling/cms/core/models/ContentBreadcrumb.java b/core/src/main/java/org/apache/sling/cms/core/models/ContentBreadcrumb.java
new file mode 100644
index 0000000..7205807
--- /dev/null
+++ b/core/src/main/java/org/apache/sling/cms/core/models/ContentBreadcrumb.java
@@ -0,0 +1,126 @@
+/*
+ * 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.
+ */
+package org.apache.sling.cms.core.models;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.annotation.PostConstruct;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.cms.CMSConstants;
+import org.apache.sling.cms.core.internal.ResourceEditorAssociation;
+import org.apache.sling.cms.core.internal.ResourceEditorAssociationProvider;
+import org.apache.sling.models.annotations.Model;
+import org.apache.sling.models.annotations.injectorspecific.OSGiService;
+import org.osgi.annotation.versioning.ProviderType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Model for constructing the content breadcrumb.
+ */
+@ProviderType
+@Model(adaptables = SlingHttpServletRequest.class)
+public class ContentBreadcrumb {
+
+    private static final Logger log = LoggerFactory.getLogger(ContentBreadcrumb.class);
+
+    private long depth;
+
+    private List<Pair<String, String>> parents;
+
+    @OSGiService
+    private ResourceEditorAssociationProvider provider;
+
+    private Resource resource;
+
+    private String rootTitle;
+
+    public ContentBreadcrumb(SlingHttpServletRequest request) {
+        this.resource = request.getRequestPathInfo().getSuffixResource();
+
+        log.debug("Loading configuration from {}", request.getResource().getValueMap());
+        depth = request.getResource().getValueMap().get("depth", 0L);
+        rootTitle = request.getResource().getValueMap().get("rootTitle", String.class);
+
+    }
+
+    public String getCurrentItem() {
+        if ((parents == null || parents.isEmpty()) && StringUtils.isNotBlank(rootTitle)) {
+            return rootTitle;
+        }
+        return getTitle(resource);
+    }
+
+    private String getLink(Resource resource) {
+        log.debug("Getting link for {} from {}", resource, provider.getAssociations());
+        return provider.getAssociations().stream().filter(a -> a.matches(resource)).findFirst()
+                .map(ResourceEditorAssociation::getEditor).orElse("/bin/browser.html") + resource.getPath();
+    }
+
+    public List<Pair<String, String>> getParents() {
+        return parents;
+    }
+
+    private String getTitle(Resource resource) {
+        String title = resource.getValueMap().get(CMSConstants.PN_TITLE, String.class);
+        if (StringUtils.isNotBlank(title)) {
+            return title;
+        }
+        title = resource.getValueMap().get(JcrConstants.JCR_CONTENT + "/" + CMSConstants.PN_TITLE, String.class);
+        if (StringUtils.isNotBlank(title)) {
+            return title;
+        }
+        return resource.getName();
+    }
+
+    @PostConstruct
+    public void init() {
+        List<Resource> ps = new ArrayList<>();
+
+        Resource current = resource;
+        while (true) {
+            Resource parent = current.getParent();
+            if (parent != null) {
+                ps.add(parent);
+                current = parent;
+            } else {
+                break;
+            }
+        }
+        Collections.reverse(ps);
+
+        if (depth <= ps.size()) {
+            ps = ps.subList((int) depth, ps.size());
+        } else {
+            ps.clear();
+        }
+
+        parents = ps.stream().map(p -> new ImmutablePair<>(getLink(p), getTitle(p))).collect(Collectors.toList());
+        if (!parents.isEmpty() && StringUtils.isNotBlank(rootTitle)) {
+            parents.set(0, new ImmutablePair<>(parents.get(0).getLeft(), rootTitle));
+        }
+    }
+}
diff --git a/core/src/main/java/org/apache/sling/cms/core/models/package-info.java b/core/src/main/java/org/apache/sling/cms/core/models/package-info.java
index 783e35b..7e393d6 100644
--- a/core/src/main/java/org/apache/sling/cms/core/models/package-info.java
+++ b/core/src/main/java/org/apache/sling/cms/core/models/package-info.java
@@ -20,7 +20,7 @@
 /**
  * Package with all of the core models used to support the Sling reference CMS
  */
-@Version("2.1.0")
+@Version("2.2.0")
 package org.apache.sling.cms.core.models;
 
 import org.osgi.annotation.versioning.Version;
diff --git a/core/src/main/resources/OSGI-INF/l10n/bundle.properties b/core/src/main/resources/OSGI-INF/l10n/bundle.properties
index b1c254b..1b9cefc 100644
--- a/core/src/main/resources/OSGI-INF/l10n/bundle.properties
+++ b/core/src/main/resources/OSGI-INF/l10n/bundle.properties
@@ -50,7 +50,7 @@ attributes using Sling Mappings
 enabledPaths.name=Enabled Paths
 enabledPaths.description=Paths under which this transformer will be enabled
 
-# Name Generator Entries
+## Name Generator Entries
 cms.name.generator.name=Apache Sling CMS Property Hint Name Generator
 cms.name.generator.description=Node Name generator for the Sling Post servlet \
 which uses the value of a named node for generating the name of a newly created \
@@ -64,7 +64,7 @@ replacement.char.name=Replacement Character
 replacement.char.description=A character with which to replace any non-allowed \
 characters in the name 
 
-# User Generated Content
+## User Generated Content
 ugc.name=Apache Sling CMS User Generated Content
 ugc.description=Service for creating buckets of User Generated Content
 
@@ -78,7 +78,7 @@ under the bucket. This will be sliced off the UUID, so if you had a UUID of 123
 a bucket of bob and a path depth of 1, this would yield a path like: bob/1/123. \
 This can be overridden by the path depth in the UGCBucketConfig.
 
-#Versioning Listener
+## Versioning Listener
 cms.autoversioning.name=Apache Sling CMS Auto-Versioning
 cms.autoversioning.description=A Resource Change listener to automatically version pages \
 which are published, unpublished or updated having not been versioned in a defined time \
@@ -93,7 +93,7 @@ cms.autoversioning.cutoff.description=The cutoff for determine if the page shoul
 auto-versioned. If the page has was last versioned before the cutoff, the page will be \
 versioned.
 
-# Path Suggestion Servlet
+## Path Suggestion Servlet
 pathsuggestionservlet.name=Apache Sling CMS Path Suggestion Servlet
 pathsuggestionservlet.description=A servlet for providing suggested paths based \
 on a stemmed path
@@ -133,4 +133,20 @@ pagespeed.param.enabled.name=Enabled
 pagespeed.param.enabled.description=Whether or not the Page Speed Insight service is enabled
 
 pagespeed.param.apikey.name=API Key
-pagespeed.param.apikey.description=The API key Google Cloud, see: https://developers.google.com/speed/docs/insights/
\ No newline at end of file
+pagespeed.param.apikey.description=The API key Google Cloud, see: https://developers.google.com/speed/docs/insights/
+
+## Resource Editor Association
+cms.resource.editor.assn.name=Apache Sling CMS - Resource Editor Association
+cms.resource.editor.assn.description=OSGi configuration for associating types and path patterns to an editor in Sling CMS
+
+path.pattern.name=Path Pattern
+path.pattern.description=A regular expression for determining if the resource matches the editor association
+
+editor.name=Editor Prefix
+editor.description=A URL prefix for the editor for this association
+
+resourceType.name=Resource Type
+resourceType.description=The resource type to determine if the resource matches the editor association, if not specified all resource types are supported
+
+parentType.name=Parent Resource Type
+parentType.description=To be considered matching, the resource must have a parent of the specified type, it not specified will not be evaluated
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/sling/cms/core/internal/ResourceEditorAssociationTest.java b/core/src/test/java/org/apache/sling/cms/core/internal/ResourceEditorAssociationTest.java
new file mode 100644
index 0000000..2410942
--- /dev/null
+++ b/core/src/test/java/org/apache/sling/cms/core/internal/ResourceEditorAssociationTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.
+ */
+package org.apache.sling.cms.core.internal;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.annotation.Annotation;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.cms.CMSConstants;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class ResourceEditorAssociationTest {
+
+    private ResourceEditorAssociation rea;
+
+    @Before
+    public void init() {
+        rea = new ResourceEditorAssociation(new ResourceEditorAssociationConfig() {
+
+            @Override
+            public Class<? extends Annotation> annotationType() {
+                return null;
+            }
+
+            @Override
+            public String pathPattern() {
+                return "/content.*";
+            }
+
+            @Override
+            public String editor() {
+                return "/cms/site/sites.html";
+            }
+
+            @Override
+            public String resourceType() {
+                return CMSConstants.NT_SITE;
+            }
+
+            @Override
+            public String parentType() {
+                return null;
+            }
+        });
+    }
+
+    @Test
+    public void testMatching() {
+        Resource matching = Mockito.mock(Resource.class);
+        Mockito.when(matching.getPath()).thenReturn("/content/sling-adobe-org");
+        Mockito.when(matching.getResourceType()).thenReturn(CMSConstants.NT_SITE);
+
+        assertTrue(rea.matches(matching));
+
+        assertEquals("/cms/site/sites.html", rea.getEditor());
+    }
+
+    @Test
+    public void testNonMatchingType() {
+        Resource matching = Mockito.mock(Resource.class);
+        Mockito.when(matching.getPath()).thenReturn("/content/sling-adobe-org");
+        Mockito.when(matching.getResourceType()).thenReturn(CMSConstants.NT_PAGE);
+
+        assertFalse(rea.matches(matching));
+    }
+
+    @Test
+    public void testNonMatchingPath() {
+        Resource matching = Mockito.mock(Resource.class);
+        Mockito.when(matching.getPath()).thenReturn("/conf/sling");
+        Mockito.when(matching.getResourceType()).thenReturn(CMSConstants.NT_SITE);
+
+        assertFalse(rea.matches(matching));
+    }
+}
diff --git a/ui/src/main/resources/jcr_root/conf/global.json b/ui/src/main/resources/jcr_root/conf/global.json
index 28bec56..11c4fd0 100644
--- a/ui/src/main/resources/jcr_root/conf/global.json
+++ b/ui/src/main/resources/jcr_root/conf/global.json
@@ -11,15 +11,12 @@
             "jcr:title": "File Configurations"
         },
         "editors": {
-            "jcr:primaryType": "sling:OrderedFolder",
-            "jcr:content": {
-                "jcr:primaryType": "nt:unstructured",
-                "jcr:title": "File Editor"
-            },
+            "jcr:primaryType": "sling:Config",
+            "sling:resourceType": "sling-cms/components/caconfig/fileeditor",
             "default": {
-                "jcr:primaryType": "sling:Config",
+                "jcr:primaryType": "nt:unstructured",
                 "jcr:title": "Default File Editor",
-                "sling:resourceType": "sling-cms/components/caconfig/fileeditor",
+                "sling:resourceType": "sling-cms/components/caconfig/fileeditor/config",
                 "fields": {
                     "jcr:primaryType": "nt:unstructured",
                     "title": {
@@ -82,11 +79,15 @@
         }
     },
     "site": {
-        "jcr:primaryType": "sling:Config",
-        "sling:resourceType": "sling-cms/components/caconfig/site",
-        "jcr:title": "Default Site Configuration",
-        "rewrite": {
+        "jcr:primaryType": "sling:OrderedFolder",
+        "jcr:content": {
             "jcr:primaryType": "nt:unstructured",
+            "jcr:title": "Default Site Configuration"
+        },
+        "rewrite": {
+            "jcr:primaryType": "sling:Config",
+            "jcr:title": "Rewriter",
+            "sling:resourceType": "sling-cms/components/caconfig/rewriter",
             "doctype": "<!DOCTYPE html>",
             "attributes": [
                 "action",
@@ -95,10 +96,15 @@
             ]
         },
         "settings": {
+            "jcr:primaryType": "sling:Config",
+            "jcr:title": "Site Settings",
+            "sling:resourceType": "sling-cms/components/caconfig/sitesettings",
             "taxonomyroot": "/etc/taxonomy"
         },
         "templates": {
-            "jcr:primaryType": "nt:unstructured",
+            "jcr:primaryType": "sling:Config",
+            "jcr:title": "Templates",
+            "sling:resourceType": "sling-cms/components/caconfig/templates",
             "base-page": {
                 "jcr:primaryType": "nt:unstructured",
                 "jcr:title": "Base Page",
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/fileeditor/config/edit.json b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/fileeditor/config/edit.json
index a47279b..92c9135 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/fileeditor/config/edit.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/fileeditor/config/edit.json
@@ -1,23 +1,23 @@
  {
-	"jcr:primaryType": "nt:unstructured",
-	"sling:resourceType": "sling-cms/components/editor/slingform",
-	"button": "Save File Editor",
-	"fields": {
-		"jcr:primaryType": "nt:unstructured",
-		"sling:resourceType": "sling-cms/components/general/container",
-		"mimetypes": {
-			"jcr:primaryType": "nt:unstructured",
-			"sling:resourceType": "sling-cms/components/editor/fields/repeating",
-			"type": "text",
-			"label": "MIME Types",
-			"name": "jcr:content/mimetypes",
-			"required": true
-		},
-		"mimetypesTypeHint": {
-			"jcr:primaryType": "nt:unstructured",
-			"sling:resourceType": "sling-cms/components/editor/fields/hidden",
-			"name": "jcr:content/mimetypes@TypeHint",
-			"value":"String[]"
-		}
-	}
+    "jcr:primaryType": "nt:unstructured",
+    "sling:resourceType": "sling-cms/components/editor/slingform",
+    "button": "Save File Editor",
+    "fields": {
+        "jcr:primaryType": "nt:unstructured",
+        "sling:resourceType": "sling-cms/components/general/container",
+        "mimetypes": {
+            "jcr:primaryType": "nt:unstructured",
+            "sling:resourceType": "sling-cms/components/editor/fields/repeating",
+            "type": "text",
+            "label": "MIME Types",
+            "name": "jcr:content/mimetypes",
+            "required": true
+        },
+        "mimetypesTypeHint": {
+            "jcr:primaryType": "nt:unstructured",
+            "sling:resourceType": "sling-cms/components/editor/fields/hidden",
+            "name": "jcr:content/mimetypes@TypeHint",
+            "value": "String[]"
+        }
+    }
 }
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/readability.json b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/readability.json
index e0f61ba..b5774b8 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/readability.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/readability.json
@@ -1,6 +1,6 @@
 {
-	"jcr:primaryType": "sling:Component",
-	"jcr:title": "Sling CMS - Readability Configuration",
-	"sling:resourceSuperType": "sling-cms/components/caconfig/base",
+    "jcr:primaryType": "sling:Component",
+    "jcr:title": "Sling CMS - Readability Configuration",
+    "sling:resourceSuperType": "sling-cms/components/caconfig/base",
     "componentType": "SlingCMS-Config"
 }
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter.json b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter.json
index b632efb..7815e85 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter.json
@@ -1,4 +1,6 @@
 {
-	"jcr:primaryType": "sling:Component",
-	"jcr:title" : "Sling CMS - Rewriter Configuration"
+    "jcr:primaryType": "sling:Component",
+    "jcr:title": "Sling CMS - Rewriter Configuration",
+    "sling:resourceSuperType": "sling-cms/components/caconfig/base",
+    "componentType": "SlingCMS-Config"
 }
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config.json b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config.json
new file mode 100644
index 0000000..66b591f
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config.json
@@ -0,0 +1,4 @@
+{
+	"jcr:primaryType": "sling:Component",
+    "jcr:title": "Sling CMS - Rewriter"
+}
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/rewriter.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config/config.jsp
similarity index 70%
copy from ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/rewriter.jsp
copy to ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config/config.jsp
index 0e5a4c4..bcde6bc 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/rewriter.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config/config.jsp
@@ -19,16 +19,16 @@
  <%@include file="/libs/sling-cms/global.jsp"%>
 <h3>Rewrite Configuration</h3>
 <dl>
-	<dt>Doctype</dt>
-	<dd>
-		<sling:encode value="${resource.valueMap.doctype}" mode="HTML" />
-	</dd>
-	<dt>Rewritten Attributes</dt>
-	<dd>
-		<ul>
-			<c:forEach var="attribute" items="${resource.valueMap.attributes}">
-				<sling:encode value="${attribute}" mode="HTML" />
-			</c:forEach>
-		</ul>
-	</dd>
+    <dt>Doctype</dt>
+    <dd>
+        <sling:encode value="${resource.valueMap.doctype}" mode="HTML" />
+    </dd>
+    <dt>Rewritten Attributes</dt>
+    <dd>
+        <ul>
+            <c:forEach var="attribute" items="${resource.valueMap.attributes}">
+                <sling:encode value="${attribute}" mode="HTML" />
+            </c:forEach>
+        </ul>
+    </dd>
 </dl>
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config/edit.json b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config/edit.json
new file mode 100644
index 0000000..ab1814a
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/config/edit.json
@@ -0,0 +1,25 @@
+ {
+    "jcr:primaryType": "nt:unstructured",
+    "sling:resourceType": "sling-cms/components/editor/slingform",
+    "button": "Save Rewrite Config",
+    "fields": {
+        "jcr:primaryType": "nt:unstructured",
+        "sling:resourceType": "sling-cms/components/general/container",
+        "doctype": {
+            "jcr:primaryType": "nt:unstructured",
+            "sling:resourceType": "sling-cms/components/editor/fields/text",
+            "label": "Doctype",
+            "name": "doctype",
+            "type": "nt:unstructured",
+            "required": true
+        },
+        "attributes": {
+            "jcr:primaryType": "nt:unstructured",
+            "sling:resourceType": "sling-cms/components/editor/fields/repeating",
+            "label": "Rewritten Attributes",
+            "name": "attributes",
+            "type": "text",
+            "required": true
+        }
+    }
+}
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/edit.json b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/edit.json
deleted file mode 100644
index 9f296f1..0000000
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/edit.json
+++ /dev/null
@@ -1,25 +0,0 @@
- {
-	"jcr:primaryType": "nt:unstructured",
-	"sling:resourceType": "sling-cms/components/editor/slingform",
-	"button": "Save Rewrite Config",
-	"fields": {
-		"jcr:primaryType": "nt:unstructured",
-		"sling:resourceType": "sling-cms/components/general/container",
-		"doctype": {
-			"jcr:primaryType": "nt:unstructured",
-			"sling:resourceType": "sling-cms/components/editor/fields/text",
-			"label": "Doctype",
-			"name": "doctype",
-			"type": "nt:unstructured",
-			"required": true
-		},
-		"attributes": {
-			"jcr:primaryType": "nt:unstructured",
-			"sling:resourceType": "sling-cms/components/editor/fields/repeating",
-			"label": "Rewritten Attributes",
-			"name": "attributes",
-			"type": "text",
-			"required": true
-		}
-	}
-}
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/rewriter.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/include.jsp
similarity index 71%
rename from ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/rewriter.jsp
rename to ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/include.jsp
index 0e5a4c4..93ab64b 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/rewriter.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/rewriter/include.jsp
@@ -17,18 +17,4 @@
  * under the License.
  */ --%>
  <%@include file="/libs/sling-cms/global.jsp"%>
-<h3>Rewrite Configuration</h3>
-<dl>
-	<dt>Doctype</dt>
-	<dd>
-		<sling:encode value="${resource.valueMap.doctype}" mode="HTML" />
-	</dd>
-	<dt>Rewritten Attributes</dt>
-	<dd>
-		<ul>
-			<c:forEach var="attribute" items="${resource.valueMap.attributes}">
-				<sling:encode value="${attribute}" mode="HTML" />
-			</c:forEach>
-		</ul>
-	</dd>
-</dl>
\ No newline at end of file
+<sling:include path="${slingRequest.requestPathInfo.suffix}" resourceType="sling-cms/components/caconfig/rewriter/config" />
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings.json b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings.json
index 82a1f0f..0596b11 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings.json
@@ -1,4 +1,6 @@
 {
-	"jcr:primaryType": "sling:Component",
-	"jcr:title" : "Sling CMS - Site Settings"
+    "jcr:primaryType": "sling:Component",
+    "jcr:title": "Sling CMS - Site Settings",
+    "sling:resourceSuperType": "sling-cms/components/caconfig/base",
+    "componentType": "SlingCMS-Config"
 }
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config.json b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config.json
new file mode 100644
index 0000000..dbd0eb5
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config.json
@@ -0,0 +1,4 @@
+{
+	"jcr:primaryType": "sling:Component",
+    "jcr:title": "Sling CMS - Site Settings"
+}
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/sitesettings.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config/config.jsp
similarity index 100%
copy from ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/sitesettings.jsp
copy to ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config/config.jsp
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/edit.json b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config/edit.json
similarity index 100%
rename from ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/edit.json
rename to ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/config/edit.json
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/sitesettings.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/include.jsp
similarity index 87%
rename from ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/sitesettings.jsp
rename to ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/include.jsp
index 3fe200d..8f4d927 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/sitesettings.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/sitesettings/include.jsp
@@ -17,10 +17,4 @@
  * under the License.
  */ --%>
  <%@include file="/libs/sling-cms/global.jsp"%>
-<h3>Site Settings</h3>
-<dl>
-    <dt>Taxonomy Root</dt>
-    <dd>
-        ${properties.taxonomyroot}
-    </dd>
-</dl>
\ No newline at end of file
+<sling:include path="${slingRequest.requestPathInfo.suffix}" resourceType="sling-cms/components/caconfig/sitesettings/config" />
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/templates.json b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/templates.json
new file mode 100644
index 0000000..af82927
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/templates.json
@@ -0,0 +1,5 @@
+{
+    "jcr:primaryType": "sling:Component",
+    "jcr:title": "Sling CMS - Templates Configuration",
+    "componentType": "SlingCMS-Config"
+}
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/site/site.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/templates/templates.jsp
similarity index 62%
rename from ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/site/site.jsp
rename to ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/templates/templates.jsp
index fb309a3..9f45399 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/site/site.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/caconfig/templates/templates.jsp
@@ -17,15 +17,4 @@
  * under the License.
  */ --%>
  <%@include file="/libs/sling-cms/global.jsp"%>
-
- <c:set var="cmsEditEnabled" value="true" scope="request" />
-<sling:call script="/libs/sling-cms/components/editor/scripts/init.jsp" />
-
-<sling:include path="${slingRequest.requestPathInfo.suffix}/settings" resourceType="sling-cms/components/caconfig/sitesettings" />
-
-<sling:include path="${slingRequest.requestPathInfo.suffix}/rewrite" resourceType="sling-cms/components/caconfig/rewriter" />
-
-<sling:call script="/libs/sling-cms/components/editor/scripts/finalize.jsp" />
-<c:set var="cmsEditEnabled" value="false" scope="request" />
-
-<sling:include path="/mnt/overlay/sling-cms/content/siteconfig/editor" resourceType="sling-cms/components/general/container" replaceSuffix="${slingRequest.requestPathInfo.suffix}" />
\ No newline at end of file
+<sling:include path="/mnt/overlay/sling-cms/content/siteconfig/editor" resourceType="sling-cms/components/general/container" replaceSuffix="${slingRequest.requestPathInfo.suffixResource.parent.path}" />
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentbreadcrumb/contentbreadcrumb.jsp b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentbreadcrumb/contentbreadcrumb.jsp
index 18212b7..694fd5e 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentbreadcrumb/contentbreadcrumb.jsp
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/components/cms/contentbreadcrumb/contentbreadcrumb.jsp
@@ -17,29 +17,20 @@
  * under the License.
  */ --%>
  <%@include file="/libs/sling-cms/global.jsp"%>
-<sling:getParent resource="${slingRequest.requestPathInfo.suffixResource}" var="root" level="${resource.valueMap.depth}" />
+<sling:adaptTo var="breadcrumb" adaptable="${slingRequest}" adaptTo="org.apache.sling.cms.core.models.ContentBreadcrumb" />
 <nav class="breadcrumb" aria-label="breadcrumbs">
 <ul>
-    <li>
-        <a href="${resource.valueMap.prefix}${root.path}">
-            <sling:encode value="${root.valueMap['jcr:title'] != null ? root.valueMap['jcr:title'] : root.valueMap['jcr:content/jcr:title']}" default="${root.name}" mode="HTML" />
-        </a>
-    </li>
-    <c:if test="${site.path != slingRequest.requestPathInfo.suffix && site.path != slingRequest.requestPathInfo.suffixResource.parent.path}">
-        <c:forEach var="parent" items="${sling:getParents(slingRequest.requestPathInfo.suffixResource,(resource.valueMap.depth + 1))}">
-            <li>
-                <a href="${resource.valueMap.prefix}${parent.path}">
-                    <sling:encode value="${parent.valueMap['jcr:title'] != null ? parent.valueMap['jcr:title'] : parent.valueMap['jcr:content/jcr:title']}" default="${parent.name}" mode="HTML" />
-                </a>
-            </li>
-        </c:forEach>
-    </c:if>
-    <c:if test="${root.path != slingRequest.requestPathInfo.suffix}">
-        <li class="is-active">
-            <a href="#">
-            <sling:encode value="${slingRequest.requestPathInfo.suffixResource.valueMap['jcr:title'] != null ? slingRequest.requestPathInfo.suffixResource.valueMap['jcr:title'] : slingRequest.requestPathInfo.suffixResource.valueMap['jcr:content/jcr:title']}" default="${slingRequest.requestPathInfo.suffixResource.name}" mode="HTML" />
+    <c:forEach var="parent" items="${breadcrumb.parents}">
+        <li>
+            <a href="${parent.left}">
+                <sling:encode value="${parent.right}" mode="HTML" />
             </a>
         </li>
-    </c:if>
+    </c:forEach>
+    <li class="is-active">
+        <a href="#">
+            <sling:encode value="${breadcrumb.currentItem}" mode="HTML" />
+        </a>
+    </li>
 </ul>
 </nav>
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/list.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/bucket.json
similarity index 60%
rename from ui/src/main/resources/jcr_root/libs/sling-cms/content/config/list.json
rename to ui/src/main/resources/jcr_root/libs/sling-cms/content/config/bucket.json
index 2604694..28ef374 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/list.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/bucket.json
@@ -11,11 +11,6 @@
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentactions",
                 "actions": {
-                    "folder": {
-                        "jcr:primaryType": "nt:unstructured",
-                        "label": "Folder",
-                        "prefix": "/cms/folder/create.html"
-                    },
                     "config": {
                         "jcr:primaryType": "nt:unstructured",
                         "label": "Config",
@@ -26,8 +21,8 @@
             "contentbreadcrumb": {
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentbreadcrumb",
-                "depth": 2,
-                "prefix": "/cms/config/list.html"
+                "depth": 1,
+                "rootTitle": "Configuration"
             },
             "contenttable": {
                 "jcr:primaryType": "nt:unstructured",
@@ -106,60 +101,6 @@
                                 }
                             }
                         }
-                    },
-                    "sling:OrderedFolder": {
-                        "jcr:primaryType": "nt:unstructured",
-                        "columns": {
-                            "jcr:primaryType": "nt:unstructured",
-                            "name": {
-                                "jcr:primaryType": "nt:unstructured",
-                                "sling:resourceType": "sling-cms/components/cms/columns/name",
-                                "link": true,
-                                "prefix": "/cms/config/list.html"
-                            },
-                            "title": {
-                                "jcr:primaryType": "nt:unstructured",
-                                "sling:resourceType": "sling-cms/components/cms/columns/text",
-                                "property": "jcr:content/jcr:title"
-                            },
-                            "lastModified": {
-                                "jcr:primaryType": "nt:unstructured",
-                                "sling:resourceType": "sling-cms/components/cms/columns/lastmodified",
-                                "subPath": "jcr:content"
-                            },
-                            "actions": {
-                                "jcr:primaryType": "nt:unstructured",
-                                "sling:resourceType": "sling-cms/components/cms/columns/actions",
-                                "edit": {
-                                    "jcr:primaryType": "nt:unstructured",
-                                    "modal": true,
-                                    "title": "Edit Folder Properties",
-                                    "icon": "cog",
-                                    "prefix": "/cms/folder/edit.html"
-                                },
-                                "references": {
-                                    "jcr:primaryType": "nt:unstructured",
-                                    "modal": true,
-                                    "title": "References",
-                                    "icon": "directions",
-                                    "prefix": "/cms/shared/references.html"
-                                },
-                                "movecopy": {
-                                    "jcr:primaryType": "nt:unstructured",
-                                    "modal": true,
-                                    "title": "Move / Copy Folder",
-                                    "icon": "move-alt",
-                                    "prefix": "/cms/shared/movecopy.html"
-                                },
-                                "delete": {
-                                    "jcr:primaryType": "nt:unstructured",
-                                    "modal": true,
-                                    "title": "Delete Folder",
-                                    "icon": "trash",
-                                    "prefix": "/cms/shared/delete.html"
-                                }
-                            }
-                        }
                     }
                 }
             }
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/taxonomy/list.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/buckets.json
similarity index 84%
copy from ui/src/main/resources/jcr_root/libs/sling-cms/content/taxonomy/list.json
copy to ui/src/main/resources/jcr_root/libs/sling-cms/content/config/buckets.json
index fcc0aee..308ebde 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/taxonomy/list.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/buckets.json
@@ -2,7 +2,7 @@
     "jcr:primaryType": "sling:Page",
     "jcr:content": {
         "sling:resourceType": "sling-cms/components/pages/base",
-        "jcr:title": "Taxonomy",
+        "jcr:title": "Configurations",
         "jcr:primaryType": "nt:unstructured",
         "container": {
             "jcr:primaryType": "nt:unstructured",
@@ -11,18 +11,18 @@
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentactions",
                 "actions": {
-                    "taxonomy": {
+                    "folder": {
                         "jcr:primaryType": "nt:unstructured",
-                        "label": "Taxonomy Item",
-                        "prefix": "/cms/taxonomy/create.html"
+                        "label": "Bucket",
+                        "prefix": "/cms/folder/create.html"
                     }
                 }
             },
             "contentbreadcrumb": {
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentbreadcrumb",
-                "depth": 2,
-                "prefix": "/cms/taxonomy/list.html"
+                "depth": 1,
+                "rootTitle": "Configuration"
             },
             "contenttable": {
                 "jcr:primaryType": "nt:unstructured",
@@ -48,7 +48,7 @@
                 },
                 "types": {
                     "jcr:primaryType": "nt:unstructured",
-                    "sling:Taxonomy": {
+                    "sling:OrderedFolder": {
                         "jcr:primaryType": "nt:unstructured",
                         "columns": {
                             "jcr:primaryType": "nt:unstructured",
@@ -56,17 +56,17 @@
                                 "jcr:primaryType": "nt:unstructured",
                                 "sling:resourceType": "sling-cms/components/cms/columns/name",
                                 "link": true,
-                                "prefix": "/cms/taxonomy/list.html"
+                                "prefix": "/cms/config/bucket.html"
                             },
                             "title": {
                                 "jcr:primaryType": "nt:unstructured",
                                 "sling:resourceType": "sling-cms/components/cms/columns/text",
-                                "property": "jcr:title"
+                                "property": "jcr:content/jcr:title"
                             },
                             "lastModified": {
                                 "jcr:primaryType": "nt:unstructured",
                                 "sling:resourceType": "sling-cms/components/cms/columns/lastmodified",
-                                "subPath": ""
+                                "subPath": "jcr:content"
                             },
                             "actions": {
                                 "jcr:primaryType": "nt:unstructured",
@@ -74,9 +74,9 @@
                                 "edit": {
                                     "jcr:primaryType": "nt:unstructured",
                                     "modal": true,
-                                    "title": "Edit Taxonomy Item",
-                                    "icon": "pencil-f",
-                                    "prefix": "/cms/taxonomy/edit.html"
+                                    "title": "Edit Folder Properties",
+                                    "icon": "cog",
+                                    "prefix": "/cms/folder/edit.html"
                                 },
                                 "references": {
                                     "jcr:primaryType": "nt:unstructured",
@@ -88,14 +88,14 @@
                                 "movecopy": {
                                     "jcr:primaryType": "nt:unstructured",
                                     "modal": true,
-                                    "title": "Move / Copy Taxonomy Item",
+                                    "title": "Move / Copy Folder",
                                     "icon": "move-alt",
                                     "prefix": "/cms/shared/movecopy.html"
                                 },
                                 "delete": {
                                     "jcr:primaryType": "nt:unstructured",
                                     "modal": true,
-                                    "title": "Delete Taxonomy Item",
+                                    "title": "Delete Folder",
                                     "icon": "trash",
                                     "prefix": "/cms/shared/delete.html"
                                 }
@@ -106,4 +106,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/taxonomy/list.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/configs.json
similarity index 84%
copy from ui/src/main/resources/jcr_root/libs/sling-cms/content/taxonomy/list.json
copy to ui/src/main/resources/jcr_root/libs/sling-cms/content/config/configs.json
index fcc0aee..fd81c6a 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/taxonomy/list.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/configs.json
@@ -2,7 +2,7 @@
     "jcr:primaryType": "sling:Page",
     "jcr:content": {
         "sling:resourceType": "sling-cms/components/pages/base",
-        "jcr:title": "Taxonomy",
+        "jcr:title": "Configurations",
         "jcr:primaryType": "nt:unstructured",
         "container": {
             "jcr:primaryType": "nt:unstructured",
@@ -11,18 +11,18 @@
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentactions",
                 "actions": {
-                    "taxonomy": {
+                    "folder": {
                         "jcr:primaryType": "nt:unstructured",
-                        "label": "Taxonomy Item",
-                        "prefix": "/cms/taxonomy/create.html"
+                        "label": "Config Context",
+                        "prefix": "/cms/folder/create.html"
                     }
                 }
             },
             "contentbreadcrumb": {
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentbreadcrumb",
-                "depth": 2,
-                "prefix": "/cms/taxonomy/list.html"
+                "depth": 1,
+                "rootTitle": "Configuration"
             },
             "contenttable": {
                 "jcr:primaryType": "nt:unstructured",
@@ -48,7 +48,7 @@
                 },
                 "types": {
                     "jcr:primaryType": "nt:unstructured",
-                    "sling:Taxonomy": {
+                    "sling:OrderedFolder": {
                         "jcr:primaryType": "nt:unstructured",
                         "columns": {
                             "jcr:primaryType": "nt:unstructured",
@@ -56,17 +56,17 @@
                                 "jcr:primaryType": "nt:unstructured",
                                 "sling:resourceType": "sling-cms/components/cms/columns/name",
                                 "link": true,
-                                "prefix": "/cms/taxonomy/list.html"
+                                "prefix": "/cms/config/buckets.html"
                             },
                             "title": {
                                 "jcr:primaryType": "nt:unstructured",
                                 "sling:resourceType": "sling-cms/components/cms/columns/text",
-                                "property": "jcr:title"
+                                "property": "jcr:content/jcr:title"
                             },
                             "lastModified": {
                                 "jcr:primaryType": "nt:unstructured",
                                 "sling:resourceType": "sling-cms/components/cms/columns/lastmodified",
-                                "subPath": ""
+                                "subPath": "jcr:content"
                             },
                             "actions": {
                                 "jcr:primaryType": "nt:unstructured",
@@ -74,9 +74,9 @@
                                 "edit": {
                                     "jcr:primaryType": "nt:unstructured",
                                     "modal": true,
-                                    "title": "Edit Taxonomy Item",
-                                    "icon": "pencil-f",
-                                    "prefix": "/cms/taxonomy/edit.html"
+                                    "title": "Edit Folder Properties",
+                                    "icon": "cog",
+                                    "prefix": "/cms/folder/edit.html"
                                 },
                                 "references": {
                                     "jcr:primaryType": "nt:unstructured",
@@ -88,14 +88,14 @@
                                 "movecopy": {
                                     "jcr:primaryType": "nt:unstructured",
                                     "modal": true,
-                                    "title": "Move / Copy Taxonomy Item",
+                                    "title": "Move / Copy Folder",
                                     "icon": "move-alt",
                                     "prefix": "/cms/shared/movecopy.html"
                                 },
                                 "delete": {
                                     "jcr:primaryType": "nt:unstructured",
                                     "modal": true,
-                                    "title": "Delete Taxonomy Item",
+                                    "title": "Delete Folder",
                                     "icon": "trash",
                                     "prefix": "/cms/shared/delete.html"
                                 }
@@ -106,4 +106,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/create.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/create.json
index 3d91f00..297b526 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/create.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/create.json
@@ -11,7 +11,7 @@
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/editor/slingform",
                 "actionSuffix": "/*",
-                "button": "Create Site Config",
+                "button": "Create Config",
                 "successPrepend": "/libs/sling-cms/content/site/content.html",
                 "fields": {
                     "jcr:primaryType": "nt:unstructured",
@@ -42,12 +42,6 @@
                         "name": "jcr:primaryType",
                         "value": "sling:Config"
                     },
-                    "pageTemplatesPrimaryType": {
-                        "jcr:primaryType": "nt:unstructured",
-                        "sling:resourceType": "sling-cms/components/editor/fields/hidden",
-                        "name": "pageTemplates/jcr:primaryType",
-                        "value": "nt:unstructured"
-                    },
                     "type": {
                         "jcr:primaryType": "nt:unstructured",
                         "sling:resourceType": "sling-cms/components/editor/fields/select",
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/edit.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/edit.json
index 7c21313..59be611 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/edit.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/config/edit.json
@@ -12,12 +12,6 @@
                 "sling:resourceType": "sling-cms/components/general/richtext",
                 "text": "<h2>Edit Configuration</h2>"
             },
-            "contentbreadcrumb": {
-                "jcr:primaryType": "nt:unstructured",
-                "sling:resourceType": "sling-cms/components/cms/contentbreadcrumb",
-                "depth": 2,
-                "prefix": "/cms/config/list.html"
-            },
             "editconfig": {
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/caconfig/edit"
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/site/content.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/site/content.json
index 9ed8e82..1241863 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/site/content.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/site/content.json
@@ -31,9 +31,8 @@
             "contentbreadcrumb": {
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentbreadcrumb",
-                "depth": 2,
-                "prefix": "/cms/site/content.html",
-                "titleProp": "jcr:content/jcr:title"
+                "depth": 1,
+                "rootTitle": "Sites"
             },
             "contenttable": {
                 "jcr:primaryType": "nt:unstructured",
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/site/sites.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/site/sites.json
index 4abc99a..56e6176 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/site/sites.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/site/sites.json
@@ -28,9 +28,8 @@
             "contentbreadcrumb": {
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentbreadcrumb",
-                "depth": 2,
-                "prefix": "/cms/site/sites.html",
-                "titleProp": "jcr:content/jcr:title"
+                "depth": 1,
+                "rootTitle": "Sites"
             },
             "contenttable": {
                 "jcr:primaryType": "nt:unstructured",
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/siteconfig/editor.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/siteconfig/editor.json
index e879931..8df1da5 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/siteconfig/editor.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/siteconfig/editor.json
@@ -1,3 +1,4 @@
+
 {
     "jcr:primaryType": "nt:unstructured",
     "sling:resourceType": "sling-cms/components/general/container",
@@ -72,13 +73,13 @@
                             "icon": "pencil-f",
                             "prefix": "/cms/template/edit.html"
                         },
-                    "references": {
-                        "jcr:primaryType": "nt:unstructured",
-                        "modal": true,
-                        "title": "References",
-                        "icon": "directions",
-                        "prefix": "/cms/shared/references.html"
-                    },
+                        "references": {
+                            "jcr:primaryType": "nt:unstructured",
+                            "modal": true,
+                            "title": "References",
+                            "icon": "directions",
+                            "prefix": "/cms/shared/references.html"
+                        },
                         "movecopy": {
                             "jcr:primaryType": "nt:unstructured",
                             "modal": true,
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/start.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/start.json
index 4645ffa..a6fa87b 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/start.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/start.json
@@ -52,9 +52,9 @@
                         "jcr:primaryType": "nt:unstructured",
                         "alternatives": [
                             "/cms/template/edit.html",
-                            "/cms/config/edit.html"
+                            "/cms/config"
                         ],
-                        "link": "/cms/config/list.html/conf",
+                        "link": "/cms/config/configs.html/conf",
                         "text": "Configuration"
                     },
                     "usergenerated": {
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/static/content.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/static/content.json
index 3f2a07b..77a36e4 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/static/content.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/static/content.json
@@ -26,9 +26,8 @@
             "contentbreadcrumb": {
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentbreadcrumb",
-                "depth": 2,
-                "prefix": "/cms/static/content.html",
-                "titleProp": "jcr:content/jcr:title"
+                "depth": 1,
+                "rootTitle": "Static Content"
             },
             "contenttable": {
                 "jcr:primaryType": "nt:unstructured",
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/taxonomy/list.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/taxonomy/list.json
index fcc0aee..7c7604e 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/taxonomy/list.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/taxonomy/list.json
@@ -21,8 +21,7 @@
             "contentbreadcrumb": {
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentbreadcrumb",
-                "depth": 2,
-                "prefix": "/cms/taxonomy/list.html"
+                "depth": 2
             },
             "contenttable": {
                 "jcr:primaryType": "nt:unstructured",
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/content/usergenerated/content.json b/ui/src/main/resources/jcr_root/libs/sling-cms/content/usergenerated/content.json
index e5223f0..e91504e 100644
--- a/ui/src/main/resources/jcr_root/libs/sling-cms/content/usergenerated/content.json
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/content/usergenerated/content.json
@@ -22,8 +22,7 @@
                 "jcr:primaryType": "nt:unstructured",
                 "sling:resourceType": "sling-cms/components/cms/contentbreadcrumb",
                 "depth": 2,
-                "prefix": "/cms/usergenerated/content.html",
-                "titleProp": "jcr:content/jcr:title"
+                "rootTitle": "User Generated Content"
             },
             "contenttable": {
                 "jcr:primaryType": "nt:unstructured",
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-confbucket.config b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-confbucket.config
new file mode 100644
index 0000000..23fa083
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-confbucket.config
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+pathPattern="\\/conf\\/[\\w\\d\\-_]+\\/[\\w\\d\\-_]+"
+editor="/cms/config/bucket.html"
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-confbuckets.config b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-confbuckets.config
new file mode 100644
index 0000000..28705e4
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-confbuckets.config
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+pathPattern="\\/conf\\/[\\w\\d\-_]+"
+editor="/cms/config/buckets.html"
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-confroot.config b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-confroot.config
new file mode 100644
index 0000000..5216e0e
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-confroot.config
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+pathPattern="\\/conf"
+editor="/cms/config/configs.html"
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-site.config b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-site.config
new file mode 100644
index 0000000..a9e5152
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-site.config
@@ -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.
+#
+pathPattern="\\/content.*"
+editor="/cms/site/content.html"
+resourceType="sling:Site"
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-sitecontent.config b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-sitecontent.config
new file mode 100644
index 0000000..ecb6ab0
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-sitecontent.config
@@ -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.
+#
+pathPattern="\\/content.*"
+editor="/cms/site/content.html"
+parentType="sling:Site"
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-sites.config b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-sites.config
new file mode 100644
index 0000000..3e594bc
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-sites.config
@@ -0,0 +1,22 @@
+#
+# 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.
+#
+pathPattern="\\/content.*"
+editor="/cms/site/sites.html"
+resourceType="sling:OrderedFolder"
+service.ranking=I"-1"
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-static.config b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-static.config
new file mode 100644
index 0000000..6fd4be4
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-static.config
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+pathPattern="\\/static.*"
+editor="/cms/static/content.html"
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-taxonomy.config b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-taxonomy.config
new file mode 100644
index 0000000..bdd5a99
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-taxonomy.config
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+pathPattern="\\/etc\\/taxonomy.*"
+editor="/cms/taxonomy/list.html"
\ No newline at end of file
diff --git a/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-ugc.config b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-ugc.config
new file mode 100644
index 0000000..1b7d94a
--- /dev/null
+++ b/ui/src/main/resources/jcr_root/libs/sling-cms/install/org.apache.sling.cms.core.internal.ResourceEditorAssociation-ugc.config
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+pathPattern="\\/etc\\/usergenerated.*"
+editor="/cms/usergenerated/content.html"
\ No newline at end of file