Index: main/plugin-explorer/src/org/ametys/plugins/explorer/ExplorerNode.java
===================================================================
--- main/plugin-explorer/src/org/ametys/plugins/explorer/ExplorerNode.java	(revision 33377)
+++ main/plugin-explorer/src/org/ametys/plugins/explorer/ExplorerNode.java	(working copy)
@@ -43,4 +43,11 @@
      * @throws AmetysRepositoryException if an error occurs.
      */
     public String getExplorerPath();
+    
+    /**
+     * Returns true if this explorer node contains child explorer nodes.
+     * @return true if this explorer node contains child explorer nodes.
+     * @throws AmetysRepositoryException if an error occurs.
+     */
+    public boolean hasChildExplorerNodes() throws AmetysRepositoryException;
 }
Index: main/plugin-explorer/src/org/ametys/plugins/explorer/calendar/jcr/JCRCalendar.java
===================================================================
--- main/plugin-explorer/src/org/ametys/plugins/explorer/calendar/jcr/JCRCalendar.java	(revision 33377)
+++ main/plugin-explorer/src/org/ametys/plugins/explorer/calendar/jcr/JCRCalendar.java	(working copy)
@@ -28,6 +28,7 @@
 import org.ametys.plugins.explorer.calendar.ModifiableCalendar;
 import org.ametys.plugins.repository.AmetysObject;
 import org.ametys.plugins.repository.AmetysObjectIterable;
+import org.ametys.plugins.repository.AmetysRepositoryException;
 import org.ametys.plugins.repository.jcr.DefaultTraversableAmetysObject;
 
 /**
@@ -161,4 +162,17 @@
         getMetadataHolder().setMetadata(CALENDAR_WORKFLOW_NAME, workflowName); 
     }
     
+    public boolean hasChildExplorerNodes() throws AmetysRepositoryException
+    {
+        for (AmetysObject child : getChildren())
+        {
+            if (child instanceof ExplorerNode)
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+    
 }
Index: main/plugin-explorer/src/org/ametys/plugins/explorer/cmis/CMISResourcesCollection.java
===================================================================
--- main/plugin-explorer/src/org/ametys/plugins/explorer/cmis/CMISResourcesCollection.java	(revision 33377)
+++ main/plugin-explorer/src/org/ametys/plugins/explorer/cmis/CMISResourcesCollection.java	(working copy)
@@ -230,7 +230,7 @@
         return true;
     }
     
-    public boolean hasChildResourceCollections() throws AmetysRepositoryException
+    public boolean hasChildExplorerNodes() throws AmetysRepositoryException
     {
         // we don't actually know if there are children or not, 
         // but it's an optimization to don't make another CMIS request
Index: main/plugin-explorer/src/org/ametys/plugins/explorer/cmis/CMISRootResourcesCollection.java
===================================================================
--- main/plugin-explorer/src/org/ametys/plugins/explorer/cmis/CMISRootResourcesCollection.java	(revision 33377)
+++ main/plugin-explorer/src/org/ametys/plugins/explorer/cmis/CMISRootResourcesCollection.java	(working copy)
@@ -289,7 +289,7 @@
         return true;
     }
     
-    public boolean hasChildResourceCollections() throws AmetysRepositoryException
+    public boolean hasChildExplorerNodes() throws AmetysRepositoryException
     {
         // we don't actually know if there are children or not, 
         // but it's an optimization to don't make another CMIS request
Index: main/plugin-explorer/src/org/ametys/plugins/explorer/resources/ResourceCollection.java
===================================================================
--- main/plugin-explorer/src/org/ametys/plugins/explorer/resources/ResourceCollection.java	(revision 33377)
+++ main/plugin-explorer/src/org/ametys/plugins/explorer/resources/ResourceCollection.java	(working copy)
@@ -36,16 +36,9 @@
     public String getResourcePath() throws AmetysRepositoryException;
     
     /**
-     * Returns true if this collection contains resources.
-     * @return true if this collection contains resources.
+     * Returns true if this explorer node contains resources.
+     * @return true if this explorer node contains resources.
      * @throws AmetysRepositoryException if an error occurs.
      */
     public boolean hasChildResources() throws AmetysRepositoryException;
