diff --git a/images/closed.gif b/images/closed.gif
new file mode 100644
index 0000000000000000000000000000000000000000..8414d4d69fa9cba7821efd06e5afba8134be2d10
Binary files /dev/null and b/images/closed.gif differ
diff --git a/images/open.gif b/images/open.gif
new file mode 100644
index 0000000000000000000000000000000000000000..f5d5c7e56f01c1933ab59785f73a12e6c004de60
Binary files /dev/null and b/images/open.gif differ
diff --git a/inc/html.php b/inc/html.php
index 7624e238c719625dc9d49a5132a86b01cd08a30c..37fad428ae7a3bb68e6d8938bb7a6b98451e3eaa 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -663,7 +663,7 @@ function html_index($ns){
 
   $data = array();
   search($data,$conf['datadir'],'search_index',array('ns' => $ns));
-  print html_buildlist($data,'idx','html_list_index');
+  print html_buildlist($data,'idx','html_list_index','html_li_index');
 }
 
 /**
@@ -687,17 +687,47 @@ function html_list_index($item){
   return $ret;
 }
 
+/**
+ * Index List item
+ *
+ * This user function is used in html_build_lidt to build the
+ * <li> tags for namespaces when displaying the page index
+ * it gives different classes to opened or closed "folders"
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function html_li_index($item){
+  if($item['type'] == "f"){
+    return '<li class="level'.$item['level'].'">';
+  }elseif($item['open']){
+    return '<li class="open">';
+  }else{
+    return '<li class="closed">';
+  }
+}
+
+/**
+ * Default List item
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function html_li_default($item){
+  return '<li class="level'.$item['level'].'">';
+}
+
 /**
  * Build an unordered list
  *
  * Build an unordered list from the given $data array
  * Each item in the array has to have a 'level' property
  * the item itself gets printed by the given $func user
- * function
+ * function. The second and optional function is used to
+ * print the <li> tag. Both user function need to accept
+ * a single item.
  *
  * @author Andreas Gohr <andi@splitbrain.org>
  */
-function html_buildlist($data,$class,$func){
+function html_buildlist($data,$class,$func,$lifunc='html_li_default'){
   $level = 0;
   $opens = 0;
   $ret   = '';
@@ -723,7 +753,7 @@ function html_buildlist($data,$class,$func){
     $level = $item['level'];
 
     //print item
-    $ret .= '<li class="level'.$item['level'].'">';
+    $ret .= $lifunc($item); //user function
     $ret .= '<span class="li">';
     $ret .= $func($item); //user function
     $ret .= '</span>';
diff --git a/inc/search.php b/inc/search.php
index c620b713337d62374a7ce25b6beeb5d4b731e970..46b36f816738cc6a2ce9c9170df400b875054fa7 100644
--- a/inc/search.php
+++ b/inc/search.php
@@ -79,6 +79,8 @@ function search(&$data,$base,$func,$opts,$dir='',$lvl=1){
 function search_index(&$data,$base,$file,$type,$lvl,$opts){
   $return = true;
 
+  $item = array();
+
   if($type == 'd' && !preg_match('#^'.$file.'(/|$)#','/'.$opts['ns'])){
     //add but don't recurse
     $return = false;
@@ -95,7 +97,8 @@ function search_index(&$data,$base,$file,$type,$lvl,$opts){
 
   $data[]=array( 'id'    => $id,
                  'type'  => $type,
-                 'level' => $lvl );
+                 'level' => $lvl,
+                 'open'  => $return );
   return $return;
 }
 
diff --git a/style.css b/style.css
index 7bf145b069e9b539adfb4db9f66cb9750de268d3..79cd594680ce53b1addc4395f23615916fada1f7 100644
--- a/style.css
+++ b/style.css
@@ -368,6 +368,14 @@ span.li {
   font-weight: normal;
 }
 
+li.open {
+  list-style-image: url(images/open.gif);
+}
+
+li.closed {
+  list-style-image: url(images/closed.gif);
+}
+
 .quote {
   border-left: 2px solid #8cacbb;
   padding-left: 3px;