Index: components/core/src/main/java/org/hippoecm/hst/configuration/channel/ChannelManagerImpl.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- components/core/src/main/java/org/hippoecm/hst/configuration/channel/ChannelManagerImpl.java	(revision 32918)
+++ components/core/src/main/java/org/hippoecm/hst/configuration/channel/ChannelManagerImpl.java	(revision )
@@ -70,8 +70,12 @@
     private static final String DEFAULT_HST_ROOT_PATH = "/hst:hst";
     private static final String DEFAULT_HST_SITES = "hst:sites";
     private static final String DEFAULT_CONTENT_ROOT = "/content/documents";
+    private static final String DEFAULT_GALLERY_ROOT = "/content/gallery";
+    private static final String DEFAULT_ASSETS_ROOT = "/content/assets";
 
     static final Logger log = LoggerFactory.getLogger(ChannelManagerImpl.class.getName());
+    private static final String GALLERY = "gallery";
+    private static final String ASSETS = "assets";
 
     private String rootPath = DEFAULT_HST_ROOT_PATH;
     private String hostGroup = null;
@@ -83,6 +87,8 @@
     private Repository repository;
     private String channelsRoot = DEFAULT_HST_ROOT_PATH + "/" + HstNodeTypes.NODENAME_HST_CHANNELS + "/";
     private String contentRoot = DEFAULT_CONTENT_ROOT;
