memory improvements to IndexShard, a=chris

Chris Pollett [2011-07-12 04:Jul:th]
memory improvements to IndexShard, a=chris
Filename
bin/fetcher.php
bin/queue_server.php
browser_extensions/firefox/yiooptoolbar/chrome/content/main.js
configs/config.php
controllers/traffic_controller.php
index.php
lib/index_bundle_iterators/group_iterator.php
lib/index_bundle_iterators/intersect_iterator.php
lib/index_bundle_iterators/word_iterator.php
lib/index_dictionary.php
lib/index_shard.php
lib/persistent_structure.php
lib/utility.php
locale/ar/configure.ini
locale/de/configure.ini
locale/en-US/configure.ini
locale/en-US/statistics.txt
locale/es/configure.ini
locale/fr-FR/configure.ini
locale/he/configure.ini
locale/in-ID/configure.ini
locale/it/configure.ini
locale/ja/configure.ini
locale/ja/statistics.txt
locale/ko/configure.ini
locale/pl/configure.ini
locale/pt/configure.ini
locale/ru/configure.ini
locale/th/configure.ini
locale/vi-VN/configure.ini
locale/vi-VN/statistics.txt
locale/zh-CN/configure.ini
tests/index_shard_test.php
views/crawlstatus_view.php
diff --git a/bin/fetcher.php b/bin/fetcher.php
index 6d8e0b770..dc9ed78ad 100755
--- a/bin/fetcher.php
+++ b/bin/fetcher.php
@@ -1370,7 +1370,6 @@ class Fetcher implements CrawlConstants
             }
             $had_links = false;

