diff --git a/bin/indexer.php b/bin/indexer.php
new file mode 100755
index 0000000000000000000000000000000000000000..f84e1abf29a3b7771e3c5a6f36e67038b983c9eb
--- /dev/null
+++ b/bin/indexer.php
@@ -0,0 +1,134 @@
+#!/usr/bin/php
+<?php
+
+if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
+require_once(DOKU_INC.'inc/init.php');
+require_once(DOKU_INC.'inc/common.php');
+require_once(DOKU_INC.'inc/pageutils.php');
+require_once(DOKU_INC.'inc/search.php');
+require_once(DOKU_INC.'inc/indexer.php');
+require_once(DOKU_INC.'inc/cliopts.php');
+session_write_close();
+
+// handle options
+$short_opts = 'hcu';
+$long_opts  = array('help', 'clean', 'update');
+$OPTS = Doku_Cli_Opts::getOptions(__FILE__,$short_opts,$long_opts);
+if ( $OPTS->isError() ) {
+    fwrite( STDERR, $OPTS->getMessage() . "\n");
+    _usage();
+    exit(1);
+}
+$CLEAR = false;
+foreach ($OPTS->options as $key => $val) {
+    switch ($key) {
+        case 'h':
+        case 'help':
+            _usage();
+            exit;
+        case 'c':
+        case 'clear':
+            $CLEAR = true;
+            break;
+    }
+}
+
+#------------------------------------------------------------------------------
+# Action
+
+if($CLEAR) _clearindex(); 
+_update();
+
+
+
+#------------------------------------------------------------------------------
+
+function _usage() {
+    print "Usage: indexer.php <options>
+   
+    Updates the searchindex by indexing all new or changed pages
+    when the -c option is given the index is cleared first.
+    
+    OPTIONS
+        -h, --help     show this help and exit
+        -c, --clear    clear the index before updating
+";
+}
+
+function _update(){
+    global $conf;
+    $data = array();
+    echo "Searching pages... ";
+    search($data,$conf['datadir'],'search_allpages',array());
+    echo count($data)." pages found.\n";
+
+    foreach($data as $val){
+        _index($val['id']);
+    }
+}
+
+function _index($id){
+    global $CLEAR;
+
+    // if not cleared only update changed and new files
+    if(!$CLEAR){
+      $last = @filemtime(metaFN($id,'.indexed'));
+      if($last > @filemtime(wikiFN($id))) return;
+    }
+
+    _lock();
+    echo "$id... ";
+    idx_addPage($id);
+    io_saveFile(metaFN($id,'.indexed'),' ');
+    echo "done.\n";
+    _unlock();
+}
+
+/**
+ * lock the indexer system
+ */
+function _lock(){
+    global $conf;
+    $lock = $conf['lockdir'].'/_indexer.lock';
+    $said = false;
+    while(!@mkdir($lock)){
+        if(time()-@filemtime($lock) > 60*5){
+            // looks like a stale lock - remove it
+            @rmdir($lock);
+        }else{
+            if($said){
+                echo ".";
+            }else{
+                echo "Waiting for lockfile (max. 5 min)";
+                $said = true;
+            }
+            sleep(15);
+        }
+    }
+    if($said) print "\n";
+}
+
+/**
+ * unlock the indexer sytem
+ */
+function _unlock(){
+    global $conf;
+    $lock = $conf['lockdir'].'/_indexer.lock';
+    @rmdir($lock);
+}
+
+/**
+ * Clear all index files
+ */
+function _clearindex(){
+    global $conf;
+    _lock();
+    echo "Clearing index... ";
+    io_saveFile($conf['cachedir'].'/word.idx','');
+    io_saveFile($conf['cachedir'].'/page.idx','');
+    io_saveFile($conf['cachedir'].'/index.idx','');
+    echo "done.\n";
+    _unlock();
+}
+
+//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/lib/exe/indexer.php b/lib/exe/indexer.php
index 810e1eb4f784756cfa481c09fb0a0fbd53f16501..80dbb77f543a6aaab857ca6f7e74d5eba41d214c 100644
--- a/lib/exe/indexer.php
+++ b/lib/exe/indexer.php
@@ -71,7 +71,7 @@ while(!@mkdir($lock,0777)){
 idx_addPage($ID);
 
 // we're finished
-io_saveFile(metaFN($ID,'.indexed'),'');
+io_saveFile(metaFN($ID,'.indexed'),' ');
 @rmdir($lock);
 indexer_stop();