+    private String galleryRoot = DEFAULT_GALLERY_ROOT;
+    private String assetsRoot = DEFAULT_ASSETS_ROOT;
 
     /**
      * The codec which is used for the channel ID
@@ -109,6 +115,14 @@
         this.contentRoot = contentRoot.trim();
     }
 
+    public void setGalleryRoot(String galleryRoot) {
+      this.galleryRoot = galleryRoot.trim();
+    }
+
+    public void setAssetsRoot(String assetsRoot) {
+      this.assetsRoot = assetsRoot.trim();
+    }
+
     private void loadBlueprints(final Node configNode) throws RepositoryException {
         if (configNode.hasNode(HstNodeTypes.NODENAME_HST_BLUEPRINTS)) {
             Node blueprintsNode = configNode.getNode(HstNodeTypes.NODENAME_HST_BLUEPRINTS);
@@ -584,8 +598,16 @@
             liveContentMirror.setProperty(HippoNodeType.HIPPO_DOCBASE, contentRootNode.getIdentifier());
             previewContentMirror.setProperty(HippoNodeType.HIPPO_DOCBASE, contentRootNode.getIdentifier());
         }
+      
+        if(bps.hasAssetPrototype()){
+            createGalleryOrAssetsContent(bps, session, channelId, channel, ASSETS);
-    }
+        }
 
+        if(bps.hasAssetPrototype()){
+          createGalleryOrAssetsContent(bps, session, channelId, channel, GALLERY);
+        }
+    }
+
     private void copyOrCreateChannelNode(final Node configRoot, final String channelId, final Channel channel) throws RepositoryException {
         if (!configRoot.hasNode(HstNodeTypes.NODENAME_HST_CHANNELS)) {
             configRoot.addNode(HstNodeTypes.NODENAME_HST_CHANNELS, HstNodeTypes.NODETYPE_HST_CHANNELS);
@@ -736,7 +758,59 @@
             throw cannotCreateContent(blueprintContentPath, e);
         } catch (RemoteException e) {
             throw cannotCreateContent(blueprintContentPath, e);
+        }
+    }
+
+    private Node createGalleryOrAssetsContent(final BlueprintService bps, final Session session, final String channelId, final Channel channel, final String type) throws RepositoryException, ChannelException {
+      String blueprintPath=null;
+      if (type.equals(GALLERY)) {
+        blueprintPath = bps.getGalleryRoot();
+        if(StringUtils.isBlank(blueprintPath))
+        {
+          blueprintPath = galleryRoot;
+        }
+      }else if(type.equals(ASSETS))
+      {
+        blueprintPath = bps.getAssetsRoot();
+        if(StringUtils.isBlank(blueprintPath))
+        {
+          blueprintPath = assetsRoot;
+        }
+      }
+
+      if(blueprintPath==null){
+        log.error("Invalid content prototype {} " + type);
+        return null;
+      }
+  
+      log.debug("Creating new subsite content from blueprint '{}' under '{}'", bps.getId(), blueprintPath);
+  
+      FolderWorkflow fw = (FolderWorkflow) getWorkflow("subsite", session.getNode(blueprintPath));
+      if (fw == null) {
+        throw cannotCreateContent(blueprintPath, null);
+      }
+      try {
+        String contentRootPath = null;
+        if(type.equals(ASSETS)){
+          contentRootPath = fw.add("new-subsite", bps.getId() + BlueprintService.ASSETS, channelId);
+        }else if(type.equals(GALLERY)){
+          contentRootPath = fw.add("new-subsite", bps.getId() + BlueprintService.GALLERY, channelId);
+        }
+        session.refresh(true);
+  
+  
+        final Node contentRootNode = session.getNode(contentRootPath);
+        DefaultWorkflow defaultWorkflow = (DefaultWorkflow) getWorkflow("core", contentRootNode);
+        defaultWorkflow.localizeName(channel.getName());
+  
+        session.refresh(true);
+  
+        return contentRootNode;
+      } catch (WorkflowException e) {
+        throw cannotCreateContent(blueprintPath, e);
+      } catch (RemoteException e) {
+        throw cannotCreateContent(blueprintPath, e);
-        }
+      }
     }
 
     private static Node getOrAddNode(Node parent, String nodeName, String nodeType) throws RepositoryException {
Index: components/core/src/main/resources/org/hippoecm/hst/site/container/SpringComponentManager.properties
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- components/core/src/main/resources/org/hippoecm/hst/site/container/SpringComponentManager.properties	(revision 32918)
+++ components/core/src/main/resources/org/hippoecm/hst/site/container/SpringComponentManager.properties	(revision )
@@ -110,6 +110,8 @@
 
 # the default location where the channel manager creates content from blueprints
 channel.manager.contentRoot = /content/documents
+channel.manager.galleryRoot = /content/gallery
+channel.manager.assetsRoot = /content/assets
 
 # the default prefix of pathInfo URLs for the preview in the cms
 cms.default.cmspreviewprefix = _cmsinternal
Index: api/src/main/java/org/hippoecm/hst/configuration/HstNodeTypes.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- api/src/main/java/org/hippoecm/hst/configuration/HstNodeTypes.java	(revision 32918)
+++ api/src/main/java/org/hippoecm/hst/configuration/HstNodeTypes.java	(revision )
@@ -154,6 +154,8 @@
     public final static String BLUEPRINT_PROPERTY_NAME = "hst:name";
     public final static String BLUEPRINT_PROPERTY_DESCRIPTION = "hst:description";
     public final static String BLUEPRINT_PROPERTY_CONTENT_ROOT = "hst:contentRoot";
+    public final static String BLUEPRINT_PROPERTY_GALLERY_ROOT = "hst:galleryRoot";
+    public final static String BLUEPRINT_PROPERTY_ASSETS_ROOT = "hst:assetsRoot";
 
     public final static String SITEMAPITEMHANDLDER_PROPERTY_CLASSNAME = "hst:sitemapitemhandlerclassname";
     
Index: components/core/src/main/java/org/hippoecm/hst/configuration/channel/BlueprintService.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- components/core/src/main/java/org/hippoecm/hst/configuration/channel/BlueprintService.java	(revision 32918)
+++ components/core/src/main/java/org/hippoecm/hst/configuration/channel/BlueprintService.java	(revision )
@@ -31,13 +31,19 @@
     final static Logger log = LoggerFactory.getLogger(BlueprintService.class);
 
     public static final String SUBSITE_TEMPLATES_PATH = "/hippo:configuration/hippo:queries/hippo:templates/new-subsite/hippostd:templates/";
+    public static final String GALLERY = "-gallery";
+    public static final String ASSETS = "-assets";
 
-    private final String id;
+  private final String id;
     private final String name;
     private final String description;
     private final String contentRoot;
+    private final String galleryRoot;
+    private final String assetsRoot;
     private final String path;
     private final boolean hasContentPrototype;
+    private final boolean hasAssetPrototype;
+    private final boolean hasGalleryPrototype;
 
     private final Channel prototypeChannel;
 
@@ -71,8 +77,36 @@
         } else {
             this.contentRoot = null;
         }
-        
+
+        if (blueprint.hasProperty(HstNodeTypes.BLUEPRINT_PROPERTY_GALLERY_ROOT)) {
+          String location = blueprint.getProperty(HstNodeTypes.BLUEPRINT_PROPERTY_GALLERY_ROOT).getString().trim();
+          if(StringUtils.isEmpty(location) || !location.startsWith("/")) {
+            log.warn("Skipping invalid '{}' of blueprint '{}' : The value should start with a / ",
+                    HstNodeTypes.BLUEPRINT_PROPERTY_GALLERY_ROOT, path );
+            this.galleryRoot = null;
+          } else {
+            log.debug("Setting galleryRoot for blueprint '{}' to '{}'", path, location);
+            this.galleryRoot = location;
+          }
+        } else {
+          this.galleryRoot = null;
+        }
 
+        if (blueprint.hasProperty(HstNodeTypes.BLUEPRINT_PROPERTY_ASSETS_ROOT)) {
+          String location = blueprint.getProperty(HstNodeTypes.BLUEPRINT_PROPERTY_ASSETS_ROOT).getString().trim();
+          if(StringUtils.isEmpty(location) || !location.startsWith("/")) {
+            log.warn("Skipping invalid '{}' of blueprint '{}' : The value should start with a / ",
+                    HstNodeTypes.BLUEPRINT_PROPERTY_ASSETS_ROOT, path );
+            this.assetsRoot = null;
+          } else {
+            log.debug("Setting assetsRoot for blueprint '{}' to '{}'", path, location);
+            this.assetsRoot = location;
+          }
+        } else {
+          this.assetsRoot = null;
+        }
+        
+
         if (blueprint.hasNode(HstNodeTypes.NODENAME_HST_CHANNEL)) {
             this.prototypeChannel = ChannelPropertyMapper.readChannel(blueprint.getNode(HstNodeTypes.NODENAME_HST_CHANNEL), null);
         } else {
@@ -80,6 +114,8 @@
         }
 
         hasContentPrototype = blueprint.getSession().itemExists(SUBSITE_TEMPLATES_PATH + this.id);
+        hasAssetPrototype = blueprint.getSession().itemExists(SUBSITE_TEMPLATES_PATH + this.id + ASSETS);
+        hasGalleryPrototype = blueprint.getSession().itemExists(SUBSITE_TEMPLATES_PATH + this.id + GALLERY);
 
         final boolean hasSite = readSite(blueprint);
         readMount(blueprint, hasSite);
@@ -147,7 +183,17 @@
         return this.contentRoot;
     }
 
+    @Override
+    public String getGalleryRoot() {
+      return this.galleryRoot;
+    }
+
+    @Override
+    public String getAssetsRoot() {
+      return this.assetsRoot;
+    }
+
-    public Channel createChannel() {
+  public Channel createChannel() {
         return new Channel(prototypeChannel);
     }
 
@@ -160,5 +206,11 @@
         return hasContentPrototype;
     }
 
+    public boolean hasAssetPrototype() {
+      return hasAssetPrototype;
+    }
 
+    public boolean hasGalleryPrototype() {
+      return hasGalleryPrototype;
+    }
 }
Index: api/src/main/java/org/hippoecm/hst/configuration/channel/Blueprint.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- api/src/main/java/org/hippoecm/hst/configuration/channel/Blueprint.java	(revision 32918)
+++ api/src/main/java/org/hippoecm/hst/configuration/channel/Blueprint.java	(revision )
@@ -49,6 +49,18 @@
     String getContentRoot();
 
     /**
+     * The galleryRoot must start with a / and be a valid jcr path
+     * @return absolute path of the hst:galleryRoot of the blueprint node, returns <code>null</code> if the property doesn't exist.
+     */
+    String getGalleryRoot();
+
+    /**
+     * The assetsRoot must start with a / and be a valid jcr path
+     * @return absolute path of the hst:assetsRoot of the blueprint node, returns <code>null</code> if the property doesn't exist.
+     */
+    String getAssetsRoot();
+
+    /**
      * Creates a new channel with ID 'null'. The channel can be persisted using {@link ChannelManager#persist}.
      *
      * @return a new, unpersisted channel
@@ -61,4 +73,18 @@
      * @return true if a prototype exists
      */
     boolean hasContentPrototype();