-            $link_shard = new IndexShard("link_shard");
             foreach($site[self::LINKS] as $url => $link_text) {
                 $link_meta_ids = array();
                 if(strlen($url) > 0) {
@@ -1410,7 +1409,7 @@ class Fetcher implements CrawlConstants
                     $link_word_lists =
                         PhraseParser::extractPhrasesInLists($link_text,
                             MAX_PHRASE_LEN, $lang);
-                    $link_shard->addDocumentWords($link_keys,
+                    $index_shard->addDocumentWords($link_keys,
                         self::NEEDS_OFFSET_FLAG,
                         $link_word_lists, $link_meta_ids, false, $link_rank);

@@ -1424,8 +1423,6 @@ class Fetcher implements CrawlConstants
             $index_shard->addDocumentWords($doc_keys, self::NEEDS_OFFSET_FLAG,
                 $word_lists, $meta_ids, true, $doc_rank);

-            $index_shard->appendIndexShard($link_shard);
-
         }

         $this->found_sites[self::INVERTED_INDEX] = $index_shard->save(true);
diff --git a/bin/queue_server.php b/bin/queue_server.php
index 2c3f1eb44..4c3ac03f3 100755
--- a/bin/queue_server.php
+++ b/bin/queue_server.php
@@ -448,9 +448,21 @@ class QueueServer implements CrawlConstants
                         crawlLog("Performing an archive crawl of ".
                             "archive with timestamp ".$this->crawl_index);
                     }
+                    $crawl_status = array();
+                    $crawl_status['MOST_RECENT_FETCHER'] = "";
+                    $crawl_status['MOST_RECENT_URLS_SEEN'] = array();
+                    $crawl_status['CRAWL_TIME'] = $this->crawl_time;
+                    $crawl_status['COUNT'] = 0;
+                    $crawl_status['DESCRIPTION'] = "BEGIN_CRAWL";
+                    file_put_contents(
+                        CRAWL_DIR."/schedules/crawl_status.txt",
+                        serialize($crawl_status));
+                    chmod(
+                        CRAWL_DIR."/schedules/crawl_status.txt", 0777);
                 break;

                 case "STOP_CRAWL":
+                    crawlLog("Stopping crawl !! This involves multiple steps!");
                     $crawl_status = array();
                     $crawl_status['MOST_RECENT_FETCHER'] = "";
                     $crawl_status['MOST_RECENT_URLS_SEEN'] = array();
@@ -468,7 +480,7 @@ class QueueServer implements CrawlConstants
                     $this->db->setWorldPermissionsRecursive(
                         CRAWL_DIR.'/cache/'.
                         self::index_data_base_name.$this->crawl_time);
-                    crawlLog("Stopping crawl !!\n");
+
                     $info[self::STATUS] = self::WAITING_START_MESSAGE_STATE;
                     //Added by Priya Gangaraju.
                     //Calling post processing function if the processor is
@@ -496,6 +508,7 @@ class QueueServer implements CrawlConstants
                     if(file_exists(CRAWL_DIR."/schedules/crawl_status.txt")) {
                         unlink(CRAWL_DIR."/schedules/crawl_status.txt");
                     }
+                    crawlLog("Crawl has been succesfully stopped!!");
                 break;

                 case "RESUME_CRAWL":
@@ -944,6 +957,7 @@ class QueueServer implements CrawlConstants
             $start_time = microtime();

             $this->index_archive->addIndexData($index_shard);
+            crawlLog("WORD_DOC_LEN ".$this->index_archive->getActiveShard()->word_docs_len);
             $this->index_dirty = true;
         }
         crawlLog("D (add index shard) memory usage".memory_get_usage().
diff --git a/browser_extensions/firefox/yiooptoolbar/chrome/content/main.js b/browser_extensions/firefox/yiooptoolbar/chrome/content/main.js
index c493db425..50e99051a 100644
--- a/browser_extensions/firefox/yiooptoolbar/chrome/content/main.js
+++ b/browser_extensions/firefox/yiooptoolbar/chrome/content/main.js
@@ -80,7 +80,7 @@ function getword(event){
         "timestamp TEXT, language TEXT)");

     var stmt = mDBConn.createStatement("INSERT INTO search_capture " +
-        "(word,searchurl,searchurl1,timestamp,language) " +
+        "(word, searchurl, searchurl1, timestamp, language) " +
         "VALUES(:word1,:url1,:url2,:time1,:lang1)");

     var params = stmt.newBindingParamsArray();
diff --git a/configs/config.php b/configs/config.php
index 2c0bf9a9e..3d3e1e2f2 100755
--- a/configs/config.php
+++ b/configs/config.php
@@ -185,7 +185,7 @@ define('MIN_QUEUE_WEIGHT', 1/100000);
 define('NUM_ARCHIVE_PARTITIONS', 10);

 /** number of documents before next gen */
-define('NUM_DOCS_PER_GENERATION', 50000);
+define('NUM_DOCS_PER_GENERATION', 75000);

 /** precision to round floating points document scores */
 define('PRECISION', 10);
@@ -329,7 +329,7 @@ define ('MINIMUM_FETCH_LOOP_TIME', 5);

 /** Max time before dirty index (queue_server) and
     filters (fetcher) will be force saved in seconds*/
-define('FORCE_SAVE_TIME', 600);
+define('FORCE_SAVE_TIME', 1200);

 /** default number of search results to display per page */
 define ('NUM_RESULTS_PER_PAGE', 10);
diff --git a/controllers/traffic_controller.php b/controllers/traffic_controller.php
index 36cd1b039..78e30c69e 100644
--- a/controllers/traffic_controller.php
+++ b/controllers/traffic_controller.php
@@ -79,8 +79,11 @@ class TrafficController extends Controller implements CrawlConstants
            from a legitimate machine
          */

-
+        $result = $this->signinModel->checkValidSignin(
+        $this->clean($_POST['u'], "string"),
+        $this->clean($_POST['p'], "string") );
         $activity = $_REQUEST['a'];
+
         //echo "OK";
         if(in_array($activity, $this->activities)) {$this->$activity();}

diff --git a/index.php b/index.php
index ca931d0ba..5c72db80c 100755
--- a/index.php
+++ b/index.php
@@ -153,7 +153,7 @@ function checkAllowedController($controller_name)
 /**
  * shorthand for echo
  *
- * @param string $text   string to send to the current output
+ * @param string $text string to send to the current output
  */
 function e($text)
 {
diff --git a/lib/index_bundle_iterators/group_iterator.php b/lib/index_bundle_iterators/group_iterator.php
index 3de9e7e11..7f462d601 100644
--- a/lib/index_bundle_iterators/group_iterator.php
+++ b/lib/index_bundle_iterators/group_iterator.php
@@ -509,7 +509,7 @@ class GroupIterator extends IndexBundleIterator
                 $min = ($current_rank < $min ) ? $current_rank : $min;
                 $max = ($max < $current_rank ) ? $current_rank : $max;
                 $sum_score += $hash_page[self::DOC_RANK]
-                    * $relevance_boost * $hash_page[self::RELEVANCE] *
+                    * $relevance_boost * pow(1.3,$hash_page[self::RELEVANCE]) *
                     $hash_page[self::PROXIMITY] * $domain_weights[$hash_host];
                 $sum_rank += $hash_page[self::DOC_RANK]
                     * $domain_weights[$hash_host];
diff --git a/lib/index_bundle_iterators/intersect_iterator.php b/lib/index_bundle_iterators/intersect_iterator.php
index 25b728aba..27887991c 100644
--- a/lib/index_bundle_iterators/intersect_iterator.php
+++ b/lib/index_bundle_iterators/intersect_iterator.php
@@ -170,16 +170,23 @@ class IntersectIterator extends IndexBundleIterator
             for($i = 1; $i < $this->num_iterators; $i++) {
                 $i_docs =
                     $this->index_bundle_iterators[$i]->currentDocsWithWord();
-                $position_lists[$i] = $i_docs[$key][self::POSITION_LIST];
-                $len_lists[$i] = count($position_lists[$i]);
+                if(isset($i_docs[$key][self::POSITION_LIST]) &&
+                   ($ct = count($i_docs[$key][self::POSITION_LIST]) > 0 )) {
+                    $position_lists[] = $i_docs[$key][self::POSITION_LIST];
+                    $len_lists[] = $ct;
+                }
+
                 if(isset($i_docs[$key])) {
                     $docs[$key][self::RELEVANCE] +=
                         $i_docs[$key][self::RELEVANCE];
                 }
             }
-            $docs[$key][self::PROXIMITY] =
-                $this->computeProximity($position_lists, $len_lists);
-
+            if(count($position_lists) > 1) {
+                $docs[$key][self::PROXIMITY] =
+                    $this->computeProximity($position_lists, $len_lists);
+            } else {
+                 $docs[$key][self::PROXIMITY] = 1;
+            }
             $docs[$key][self::SCORE] = $docs[$key][self::DOC_RANK] *
                  $docs[$key][self::RELEVANCE] * $docs[$key][self::PROXIMITY];
         }
diff --git a/lib/index_bundle_iterators/word_iterator.php b/lib/index_bundle_iterators/word_iterator.php
index 76e7a0e23..a1f08d325 100644
--- a/lib/index_bundle_iterators/word_iterator.php
+++ b/lib/index_bundle_iterators/word_iterator.php
@@ -71,25 +71,26 @@ class WordIterator extends IndexBundleIterator
     var $next_offset;

     /**
-     *
+     * An array of shard generation and posting list offsets, lengths, and
+     * numbers of documents
      * @var array
      */
     var $dictionary_info;

     /**
-     *
+     * The total number of shards that have data for this word
      * @var int
      */
     var $num_generations;

     /**
-     *
+     * Index into dictionary_info corresponding to the current shard
      * @var int
      */
     var $generation_pointer;

     /**
-     * The current byte offset in the IndexShard
+     * Numeric number of current shard
      * @var int
      */
     var $current_generation;
@@ -142,6 +143,7 @@ class WordIterator extends IndexBundleIterator

         }
         $this->word_key = $word_key;
+
         $this->index =  $index;
         $this->current_block_fresh = false;
         $this->dictionary_info =
diff --git a/lib/index_dictionary.php b/lib/index_dictionary.php
index 3fb21b71c..72c7d83a5 100644
--- a/lib/index_dictionary.php
+++ b/lib/index_dictionary.php
@@ -591,6 +591,9 @@ class IndexDictionary implements CrawlConstants
         return $num_docs_array;
      }