-    
-    /**
-     * Returns true if this collection contains child collections.
-     * @return true if this collection contains child collections.
-     * @throws AmetysRepositoryException if an error occurs.
-     */
-    public boolean hasChildResourceCollections() throws AmetysRepositoryException;
 }
Index: main/plugin-explorer/src/org/ametys/plugins/explorer/resources/generators/ResourcesExplorerGenerator.java
===================================================================
--- main/plugin-explorer/src/org/ametys/plugins/explorer/resources/generators/ResourcesExplorerGenerator.java	(revision 33377)
+++ main/plugin-explorer/src/org/ametys/plugins/explorer/resources/generators/ResourcesExplorerGenerator.java	(working copy)
@@ -126,8 +126,12 @@
         childAtts.addCDATAAttribute("path", relPath.startsWith("/") ? relPath.substring(1) : relPath);
         childAtts.addCDATAAttribute("type", RESOURCE_COLLECTION);
         
-        boolean hasResources = ((ResourceCollection) node).hasChildResources();
-        boolean hasChildNodes = ((ResourceCollection) node).hasChildResourceCollections();
+        boolean hasResources = false;
+        if (node instanceof ResourceCollection)
+        {
+            hasResources = ((ResourceCollection) node).hasChildResources();
+        }
+        boolean hasChildNodes = node.hasChildExplorerNodes();
         
         if (hasChildNodes)
         {
Index: main/plugin-explorer/src/org/ametys/plugins/explorer/resources/jcr/JCRResourcesCollection.java
===================================================================
--- main/plugin-explorer/src/org/ametys/plugins/explorer/resources/jcr/JCRResourcesCollection.java	(revision 33377)
+++ main/plugin-explorer/src/org/ametys/plugins/explorer/resources/jcr/JCRResourcesCollection.java	(working copy)
@@ -23,7 +23,6 @@
 import org.ametys.plugins.explorer.ExplorerNode;
 import org.ametys.plugins.explorer.resources.ModifiableResourceCollection;
 import org.ametys.plugins.explorer.resources.Resource;
-import org.ametys.plugins.explorer.resources.ResourceCollection;
 import org.ametys.plugins.repository.AmetysObject;
 import org.ametys.plugins.repository.AmetysRepositoryException;
 import org.ametys.plugins.repository.CopiableAmetysObject;
@@ -108,11 +107,11 @@
         return false;
     }
     
-    public boolean hasChildResourceCollections() throws AmetysRepositoryException
+    public boolean hasChildExplorerNodes() throws AmetysRepositoryException
     {
         for (AmetysObject child : getChildren())
         {
-            if (child instanceof ResourceCollection)
+            if (child instanceof ExplorerNode)
             {
                 return true;
             }
Index: main/plugin-explorer/src/org/ametys/plugins/explorer/threads/jcr/JCRThread.java
===================================================================
--- main/plugin-explorer/src/org/ametys/plugins/explorer/threads/jcr/JCRThread.java	(revision 33377)
+++ main/plugin-explorer/src/org/ametys/plugins/explorer/threads/jcr/JCRThread.java	(working copy)
@@ -22,6 +22,7 @@
 import org.ametys.plugins.explorer.ExplorerNode;
 import org.ametys.plugins.explorer.ModifiableExplorerNode;
 import org.ametys.plugins.repository.AmetysObject;
+import org.ametys.plugins.repository.AmetysRepositoryException;
 import org.ametys.plugins.repository.jcr.DefaultTraversableAmetysObject;
 
 /**
@@ -148,4 +149,17 @@
             return "";
         }
     }
+
+    public boolean hasChildExplorerNodes() throws AmetysRepositoryException
+    {
+        for (AmetysObject child : getChildren())
+        {
+            if (child instanceof ExplorerNode)
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
 }