+
+    /**
+     * Does the blueprint have a assets prototype.  If so, it will be used to create a assets structure.
+     *
+     * @return true if a prototype exists
+     */
+    boolean hasAssetPrototype();
+
+    /**
+     * Does the blueprint have a gallery prototype.  If so, it will be used to create a gallery structure.
+     *
+     * @return true if a prototype exists
+     */
+    boolean hasGalleryPrototype();
 }
Index: components/core/src/main/resources/org/hippoecm/hst/site/container/SpringComponentManager-channelManager.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- components/core/src/main/resources/org/hippoecm/hst/site/container/SpringComponentManager-channelManager.xml	(revision 32918)
+++ components/core/src/main/resources/org/hippoecm/hst/site/container/SpringComponentManager-channelManager.xml	(revision )
@@ -29,6 +29,8 @@
     <property name="repository" ref="javax.jcr.Repository" />
     <property name="credentials" ref="javax.jcr.Credentials.hstconfigreader" />
     <property name="contentRoot" value="${channel.manager.contentRoot}"/>
+    <property name="galleryRoot" value="${channel.manager.galleryRoot}"/>
+    <property name="assetsRoot" value="${channel.manager.assetsRoot}"/>
   </bean>
 
 </beans>
Index: toolkit-resources/addon/toolkit-cnd/cnd/src/main/resources/hst-types.cnd
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- toolkit-resources/addon/toolkit-cnd/cnd/src/main/resources/hst-types.cnd	(revision 32918)
+++ toolkit-resources/addon/toolkit-cnd/cnd/src/main/resources/hst-types.cnd	(revision )
@@ -297,6 +297,8 @@
 // the absolute location where, if this blueprint contains content, the content is created. If missing
 // the default contentRoot is used. It must start with a / 
 - hst:contentRoot (string)
+- hst:galleryRoot (string)
+- hst:assetsRoot (string)
 // prototype for the channel properties.
 // Used for default values
 + hst:channel (hst:channel)