+    /**
+     *
+     */
     function getInfoItem($hash_info_url)
     {

diff --git a/lib/index_shard.php b/lib/index_shard.php
index bad828c73..cd7d1809a 100644
--- a/lib/index_shard.php
+++ b/lib/index_shard.php
@@ -222,6 +222,22 @@ class IndexShard extends PersistentStructure implements CrawlConstants
      * @var int
      */
     var $file_len;
+
+    /**
+     *
+     */
+     var $last_flattened_words_count;
+
+    /**
+     *
+     */
+    var $word_postings;
+
+    /**
+     *
+     */
+    const FLATTEN_MERGE_RATIO = 0.25;
+

     /**
      * Used to keep track of whether a record in document infos is for a
@@ -293,8 +309,10 @@ class IndexShard extends PersistentStructure implements CrawlConstants
         $this->generation = $generation;
         $this->num_docs_per_generation = $num_docs_per_generation;
         $this->word_docs = "";
+        $this->word_postings = "";
         $this->words_len = 0;
         $this->word_docs_len = 0;
+        $this->last_flattened_words_count = 0;
         $this->words = array();
         $this->docids_len = 0;
         $this->doc_infos = "";
@@ -331,7 +349,9 @@ class IndexShard extends PersistentStructure implements CrawlConstants
         $meta_ids = array(), $is_doc = false, $rank = false)
     {
         if($this->word_docs_packed == true) {
-            $this->unpackWordDocs();
+            $this->words = array();
+            $this->word_docs = "";
+            $this->word_docs_packed = false;
         }

         $doc_len = 0;
@@ -358,11 +378,12 @@ class IndexShard extends PersistentStructure implements CrawlConstants
             $word_lists[$meta_id] = array();
         }

+        //using $this->docids_len divisible by 16
+        $doc_offset = $this->docids_len >> 4;
         foreach($word_lists as $word => $position_list) {
             $occurrences = count($position_list);
             $word_id = crawlHash($word, true);
-            //using $this->docids_len divisible by 16
-            $store = $this->packPosting($this->docids_len >> 4, $position_list);
+            $store = $this->packPosting($doc_offset, $position_list);

             if(!isset($this->words[$word_id])) {
                 $this->words[$word_id] = $store;
@@ -416,12 +437,62 @@ class IndexShard extends PersistentStructure implements CrawlConstants
             $word_id = unbase64Hash($word_id);
         }

-        if($this->read_only_from_disk) {
-            return $this->getWordInfoDisk($word_id);
-        }
-        return $this->getWordInfoLoaded($word_id);
+        $is_disk = $this->read_only_from_disk;
+        $word_item_len = self::WORD_ITEM_LEN;
+
+        if($is_disk) {
+            $this->getShardHeader();

+            $prefix = (ord($word_id[0]) << 8) + ord($word_id[1]);
+            $prefix_info = $this->getShardSubstring(
+                self::HEADER_LENGTH + 8*$prefix, 8);
+            if($prefix_info == self::BLANK) {
+                return false;
+            }
+            $offset = unpackInt(substr($prefix_info, 0, 4));

+            $high = unpackInt(substr($prefix_info, 4, 4)) - 1;
+
+            $start = self::HEADER_LENGTH + $this->prefixes_len  + $offset;
+        } else {
+            if($this->word_docs_packed == false) {
+                $this->mergeWordPostingsToString();
+                $this->packWords(NULL);
+                $this->outputPostingLists();
+            }
+            $start = 0;
+            $high = (strlen($this->words) - $word_item_len)/$word_item_len;
+        }
+        $low = 0;
+        $check_loc = (($low + $high) >> 1);
+        do {
+            $old_check_loc = $check_loc;
+            if($is_disk) {
+                $word_string = $this->getShardSubstring($start +
+                    $check_loc * $word_item_len, $word_item_len);
+            } else {
+                $word_string = substr($this->words, $start +
+                    $check_loc * $word_item_len, $word_item_len);
+            }
+            if($word_string == false) {return false;}
+            $id = substr($word_string, 0, self::WORD_KEY_LEN);
+            $cmp = strcmp($word_id, $id);
+            if($cmp === 0) {
+                return $this->getWordInfoFromString(
+                    substr($word_string, self::WORD_KEY_LEN));
+            } else if ($cmp < 0) {
+                $high = $check_loc;
+                $check_loc = (($low + $check_loc) >> 1);
+            } else {
+                if($check_loc + 1 == $high) {
+                    $check_loc++;
+                }
+                $low = $check_loc;
+                $check_loc = (($high + $check_loc) >> 1);
+            }
+        } while($old_check_loc != $check_loc);
+
+        return false;

     }

@@ -444,7 +515,9 @@ class IndexShard extends PersistentStructure implements CrawlConstants
     function getPostingsSlice($start_offset, &$next_offset, $last_offset, $len)
     {
         if(!$this->read_only_from_disk && !$this->word_docs_packed) {
-            $this->packWordDocs();
+            $this->mergeWordPostingsToString();
+            $this->packWords(NULL);
+            $this->outputPostingLists();
         }

         $num_docs_so_far = 0;
@@ -463,7 +536,6 @@ class IndexShard extends PersistentStructure implements CrawlConstants
             $results[$doc_id] = $item;
             $num_docs_so_far += ($next_offset - $old_next_offset)
                 / self::POSTING_LEN;
-
         } while ($next_offset<= $last_offset && $num_docs_so_far < $len
             && $next_offset > $old_next_offset);

@@ -502,17 +574,15 @@ class IndexShard extends PersistentStructure implements CrawlConstants
     function makeItem(&$item, &$current_offset, $num_doc_or_links,
         $occurs = 0)
     {
-        $current = $current_offset/self::POSTING_LEN;
+        $current = ($current_offset/self::POSTING_LEN );
         $posting_start = $current;
         $posting_end = $current;
         $posting = $this->getPostingAtOffset(
                 $current, $posting_start, $posting_end);
-
         $current_offset = ($posting_end + 1)* self::POSTING_LEN;
         $offset = 0;
         list($doc_index, $item[self::POSITION_LIST]) =
             $this->unpackPosting($posting, $offset);
-
         $item[self::PROXIMITY] = 1;
         $occurrences = count($item[self::POSITION_LIST]);

@@ -526,9 +596,8 @@ class IndexShard extends PersistentStructure implements CrawlConstants
             $doc_depth, PRECISION);

         $doc_loc = $doc_index << 4;
-
         $doc_info_string = $this->getDocInfoSubstring($doc_loc,
-            self::DOC_KEY_LEN);
+            self::DOC_KEY_LEN);
         $item[self::SUMMARY_OFFSET] = unpackInt(
             substr($doc_info_string, 0, 4));
         list($doc_len, $num_keys) =
@@ -756,9 +825,11 @@ class IndexShard extends PersistentStructure implements CrawlConstants
     function getPostingsSliceById($word_id, $len)
     {
         $results = array();
-        if(isset($this->words[$word_id])) {
+        $info = $this->getWordInfo($word_id, true);
+
+        if($info !== false) {
             list($first_offset, $last_offset,
-                $num_docs_or_links) = $this->getWordInfo($word_id, true);
+                $num_docs_or_links) = $info;
             $results = $this->getPostingsSlice($first_offset,
                 $first_offset, $last_offset, $len);
         }
@@ -774,7 +845,9 @@ class IndexShard extends PersistentStructure implements CrawlConstants
     function appendIndexShard($index_shard)
     {
         if($this->word_docs_packed == true) {
-            $this->unpackWordDocs();
+            $this->words = array();
+            $this->word_docs = "";
+            $this->word_docs_packed = false;
         }
         if($index_shard->word_docs_packed == true) {
             $index_shard->unpackWordDocs();
@@ -817,6 +890,103 @@ class IndexShard extends PersistentStructure implements CrawlConstants
         $this->num_link_docs += $index_shard->num_link_docs;
         $this->len_all_docs += $index_shard->len_all_docs;
         $this->len_all_link_docs += $index_shard->len_all_link_docs;
+
+        if($this->num_docs - $this->last_flattened_words_count >
+            self::FLATTEN_MERGE_RATIO * $this->num_docs_per_generation) {
+            $this->mergeWordPostingsToString();
+        }
+    }
+
+    /**
+     *
+     */
+    function mergeWordPostingsToString()
+    {
+        if($this->word_docs_packed) {
+            return;
+        }
+        ksort($this->words, SORT_STRING);
+        $tmp_string = "";
+        $offset = 0;
+        $write_offset = 0;
+        $len = strlen($this->word_postings);
+        $key_len = self::WORD_KEY_LEN;
+        $posting_len = self::POSTING_LEN;
+        $item_len = $key_len + $posting_len;
+        foreach($this->words as $word_id => $postings) {
+            $cmp = -1;
+            while($cmp < 0 && $offset + $item_len <= $len) {
+                $key = substr($this->word_postings, $offset, $key_len);
+                $key_posts_len = unpackInt(substr(
+                    $this->word_postings, $offset + $key_len, $posting_len));
+                $key_postings = substr($this->word_postings,
+                    $offset + $item_len, $key_posts_len);
+                $word_id_posts_len = strlen($postings);
+                $cmp = strcmp($key, $word_id);
+                if($cmp == 0) {
+                    $tmp_string .= $key .
+                        packInt($key_posts_len + $word_id_posts_len) .
+                        $key_postings . $postings;
+                    $offset += $item_len + $key_posts_len;
+                } else if ($cmp < 0) {
+                    $tmp_string .= $key .packInt($key_posts_len). $key_postings;
+                    $offset += $item_len + $key_posts_len;
+                } else {
+                    $tmp_string .= $word_id .
+                        packInt($word_id_posts_len). $postings;
+                }
+                $tmp_len = strlen($tmp_string);
+                $copy_data_len = min(self::SHARD_BLOCK_SIZE, $tmp_len);
+                $copy_to_len = min($offset - $write_offset,
+                    $len - $write_offset);
+                if($copy_to_len > $copy_data_len) {
+                    charCopy($tmp_string, $this->word_postings, $write_offset,
+                        $copy_data_len);
+                    $write_offset += $copy_data_len;
+                    $tmp_string = substr($tmp_string, $copy_data_len);
+                }
+           }
+           if($offset + $item_len > $len) {
+                $word_id_posts_len = strlen($postings);
+                if($write_offset < $len) {
+                    $tmp_len = strlen($tmp_string);
+                    $copy_data_len = $len - $write_offset;
+                    if($tmp_len < $copy_data_len) { // this case shouldn't occur
+                        $this->word_postings =
+                            substr($this->word_postings, 0, $write_offset);
+                        $this->word_postings .= $tmp_string;
+                    } else {
+                        charCopy($tmp_string, $this->word_postings,
+                            $write_offset, $copy_data_len);
+                        $this->word_postings .=
+                             substr($tmp_string, $copy_data_len);
+                        $tmp_string = "";
+                    }
+                    $tmp_string = "";
+                    $write_offset = $len;
+                }
+                $this->word_postings .=
+                    $word_id . packInt($word_id_posts_len). $postings;
+            }
+        }
+        if($tmp_string != "") {
+            $tmp_len = strlen($tmp_string);
+            $copy_data_len = $offset - $write_offset;
+            $pad_len = $tmp_len - $copy_data_len;
+            $pad = str_pad("", $pad_len, "@");
+            $this->word_postings .= $pad;
+            for($j = $len + $pad_len - 1,
+                $k = $len - 1; $k >= $offset; $j--, $k--) {
+                $this->word_postings[$j] = "" . $this->word_postings[$k];
+                    /*way slower if directly
+                    assign!!! PHP is crazy*/
+            }
+            charCopy($tmp_string, $this->word_postings,
+                $write_offset, $tmp_len);
+        }
+
+        $this->words = array();
+        $this->last_flattened_words_count = $this->num_docs;
     }

     /**
@@ -837,9 +1007,10 @@ class IndexShard extends PersistentStructure implements CrawlConstants
     function changeDocumentOffsets($docid_offsets)
     {
         if($this->word_docs_packed == true) {
-            $this->unpackWordDocs();
+            $this->words = array();
+            $this->word_docs = "";
+            $this->word_docs_packed = false;
         }
-
         $docids_len = $this->docids_len;

         for($i = 0 ; $i < $docids_len; $i += $row_len) {
@@ -900,9 +1071,7 @@ class IndexShard extends PersistentStructure implements CrawlConstants
     public function save($to_string = false)
     {
         $out = "";
-        if($this->word_docs_packed == true){
-            $this->unpackWordDocs();
-        }
+        $this->mergeWordPostingsToString();
         $this->prepareWordsAndPrefixes();
         $header =  pack("N", $this->prefixes_len) .
             pack("N", $this->words_len) .
@@ -916,36 +1085,52 @@ class IndexShard extends PersistentStructure implements CrawlConstants
             pack("N", $this->len_all_link_docs);
         if($to_string) {
             $out = $header;
-            $out .= $this->packWordDocs(NULL, true);
+            $this->packWords(NULL);
+            $out .= $this->words;
+            $this->outputPostingLists(NULL);
             $out .= $this->word_docs;
             $out .= $this->doc_infos;
         } else {
             $fh = fopen($this->filename, "wb");
             fwrite($fh, $header);
             fwrite($fh, $this->prefixes);
-            $this->packWordDocs($fh);
-            fwrite($fh, $this->word_docs);
+            $this->packWords($fh);
+            $this->outputPostingLists($fh);
             fwrite($fh, $this->doc_infos);
             fclose($fh);
         }
+        // clean up by returning to state where could add more docs
+        $this->words = array();
+        $this->word_docs = "";
+        $this->prefixes = "";
+        $this->word_docs_packed = false;
         return $out;
     }

     /**
      * Computes the prefix string index for the current words array.
      * This index gives offsets of the first occurrences of the lead two char's
-     * of a word_id in the words array.
+     * of a word_id in the words array. This method assumes that the word
+     * data is already in >word_postings
      */
     function prepareWordsAndPrefixes()
     {
-        $this->words_len = count($this->words) * IndexShard::WORD_ITEM_LEN;
-        ksort($this->words, SORT_STRING);
+        $word_item_len = IndexShard::WORD_ITEM_LEN;
+        $key_len = self::WORD_KEY_LEN;
+        $posting_len = self::POSTING_LEN;
+        $this->words_len = 0;
+        $word_postings_len = strlen($this->word_postings);
+        $pos = 0;
         $tmp = array();
         $offset = 0;
         $num_words = 0;
         $old_prefix = false;
-        $word_item_len = IndexShard::WORD_ITEM_LEN;
-        foreach($this->words as $first => $rest) {
+        while($pos < $word_postings_len) {
+            $this->words_len += $word_item_len;
+            $first = substr($this->word_postings, $pos, $key_len);
+            $post_len = unpackInt(substr($this->word_postings,
+                $pos + $key_len, $posting_len));
+            $pos += $key_len + $posting_len + $post_len;
             $prefix = (ord($first[0]) << 8) + ord($first[1]);
             if($old_prefix === $prefix) {
                 $num_words++;
@@ -959,6 +1144,7 @@ class IndexShard extends PersistentStructure implements CrawlConstants
                 $num_words = 1;
             }
         }
+
         $tmp[$old_prefix] = packInt($offset) . packInt($num_words);
         $num_prefixes = 2 << 16;
         $this->prefixes = "";
@@ -974,29 +1160,43 @@ class IndexShard extends PersistentStructure implements CrawlConstants

     /**
      * Posting lists are initially stored associated with a word as a key
-     * value pair. This function makes one long concatenated string out of
-     * them, word_docs, and changes the words dictionarys from pairs
-     * word_id, posting list to triples word_id, start_offset, end_offset where
-     * offsets are into this concatenated word_docs string. Finally, if
-     * a file handle is given it write the word dictionary out to the file as
-     * a long string.
+     * value pair. The merge operation then merges them these to a string
+     * help by word_postings. packWords separates words from postings.
+     * After being applied words is a string consisting of
+     * triples (as concatenated strings) word_id, start_offset, end_offset.
+     * The offsets refer to integers offsets into a string $this->word_docs
+     * Finally, if a file handle is given its write the word dictionary out
+     * to the file as a long string. This function assumes
+     * mergeWordPostingsToString has just been called.
      *
      * @param resource $fh a file handle to write the dictionary to, if desired
      * @param bool $to_string whether to return a string containing the packed
      *      data
-     * @return string the packed data as a string if $to_string true else the
-     *  empty string;
+
      */
-    function packWordDocs($fh = null, $to_string = false)
+    function packWords($fh = NULL)
     {
         if($this->word_docs_packed) {
             return;
         }
+        $word_item_len = IndexShard::WORD_ITEM_LEN;
+        $key_len = self::WORD_KEY_LEN;
+        $posting_len = self::POSTING_LEN;
         $this->word_docs_len = 0;
-        $this->word_docs = "";
+        $this->words = "";
         $total_out = "";
-        foreach($this->words as $word_id => $postings) {
-            $len = strlen($postings);
+        $word_postings_len = strlen($this->word_postings);
+        $pos = 0;
+        while($pos < $word_postings_len) {
+            $word_id = substr($this->word_postings, $pos, $key_len);
+            $len = unpackInt(substr($this->word_postings,
+                $pos + $key_len, $posting_len));
+if($len > 100000000) {
+    echo "OOOOOOOOOOO NOOOOOOOOOOOOOOO!!!!!!!";
+}
+            $postings = substr($this->word_postings,
+                $pos + $key_len + $posting_len, $len);
+            $pos += $key_len + $posting_len + $len;
             /*
                 we pack generation info to make it easier to build the global
                 dictionary
@@ -1006,24 +1206,67 @@ class IndexShard extends PersistentStructure implements CrawlConstants
                 $out = packInt($this->generation)
                     . packInt($this->word_docs_len)
                     . packInt($len);
-                $this->word_docs .= $postings;
                 $this->word_docs_len += $len;
-                $this->words[$word_id] = $out;
+                $this->words .= $word_id . $out;
             } else {
                 $out = substr($postings,
                     self::POSTING_LEN, self::WORD_ITEM_LEN);
                 $out[0] = chr((0x80 | ord($out[0])));
-                $this->words[$word_id] = $out;
-            }
-            if($fh != null) {
-                fwrite($fh, $word_id . $out);
-            }
-            if($to_string) {
-                $total_out .= $word_id . $out;
+                $this->words .= $word_id . $out;
             }
         }
+        if($fh != null) {
+            fwrite($fh, $this->words);
+        }
+        $this->words_len = strlen($this->words);
         $this->word_docs_packed = true;
-        return $total_out;
+    }
+
+    /**
+     *
+     */
+    function outputPostingLists($fh = NULL)
+    {
+        $word_item_len = IndexShard::WORD_ITEM_LEN;
+        $key_len = self::WORD_KEY_LEN;
+        $posting_len = self::POSTING_LEN;
+        $this->word_docs = "";
+        $total_out = "";
+        $word_postings_len = strlen($this->word_postings);
+        $pos = 0;
+        $tmp_string = "";
+        $tmp_len = 0;
+        while($pos < $word_postings_len) {
+            $word_id = substr($this->word_postings, $pos, $key_len);
+            $len = unpackInt(substr($this->word_postings,
+                $pos + $key_len, $posting_len));
+            $postings = substr($this->word_postings,
+                $pos + $key_len + $posting_len, $len);
+            $pos += $key_len + $posting_len + $len;
+
+            if($len != 2* self::DOC_KEY_LEN ||
+                substr($postings, 0, self::POSTING_LEN) != self::HALF_BLANK) {
+                if($fh != NULL) {
+                    if($tmp_len < 100000) {
+                        $tmp_string .= $postings;
+                        $tmp_len += $len;
+                    } else {
+                        fwrite($fh, $tmp_string);
+                        $tmp_string = $postings;
+                        $tmp_len = $len;
+                    }
+                } else {
+                    $this->word_docs .= $postings;
+                }
+           }
+        }
+        if($tmp_len > 0) {
+            if($fh == NULL ) {
+                $this->word_docs .= $tmp_string;
+            } else {
+                fwrite($fh, $tmp_string);
+            }
+        }
     }

     /**
@@ -1150,81 +1393,6 @@ class IndexShard extends PersistentStructure implements CrawlConstants
         return array($doc_index, $position_list);
     }

-    /**
-     * Returns the first offset, last offset, and number of documents the
-     * word occurred in for this shard. The first offset (similarly, the last
-     * offset) is the byte offset into the word_docs string of the first
-     * (last) record involving that word. This method assumes the word data
-     * for the $word_id has been written to disk. It reads in only the
-     * pages from disk needed to retrieve this disk-based data.
-     *
-     * @param string $word_id id of the word one wants to look up
-     * @return array first offset, last offset, count
-     */
-    function getWordInfoDisk($word_id)
-    {
-        $this->getShardHeader();
-        $word_item_len = self::WORD_ITEM_LEN;
-        $prefix = (ord($word_id[0]) << 8) + ord($word_id[1]);
-        $prefix_info = $this->getShardSubstring(
-            self::HEADER_LENGTH + 8*$prefix, 8);
-        if($prefix_info == self::BLANK) {
-            return false;
-        }
-        $offset = unpackInt(substr($prefix_info, 0, 4));
-
-        $high = unpackInt(substr($prefix_info, 4, 4)) - 1;
-
-        $start = self::HEADER_LENGTH + $this->prefixes_len  + $offset;
-        $low = 0;
-        $check_loc = (($low + $high) >> 1);
-        do {
-            $old_check_loc = $check_loc;
-            $word_string = $this->getShardSubstring($start +
-                $check_loc * $word_item_len, $word_item_len);
-            if($word_string == false) {return false;}
-            $id = substr($word_string, 0, self::WORD_KEY_LEN);
-            $cmp = strcmp($word_id, $id);
-            if($cmp === 0) {
-                return $this->getWordInfoFromString(
-                    substr($word_string, self::WORD_KEY_LEN));
-            } else if ($cmp < 0) {
-                $high = $check_loc;
-                $check_loc = (($low + $check_loc) >> 1);
-            } else {
-                if($check_loc + 1 == $high) {
-                    $check_loc++;
-                }
-                $low = $check_loc;
-                $check_loc = (($high + $check_loc) >> 1);
-            }
-        } while($old_check_loc != $check_loc);
-
-        return false;
-    }
-
-    /**
-     * Returns the first offset, last offset, and number of documents the
-     * word occurred in for this shard. The first offset (similarly, the last
-     * offset) is the byte offset into the word_docs string of the first
-     * (last) record involving that word. This method assumes the word data
-     * is stored in the $this->words array.
-     *
-     * @param string $word_id id of the word one wants to look up
-     * @return array first offset, last offset, count
-     */
-    function getWordInfoLoaded($word_id)
-    {
-        if(!isset($this->words[$word_id])) {
-            return false;
-        }
-        if(!$this->word_docs_packed){
-            $this->packWordDocs();
-        }
-        return $this->getWordInfoFromString(
-            $this->words[$word_id]);
-    }
-
     /**
      * Converts $str into 3 ints for a first offset into word_docs,
      * a last offset into word_docs, and a count of number of docs
@@ -1278,8 +1446,8 @@ class IndexShard extends PersistentStructure implements CrawlConstants
     function getDocInfoSubstring($offset, $len)
     {
         if($this->read_only_from_disk) {
-            $base_offset = self::HEADER_LENGTH + $this->prefixes_len +
-                $this->words_len + $this->word_docs_len;
+            $base_offset = $this->file_len - $this->docids_len;
+
             return $this->getShardSubstring($base_offset + $offset, $len);
         }
         return substr($this->doc_infos, $offset, $len);
@@ -1350,8 +1518,7 @@ class IndexShard extends PersistentStructure implements CrawlConstants

     /**
      * If not already loaded, reads in from disk the fixed-length'd field
-     * variables of this IndexShard ($this->words_len,
-     * $this->word_docs_len, etc)
+     * variables of this IndexShard ($this->words_len, etc)
      */
     function getShardHeader()
     {
@@ -1402,6 +1569,7 @@ class IndexShard extends PersistentStructure implements CrawlConstants
         unset($words);
         array_walk($pre_words_array, 'IndexShard::makeWords', $shard);
         $shard->word_docs_packed = true;
+        $shard->unpackWordDocs();
         return $shard;
     }

diff --git a/lib/persistent_structure.php b/lib/persistent_structure.php
index a251225c0..0eaf62e72 100755
--- a/lib/persistent_structure.php
+++ b/lib/persistent_structure.php
@@ -61,7 +61,7 @@ class PersistentStructure
      *  @var int
      */
     var $unsaved_operations;
-    /** Number of operation between saves. If == -1 never save
+    /** Number of operation between saves. If == -1 never save using checkSave
      *  @var int
      */
     var $save_frequency;
diff --git a/lib/utility.php b/lib/utility.php
index b82d3135e..5140dee9c 100755
--- a/lib/utility.php
+++ b/lib/utility.php
@@ -40,14 +40,18 @@ if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
  *
  * @param string $source  string to copy from
  * @param string &$destination string to copy to
- * @param $start starting offset
- * @param $length number of bytes to copy
+ * @param int $start starting offset
+ * @param int $length number of bytes to copy
  */
 function charCopy($source, &$destination, $start, $length)
 {
-    $end = $start + $length;
-    for($j = $start, $k = 0; $j < $end; $j++, $k++) {
-        $destination[$j] = $source[$k];
+    $endk = $length - 1;
+    $end = $start + $endk;
+    for($j = $end, $k = $endk; $j >= $start; $j--, $k--) {
+        $destination[$j] = "" . $source[$k];
+        /* for some reason, the "" makes this faster if source and destination
+           are the same in PHP
+         */
     }
 }

@@ -231,6 +235,7 @@ function decodeModified9($input_string, &$offset)
     $continue_threshold = 128;
     $first_time = true;
     $decode_list = array();
+    if(($len = strlen($input_string) ) < 4) return array();
     do {
         $int_string = substr($input_string, $offset, 4);
         $ord_first = ord($int_string[0]);
@@ -245,6 +250,7 @@ function decodeModified9($input_string, &$offset)
         $decode_list = array_merge($decode_list,
             unpackListModified9($int_string));
         $offset += 4;
+        $len -= 4;
     } while($flag_bits >= $continue_threshold);

    return $decode_list;
@@ -267,6 +273,7 @@ function unpackListModified9($int_string)
     $mask = (2 << ($num_bits - 1)) - 1;
     $num_elts = $MOD9_NUM_ELTS_DECODES[$code];
     $int_string[0] = chr($first_char - $code);
+
     $encoded_list = unpackInt($int_string);
     $decoded_list = array();
     for($i = 0; $i < $num_elts; $i++) {
diff --git a/locale/ar/configure.ini b/locale/ar/configure.ini
index f627283b1..f28541ef4 100755
--- a/locale/ar/configure.ini
+++ b/locale/ar/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/de/configure.ini b/locale/de/configure.ini
index cb833b3a8..4b7e662d3 100755
--- a/locale/de/configure.ini
+++ b/locale/de/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/en-US/configure.ini b/locale/en-US/configure.ini
index c9bf944b1..9eff87487 100755
--- a/locale/en-US/configure.ini
+++ b/locale/en-US/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = "Currently Processing"
 crawlstatus_view_description = "Description:"
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = "Closing Crawl Dictionary..."
+crawlstatus_view_starting_crawl = "Starting New Crawl..."
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = "Closing Crawl Dictionary..."
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = "Running Post Processing Plugins..."
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = "Stop Crawl"
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = "No active crawl"
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = "Time started:"
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = "No start time found"
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = "Server Peak Memory:"
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = "No Memory Data Yet"
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = "Fetcher Peak Memory:"
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = "No Memory Data Yet"
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = "Web App Peak Memory:"
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = "No Memory Data Yet"
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = "Visited Urls Count:"
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = "Total Urls Seen:"
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = "Most Recent Fetcher:"
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = "No Fetcher Queries Yet"
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = "Most Recent Urls"
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = "No Recent Urls"
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = "Previous Crawls"
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = "Description:"
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = "Timestamp:"
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = "Visited/Extracted Urls:"
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = "Actions"
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = "Resume"
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = "Set as Index"
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = "Search Index"
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = "Delete"
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = "No Previous Crawls"
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/en-US/statistics.txt b/locale/en-US/statistics.txt
index 5a165df53..b6bef56f0 100755
--- a/locale/en-US/statistics.txt
+++ b/locale/en-US/statistics.txt
@@ -1 +1 @@
-d:100;
\ No newline at end of file
+d:99;
\ No newline at end of file
diff --git a/locale/es/configure.ini b/locale/es/configure.ini
index 738552a1b..54ee0f7d1 100755
--- a/locale/es/configure.ini
+++ b/locale/es/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/fr-FR/configure.ini b/locale/fr-FR/configure.ini
index 5722c7896..3942ca595 100755
--- a/locale/fr-FR/configure.ini
+++ b/locale/fr-FR/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/he/configure.ini b/locale/he/configure.ini
index e0bb2a0a8..27e015898 100755
--- a/locale/he/configure.ini
+++ b/locale/he/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/in-ID/configure.ini b/locale/in-ID/configure.ini
index 0b2c5fb22..61d0f8959 100755
--- a/locale/in-ID/configure.ini
+++ b/locale/in-ID/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/it/configure.ini b/locale/it/configure.ini
index cdebcda67..21e6ff48b 100755
--- a/locale/it/configure.ini
+++ b/locale/it/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/ja/configure.ini b/locale/ja/configure.ini
index af8108b89..28c372a11 100755
--- a/locale/ja/configure.ini
+++ b/locale/ja/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = "現在処理しています"
 crawlstatus_view_description = "説明"
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = "検索の停止"
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = "検索は続いていません。"
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = "始まった時の時間"
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = "検索始まった時間は見つけない"
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = "全部URL"
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = "最新フェッチャ"
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = "フェッチャキュエリはまだありません"
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = "最新URL"
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = "最近URLはありません"
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = "さっきの検索"
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = "説明"
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = "アクション"
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = "再会"
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = "指数の設定する。"
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = "削除"
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = "さっきの検索はありません"
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/ja/statistics.txt b/locale/ja/statistics.txt
index 64a2557d0..f724165fc 100755
--- a/locale/ja/statistics.txt
+++ b/locale/ja/statistics.txt
@@ -1 +1 @@
-d:68;
\ No newline at end of file
+d:67;
\ No newline at end of file
diff --git a/locale/ko/configure.ini b/locale/ko/configure.ini
index 68c3eac6a..c6c3a3ff3 100755
--- a/locale/ko/configure.ini
+++ b/locale/ko/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = "현재 실행중"
 crawlstatus_view_description = "설명:"
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = "크롤을 중지합니다.  잠시만 기다려 주십시요."
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = "활동하는 크롤이 존재하지 않습니다."
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = "시작한 시간:"
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = "시작 시간이 존재하지 않습니다."
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = "방문한 주소들 합계:"
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = "지금까지 본 총 합계 주소들:"
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = "현재까지 본 주소들 합계: "
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = "아직 호출 퀘리가 없습니다."
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = "가장 최근 주소들"
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = "최근 주소들이 없습니다."
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = "예전 크롤들 "
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = "설명:"
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = "타임 스탬프:"
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = "방문한 또는 추출한 주소들"
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = "활동들:"
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = "재개"
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = "인덱스로 정하기"
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = "삭제"
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = "전 크롤들이 없습니다."
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/pl/configure.ini b/locale/pl/configure.ini
index 59131a484..77b8e2a2f 100755
--- a/locale/pl/configure.ini
+++ b/locale/pl/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/pt/configure.ini b/locale/pt/configure.ini
index 834c9bf49..1086c2a24 100755
--- a/locale/pt/configure.ini
+++ b/locale/pt/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/ru/configure.ini b/locale/ru/configure.ini
index b1bce8a61..1342bb326 100755
--- a/locale/ru/configure.ini
+++ b/locale/ru/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/th/configure.ini b/locale/th/configure.ini
index b1eb9766a..abac16eef 100755
--- a/locale/th/configure.ini
+++ b/locale/th/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/vi-VN/configure.ini b/locale/vi-VN/configure.ini
index 4e17b3d76..547256e4b 100755
--- a/locale/vi-VN/configure.ini
+++ b/locale/vi-VN/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = "Hiện tại đang tiến h&agrave;nh"
 crawlstatus_view_description = "M&ocirc; tả:"
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = "Thời gian bắt đầu:"
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = "Kh&ocirc;ng t&igrave;m thấy thời gian bắt đầu"
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = "M&ocirc; tả:"
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = "Những h&agrave;nh động:"
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = "Bắt đầu trở lại"
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = "C&agrave;i l&agrave;m mục lục"
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = "Xo&aacute;"
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/locale/vi-VN/statistics.txt b/locale/vi-VN/statistics.txt
index 2bc958784..bc2959445 100755
--- a/locale/vi-VN/statistics.txt
+++ b/locale/vi-VN/statistics.txt
@@ -1 +1 @@
-d:50;
\ No newline at end of file
+d:49;
\ No newline at end of file
diff --git a/locale/zh-CN/configure.ini b/locale/zh-CN/configure.ini
index c88229187..9fa2ff074 100755
--- a/locale/zh-CN/configure.ini
+++ b/locale/zh-CN/configure.ini
@@ -322,87 +322,90 @@ crawlstatus_view_currently_processing = ""
 crawlstatus_view_description = ""
 ;
 ; crawlstatus_view.php line: 66
-crawlstatus_view_closing_dict = ""
+crawlstatus_view_starting_crawl = ""
 ;
 ; crawlstatus_view.php line: 69
+crawlstatus_view_closing_dict = ""
+;
+; crawlstatus_view.php line: 72
 crawlstatus_view_run_plugins = ""
 ;
-; crawlstatus_view.php line: 77
+; crawlstatus_view.php line: 80
 managecrawls_element_stop_crawl = ""
 ;
-; crawlstatus_view.php line: 82
+; crawlstatus_view.php line: 85
 crawlstatus_view_no_description = ""
 ;
-; crawlstatus_view.php line: 85
+; crawlstatus_view.php line: 88
 crawlstatus_view_time_started = ""
 ;
-; crawlstatus_view.php line: 88
+; crawlstatus_view.php line: 91
 crawlstatus_view_no_crawl_time = ""
 ;
-; crawlstatus_view.php line: 89
+; crawlstatus_view.php line: 92
 crawlstatus_view_queue_memory = ""
 ;
-; crawlstatus_view.php line: 94
+; crawlstatus_view.php line: 97
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 97
+; crawlstatus_view.php line: 100
 crawlstatus_view_fetcher_memory = ""
 ;
-; crawlstatus_view.php line: 102
+; crawlstatus_view.php line: 105
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 105
+; crawlstatus_view.php line: 108
 crawlstatus_view_webapp_memory = ""
 ;
-; crawlstatus_view.php line: 110
+; crawlstatus_view.php line: 113
 crawlstatus_view_no_mem_data = ""
 ;
-; crawlstatus_view.php line: 113
+; crawlstatus_view.php line: 116
 crawlstatus_view_visited_urls = ""
 ;
-; crawlstatus_view.php line: 117
+; crawlstatus_view.php line: 120
 crawlstatus_view_total_urls = ""
 ;
-; crawlstatus_view.php line: 120
+; crawlstatus_view.php line: 123
 crawlstatus_view_most_recent_fetcher = ""
 ;
-; crawlstatus_view.php line: 126
+; crawlstatus_view.php line: 129
 crawlstatus_view_no_fetcher = ""
 ;
-; crawlstatus_view.php line: 130
+; crawlstatus_view.php line: 133
 crawlstatus_view_most_recent_urls = ""
 ;
-; crawlstatus_view.php line: 138
+; crawlstatus_view.php line: 141
 crawlstatus_view_no_recent_urls = ""
 ;
-; crawlstatus_view.php line: 142
+; crawlstatus_view.php line: 145
 crawlstatus_view_previous_crawls = ""
 ;
-; crawlstatus_view.php line: 148
+; crawlstatus_view.php line: 151
 crawlstatus_view_description = ""
 ;
-; crawlstatus_view.php line: 149
+; crawlstatus_view.php line: 152
 crawlstatus_view_timestamp = ""
 ;
-; crawlstatus_view.php line: 150
+; crawlstatus_view.php line: 153
 crawlstatus_view_url_counts = ""
 ;
-; crawlstatus_view.php line: 151
+; crawlstatus_view.php line: 154
 crawlstatus_view_actions = ""
 ;
-; crawlstatus_view.php line: 164
+; crawlstatus_view.php line: 167
 crawlstatus_view_resume = ""
 ;
-; crawlstatus_view.php line: 170
+; crawlstatus_view.php line: 173
 crawlstatus_view_set_index = ""
 ;
-; crawlstatus_view.php line: 173
+; crawlstatus_view.php line: 176
 crawlstatus_view_search_index = ""
 ;
-; crawlstatus_view.php line: 180
+; crawlstatus_view.php line: 183
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 187
+; crawlstatus_view.php line: 190
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
diff --git a/tests/index_shard_test.php b/tests/index_shard_test.php
index f26c4c47d..ce2553c92 100644
--- a/tests/index_shard_test.php
+++ b/tests/index_shard_test.php
@@ -125,8 +125,10 @@ class IndexShardTest extends UnitTest
         $meta_ids = array(
             "YYYYYYYY"
         );
+
         $this->test_objects['shard']->addDocumentWords($docid,
             $offset, $word_counts, $meta_ids, true);
+
         $c_data = $this->test_objects['shard']->getPostingsSliceById(
             crawlHash('CCCCCCCC', true), 5);

@@ -374,14 +376,7 @@ class IndexShardTest extends UnitTest
             $this->assertEqual($c_data['CCCCCCCCFFFFFFFF']
                 [CrawlConstants::SUMMARY_OFFSET],
                 0,  "Summary offset matches predicted second word");
-        $out_string = $this->test_objects['shard']->save(true);

-        $this->test_objects['shard2'] = IndexShard::load("shard.txt",
-            $out_string);
-        $this->test_objects['shard']->prefixes = NULL;
-        $this->test_objects['shard']->unpackWordDocs();
-        $this->test_objects['shard']->packWordDocs(null, true);
-        $this->test_objects['shard']->prefixes = NULL;
     }

     /**
@@ -389,6 +384,7 @@ class IndexShardTest extends UnitTest
      */
     public function saveLoadTestCase()
     {
+
         $docid = "AAAAAAAABBBBBBBBCCCCCCCC";
         $offset = 5;
         $word_counts = array(
@@ -433,11 +429,11 @@ class IndexShardTest extends UnitTest
         $this->assertTrue(isset($c_data["AAAAAAAABBBBBBBBCCCCCCCC"]),
             "Doc lookup 2 by word works");
         // test saving and loading from a string
+
         $out_string = $this->test_objects['shard']->save(true);

         $this->test_objects['shard2'] = IndexShard::load("shard.txt",
             $out_string);
-
         $c_data = $this->test_objects['shard2']->getPostingsSliceById(
             crawlHash('BBBBBBBB', true), 5);
         $this->assertTrue(isset($c_data["AAAAAAAABBBBBBBBCCCCCCCC"]),
diff --git a/views/crawlstatus_view.php b/views/crawlstatus_view.php
index b71c26133..d0113df43 100755
--- a/views/crawlstatus_view.php
+++ b/views/crawlstatus_view.php
@@ -63,6 +63,14 @@ class CrawlstatusView extends View
         if(isset($data['DESCRIPTION'])) {
             switch($data['DESCRIPTION'])
             {
+                case 'BEGIN_CRAWL':
+                    e(tl('crawlstatus_view_starting_crawl'));?>&nbsp;&nbsp;
+                <button class="buttonbox" type="button"
+                    onclick="javascript:document.location = '<?php
+                    e($base_url); ?>stop'" ><?php
+                    e(tl('managecrawls_element_stop_crawl'))?></button>
+                <?php
+                break;
                 case 'SHUTDOWN_DICTIONARY':
                     e(tl('crawlstatus_view_closing_dict'));
                 break;
ViewGit