Merge branch 'master' of https://seekquarry.com/git/yioop into distributed-archive-crawl

Shawn Tice [2012-05-08 06:May:th]
Merge branch 'master' of https://seekquarry.com/git/yioop into distributed-archive-crawl

Conflicts:
	controllers/admin_controller.php
Filename
README
bin/fetcher.php
bin/queue_server.php
configs/bigram_builder.php
configs/config.php
configs/createdb.php
configs/token_tool.php
controllers/admin_controller.php
controllers/resource_controller.php
controllers/search_controller.php
controllers/static_controller.php
controllers/statistics_controller.php
css/search.css
data/default.db
error.php
lib/bigrams.php
lib/crawl_daemon.php
lib/fetch_url.php
lib/index_bundle_iterators/group_iterator.php
lib/index_bundle_iterators/phrase_filter_iterator.php
lib/index_bundle_iterators/word_iterator.php
lib/index_dictionary.php
lib/nword_grams.php
lib/phrase_parser.php
lib/processors/epub_processor.php
lib/processors/robot_processor.php
lib/processors/sitemap_processor.php
lib/processors/text_processor.php
lib/trie.php
lib/upgrade_functions.php
lib/url_parser.php
lib/utility.php
lib/web_archive_bundle.php
lib/web_queue_bundle.php
locale/ar/configure.ini
locale/ar/resources/tokenizer.php
locale/de/configure.ini
locale/de/resources/suggest_trie.txt.gz
locale/de/resources/tokenizer.php
locale/en-US/configure.ini
locale/en-US/pages/409.thtml
locale/en-US/pages/bot.thtml
locale/en-US/resources/all_word_grams.ftr
locale/en-US/resources/suggest_trie.txt.gz
lib/stemmers/en_stemmer.php
locale/en-US/statistics.txt
locale/es/configure.ini
locale/es/resources/suggest_trie.txt.gz
locale/es/resources/tokenizer.php
locale/fr-FR/configure.ini
locale/fr-FR/resources/suggest_trie.txt.gz
locale/fr-FR/resources/tokenizer.php
locale/he/configure.ini
locale/he/resources/tokenizer.php
locale/he/statistics.txt
locale/hi/configure.ini
locale/hi/resources/tokenizer.php
locale/hi/statistics.txt
locale/in-ID/configure.ini
locale/in-ID/resources/tokenizer.php
locale/in-ID/statistics.txt
locale/it/configure.ini
locale/it/resources/suggest_trie.txt.gz
locale/it/resources/tokenizer.php
locale/ja/configure.ini
locale/ja/resources/tokenizer.php
locale/ja/statistics.txt
locale/kn/configure.ini
locale/kn/resources/tokenizer.php
locale/kn/statistics.txt
locale/ko/configure.ini
locale/ko/resources/tokenizer.php
locale/ko/statistics.txt
locale/pl/configure.ini
locale/pl/resources/suggest_trie.txt.gz
locale/pl/resources/tokenizer.php
locale/pt/configure.ini
locale/pt/resources/suggest_trie.txt.gz
locale/pt/resources/tokenizer.php
locale/ru/configure.ini
locale/ru/resources/tokenizer.php
locale/th/configure.ini
locale/th/resources/tokenizer.php
locale/tr/configure.ini
locale/tr/bot.thtml
locale/tr/resources/tokenizer.php
locale/vi-VN/configure.ini
locale/vi-VN/resources/suggest_trie.txt.gz
locale/vi-VN/resources/tokenizer.php
locale/vi-VN/statistics.txt
locale/zh-CN/configure.ini
locale/zh-CN/resources/tokenizer.php
locale/zh-CN/statistics.txt
models/crawl_model.php
models/locale_model.php
models/model.php
models/phrase_model.php
models/profile_model.php
models/searchfilters_model.php
scripts/autosuggest.js
scripts/basic.js
tests/phrase_parser_test.php
tests/trie_test.php
tests/url_parser_test.php
views/admin_view.php
views/crawlstatus_view.php
views/elements/configure_element.php
views/elements/resultseditor_element.php
views/elements/searchfilters_element.php
views/layouts/web_layout.php
views/search_view.php
views/static_view.php
views/view.php
diff --git a/README b/README
index 276196168..684c89f55 100755
--- a/README
+++ b/README
@@ -23,23 +23,17 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.

 Summary
 -------
-The Yioop search engine consists of five main
+The Yioop search engine consists of three main
 scripts:

-fetcher.php - used to download batches of urls provided
+bin/fetcher.php - used to download batches of urls provided
     the queue_server.
-queue_server.php - maintains a queue of urls that are
+bin/queue_server.php - maintains a queue of urls that are
     going to be scheduled to be seen. It also keeps
     track of what has been seen and robots.txt info.
     Its last responsibility is to create the index_archive
     that is used by the search front end.

-arc_tool.php - an auxiliary script used to view the contents
-    of a web or index archive from the command line
-
-query_tool.php - an auxiliary script used to query an index
-    from the command line
-
 index.php -- a search engine web page. It is also used
     to handle message passing between the fetchers
     (multiple machines can act as fetchers) and the
@@ -61,8 +55,8 @@ Credits
 The source code is mainly due to Chris Pollett.
 Other contributors include: Ravi Dhillon, Priya Gangaraju,
 Nakul Natu, Vijaya Pamidi, Vijeth Patil, Tarun
-Pepira, and Shawn Tice. Several people helped with localization:
-My wife, Mary Pollett, Jonathan Ben-David,
+Pepira, Shawn Tice, Sandhya Vissapragada. Several people helped with
+localization: My wife, Mary Pollett, Jonathan Ben-David,
 Sujata Dongre, Animesh Dutta, Youn Kim, Akshat Kukreti,
 Chao-Hsin Shih and Sugi Widjaja.

diff --git a/bin/fetcher.php b/bin/fetcher.php
index f6e27e4a9..4e16fc9c1 100755
--- a/bin/fetcher.php
+++ b/bin/fetcher.php
@@ -42,7 +42,7 @@ define("BASE_DIR", substr(
     dirname(realpath($_SERVER['PHP_SELF'])), 0,
     -strlen("/bin")));

-ini_set("memory_limit","850M"); //so have enough memory to crawl big pages
+ini_set("memory_limit","850M"); //so have enough memory to crawl sitemaps

 /** Load in global configuration settings */
 require_once BASE_DIR.'/configs/config.php';
@@ -1035,7 +1035,7 @@ class Fetcher implements CrawlConstants
     function processFetchPages($site_pages)
     {
         $PAGE_PROCESSORS = $this->page_processors;
-        crawlLog("  Start process pages...");
+        crawlLog("  Start process pages... Current Memory:".memory_get_usage());
         $start_time = microtime();

         $prefix = $this->fetcher_num."-";
@@ -1258,7 +1258,8 @@ class Fetcher implements CrawlConstants
                     $cache_page_partition;
             }
         }
-        crawlLog("  Process pages time".(changeInMicrotime($start_time)));
+        crawlLog("  Process pages time".(changeInMicrotime($start_time)).
+             " Current Memory:".memory_get_usage());

         return $summarized_site_pages;
     }
@@ -1624,12 +1625,10 @@ class Fetcher implements CrawlConstants
             $bytes_to_send += strlen($post_data['schedule_data']);
         }
         unset($schedule_data);
-
         //handle mini inverted index
         if($seen_cnt > 0 ) {
             $this->buildMiniInvertedIndex();
         }
-        crawlLog("...");
         if(isset($this->found_sites[self::INVERTED_INDEX][
             $this->current_server])) {
             $compress_urls = "";
@@ -1641,13 +1640,16 @@ class Fetcher implements CrawlConstants
             unset($this->found_sites[self::SEEN_URLS]);
             $len_urls =  strlen($compress_urls);
             crawlLog("...Finish Compressing seen URLs.");
-            $post_data['index_data'] = webencode( packInt($len_urls).
-                $compress_urls. $this->found_sites[self::INVERTED_INDEX][
-                $this->current_server]
-                ); // don't compress index data
+            $out_string = packInt($len_urls). $compress_urls;
             unset($compress_urls);
+            $out_string .= $this->found_sites[self::INVERTED_INDEX][
+                $this->current_server];
             unset($this->found_sites[self::INVERTED_INDEX][
                 $this->current_server]);
+            gc_collect_cycles();
+            $post_data['index_data'] = webencode($out_string);
+                // don't compress index data
+            unset($out_string);
             $bytes_to_send += strlen($post_data['index_data']);
         }

@@ -1692,6 +1694,7 @@ class Fetcher implements CrawlConstants
                 memory_get_peak_usage());
         } while(!isset($info[self::STATUS]) ||
             $info[self::STATUS] != self::CONTINUE_STATE);
+        crawlLog("...  Current Memory G:".memory_get_usage());
         if($this->crawl_type == self::WEB_CRAWL) {
             $dir = CRAWL_DIR."/schedules";
             file_put_contents("$dir/$prefix".self::fetch_batch_name.
@@ -1720,7 +1723,8 @@ class Fetcher implements CrawlConstants
         global $IMAGE_TYPES;

         $start_time = microtime();
-
+        crawlLog("  Start building mini inverted index ...  Current Memory:".
+            memory_get_usage());
         $num_seen = count($this->found_sites[self::SEEN_URLS]);
         $this->num_seen_sites += $num_seen;
         /*
@@ -1728,9 +1732,10 @@ class Fetcher implements CrawlConstants
             name doesn't matter.
         */
         if(!isset($this->found_sites[self::INVERTED_INDEX][
-            $this->current_server]))
+            $this->current_server])) {
             $this->found_sites[self::INVERTED_INDEX][$this->current_server] =
                 new IndexShard("fetcher_shard_{$this->current_server}");
+        }
         for($i = 0; $i < $num_seen; $i++) {
             $site = $this->found_sites[self::SEEN_URLS][$i];
             if(!isset($site[self::HASH])) {continue; }
@@ -1756,17 +1761,24 @@ class Fetcher implements CrawlConstants
                 $host_words = UrlParser::getWordsIfHostUrl($site[self::URL]);
                 $path_words = UrlParser::getWordsLastPathPartUrl(
                     $site[self::URL]);
-                $phrase_string =
-                    mb_ereg_replace(PUNCT, " ", $host_words.
-                        $site[self::TITLE] . $path_words .
-                       " ". $site[self::DESCRIPTION]);
+                $phrase_string = $host_words." ".$site[self::TITLE] .
+                        " ". $path_words . " ". $site[self::DESCRIPTION];
                 if(isset($site[self::LANG])) {
                     $lang = $site[self::LANG];
                 }
-
+
                 $word_lists =
                     PhraseParser::extractPhrasesInLists($phrase_string,
-                        MAX_PHRASE_LEN, $lang, true);
+                        $lang, true);
+                $len = strlen($phrase_string);
+                if(PhraseParser::computeSafeSearchScore($word_lists, $len) <
+                    0.012) {
+                    $meta_ids[] = "safe:true";
+                    $safe = true;
+                } else {
+                    $meta_ids[] = "safe:false";
+                    $safe = false;
+                }
             }

             $link_phrase_string = "";
@@ -1826,14 +1838,15 @@ class Fetcher implements CrawlConstants
                     $link_type = UrlParser::getDocumentType($url);
                     if(in_array($link_type, $IMAGE_TYPES)) {
                         $link_meta_ids[] = "media:image";
+                        if(isset($safe) && !$safe) {
+                            $link_meta_ids[] = "safe:false";
+                        }
                     } else {
                         $link_meta_ids[] = "media:text";
                     }
-                    $link_text =
-                        mb_ereg_replace(PUNCT, " ", $link_text);
                     $link_word_lists =
                         PhraseParser::extractPhrasesInLists($link_text,
-                        MAX_PHRASE_LEN, $lang);
+                        $lang, true);
                     if(!isset($this->found_sites[self::INVERTED_INDEX][
                         $part_num])) {
                         $this->found_sites[self::INVERTED_INDEX][$part_num] =
@@ -1944,9 +1957,13 @@ class Fetcher implements CrawlConstants
         foreach($site[self::IP_ADDRESSES] as $address) {
             $meta_ids[] = 'ip:'.$address;
         }
-        $meta_ids[] = (stripos($site[self::TYPE], "image") !== false) ?
-            'media:image' : 'media:text';

+        if(UrlParser::isVideoUrl($site[self::URL])) {
+            $meta_ids[] = "media:video";
+        } else {
+            $meta_ids[] = (stripos($site[self::TYPE], "image") !== false) ?
+                'media:image' : 'media:text';
+        }
         // store the filetype info
         $url_type = UrlParser::getDocumentType($site[self::URL]);
         if(strlen($url_type) > 0) {
diff --git a/bin/queue_server.php b/bin/queue_server.php
index d15ee7908..d131f09ad 100755
--- a/bin/queue_server.php
+++ b/bin/queue_server.php
@@ -593,9 +593,10 @@ class QueueServer implements CrawlConstants, Join
     function &getDataArchiveFileData($file)
     {
         crawlLog("Processing File: $file");
-
-        $sites = unserialize(gzuncompress(webdecode(file_get_contents($file) ))
-            );
+        $decode = file_get_contents($file);
+        $decode = webdecode($decode);
+        $decode = gzuncompress($decode);
+        $sites = unserialize($decode);

         return $sites;
     }
@@ -1935,6 +1936,8 @@ class QueueServer implements CrawlConstants, Join
                     $robots_okay = $this->web_queue->checkRobotOkay($url);

                     if(!$robots_okay) {
+                        $delete_urls[$i] = $url;
+                        $this->web_queue->addSeenUrlFilter($url);
                         $i++;
                         continue;
                     }
@@ -2207,11 +2210,9 @@ class QueueServer implements CrawlConstants, Join
                 break;
             }

+            $flag = UrlParser::isPathMemberRegexPaths($url, array($site));
+            if($flag) break;

-            if(mb_strstr($url, $site)) {
-                $flag = true;
-                break;
-            }
         }
         if($return_rule && $flag) {
             $flag = $site;
diff --git a/configs/bigram_builder.php b/configs/bigram_builder.php
deleted file mode 100644
index c8241694e..000000000
--- a/configs/bigram_builder.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-/**
- *  SeekQuarry/Yioop --
- *  Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
- *
- *  LICENSE:
- *
- *  This program is free software: you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation, either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- *  END LICENSE
- *
- * Bigrams are pair of words which always occur together in the same
- * sequence in a user query, ex: "honda accord". Yioop! can treat these
- * pair of words as a single word to increase the speed and efficiency
- * of retrieval. This script can be used to create a bigrams filter
- * file for the Yioop! search engine to detect such words in documents
- * and queries. The input to this script is an xml file which contains
- * a large collection of such bigrams. One common source of a large
- * set of bigrams is an XML dump of Wikipedia. Wikipedia dumps are
- * available for download online free of cost. The bigrams filter file is
- * specific to a language, therefore, the user has to create a separate
- * filter file for each language that is to use this functionality. This
- * script can be run multiple times to create different filter files
- * by specifying a different input xml files and a different language
- * as command line arguments.. Xml dumps of Wikipedia for different
- * specific languages are available to download, and it is these language
- * specific dumps which serve as input to this script.
- *
- * To illustrate the use bigram_build.php, here are the steps to use it
- * in the case of wanting to create an English language bigram filter file.
- *
- * Step 1: Go to http://dumps.wikimedia.org/enwiki/ and obtain a
- * dump of the English Wikipedia. This page lists all the dumps according
- * to date they were taken. Choose any suitable date or the latest. A
- * link with a label such as 20120104/, represents a  dump taken on
- * 01/04/2012.  Click this link to go in turn to a
- * page which has many links based on type of content you are looking for.
- * We are interested in content titled
- * "Recombine all pages, current versions only". Beneath this we might find a
- * link with a name like:
- * "enwiki-20120104-pages-meta-current.xml.bz2"
- * This is a bz2 compressed xml file containing all the English pages of
- * Wikipedia. Download the file to the "search_filters" folder of your
- * yioop work directory associated with your profile.
- * (Note: You should have sufficient hard disk space in the order of
- *        100GB to store the compressed dump and script extracted xml.
- *        The script also accepts an uncompressed XML file as input.
- *        The filter file generated is a few megabytes.)
- *
- * Step 2: Run this script from the php command line as follows
- * php bigram_builder enwiki-20120104-pages-meta-current.xml.bz2 en
- *
- * This creates a bigram filter en_bigrams.ftr for English in the same
- * directory. Yioop! will automatically detect the filter file and use
- * it the next time you crawl as well as when anyone performs an English
- * language query.
- *
- *
- * @author Ravi Dhillon  ravi.dhillon@yahoo.com
- * @package seek_quarry
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
- * @copyright 2009 - 2012
- * @filesource
- */
-
-if(php_sapi_name() != 'cli') {echo "BAD REQUEST"; exit();}
-
-ini_set("memory_limit","1024M");
-
-if(count($argv) != 3){
-    echo "bigram_builder is used to create a bigram filter file for the \n".
-        "Yioop! search engine. This filter file is used to detect when two \n".
-        "words in a language should be treated as a unit. For example, \n".
-        "Bill Clinton. bigram_builder is run from the command line as:\n".
-        "php bigram.php wiki_xml lang\n".
-        "where wiki_xml is a wikipedia xml file or a bz2 compressed xml\n".
-        "file whose urls will be used to determine the bigrams and lang\n".
-        "is an IANA language tag.";
-    exit();
-}
-
-/**
- * Calculate base directory of script
- * @ignore
- */
-define("BASE_DIR", substr(
-    dirname(realpath($_SERVER['PHP_SELF'])), 0,
-    -strlen("/configs")));
-
-/** Load in global configuration settings */
-require_once BASE_DIR.'/configs/config.php';
-if(!PROFILE) {
-    echo "Please configure the search engine instance ".
-        "by visiting its web interface on localhost.\n";
-    exit();
-}
-
-/**
- * Load the Bigrams File
- */
-require_once BASE_DIR."/lib/bigrams.php";
-
-$wiki_file_path = WORK_DIRECTORY."/search_filters/";
-if (!file_exists($wiki_file_path.$argv[1])) {
-    echo $argv[1]." does not exist in $wiki_file_path";
-    exit();
-}
-
-/*
- *This call creates a bigrams text file from input xml file and
- *returns the count of bigrams in the text file.
- */
-$num_bigrams = Bigrams::generateBigramsTextFile($argv[1], $argv[2]);
-
-/*
- *This call creates a bloom filter file from bigrams text file based
- *on the language specified.The lang passed as parameter is prefixed
- *to the filter file name. The count of bigrams in text file is passed
- *as a parameter to set the limit of bigrams in the filter file.
- */
-Bigrams::createBigramFilterFile($argv[2], $num_bigrams);
-
-?>
diff --git a/configs/config.php b/configs/config.php
index 9cee65456..03ff9aaac 100755
--- a/configs/config.php
+++ b/configs/config.php
@@ -68,6 +68,7 @@ define('WORK_DIRECTORY', '');
 }

 define('APP_DIR', WORK_DIRECTORY."/app");
+define('PREP_DIR', WORK_DIRECTORY."/prepare");

 define('FALLBACK_LOCALE_DIR', BASE_DIR."/locale");

@@ -89,8 +90,8 @@ if(file_exists(WORK_DIRECTORY."/profile.php")) {
         define('NAME_SERVER', QUEUE_SERVER); //for backward compatibility
     }
 } else {
-    if($_SERVER['SERVER_NAME'] !== 'localhost' && !(defined(NO_LOCAL_CHECK)
-        && NO_LOCAL_CHECK)) {
+    if((!isset( $_SERVER['SERVER_NAME'])||$_SERVER['SERVER_NAME']!=='localhost')
+        && !defined("NO_LOCAL_CHECK")) {
         echo "SERVICE AVAILABLE ONLY VIA LOCALHOST UNTIL CONFIGURED";
         exit();
     }
@@ -120,6 +121,7 @@ if(file_exists(WORK_DIRECTORY."/profile.php")) {
     define('DEFAULT_LOCALE', "en-US");
     define('AUTH_KEY', 0);
     define('USE_MEMCACHE', false);
+    define('WORD_SUGGEST', true);
     define('CACHE_LINK', true);
     define('SIMILAR_LINK', true);
     define('IN_LINK', true);
@@ -380,7 +382,8 @@ $MOD9_NUM_ELTS_DECODES = array(


 /** Characters we view as not part of words, not same as POSIX [:punct:]*/
-define ('PUNCT', "\.|\,|\:|\;|\"|\'|\`|\[|\]|\{|\}|\(|\)|\!|\||\&");
+define ('PUNCT', "\.|\,|\:|\;|\"|\'|\[|\/|\%".
+    "\]|\{|\}|\(|\)|\!|\||\&|\`|\’|\‘|©|®|™|℠|… |- |\/ |\>|,|\=");

 /** Percentage ASCII text before guess we dealing with english*/
 define ('EN_RATIO', 0.9);
diff --git a/configs/createdb.php b/configs/createdb.php
index 4b4573e5b..0b8459e5c 100755
--- a/configs/createdb.php
+++ b/configs/createdb.php
@@ -75,7 +75,7 @@ if(!in_array(DBMS, array('sqlite', 'sqlite3'))) {
 $db->selectDB(DB_NAME);

 $db->execute("CREATE TABLE VERSION (ID INTEGER PRIMARY KEY)");
-$db->execute("INSERT INTO VERSION VALUES (5)");
+$db->execute("INSERT INTO VERSION VALUES (7)");

 $db->execute("CREATE TABLE USER (USER_ID INTEGER PRIMARY KEY $auto_increment, ".
     "USER_NAME VARCHAR(16) UNIQUE,  PASSWORD VARCHAR(16))");
@@ -144,7 +144,7 @@ $db->execute("INSERT INTO ACTIVITY VALUES (3, 3, 'manageRoles')");
 $db->execute("INSERT INTO ACTIVITY VALUES (4, 4, 'manageCrawls')");
 $db->execute("INSERT INTO ACTIVITY VALUES (5, 5, 'mixCrawls')");
 $db->execute("INSERT INTO ACTIVITY VALUES (6, 6, 'pageOptions')");
-$db->execute("INSERT INTO ACTIVITY VALUES (7, 7, 'searchFilters')");
+$db->execute("INSERT INTO ACTIVITY VALUES (7, 7, 'resultsEditor')");
 $db->execute("INSERT INTO ACTIVITY VALUES (8, 8, 'manageMachines')");
 $db->execute("INSERT INTO ACTIVITY VALUES (9, 9, 'manageLocales')");
 $db->execute("INSERT INTO ACTIVITY VALUES (10, 10, 'configure')");
@@ -155,7 +155,7 @@ $db->execute("INSERT INTO TRANSLATION VALUES (3, 'db_activity_manage_roles')");
 $db->execute("INSERT INTO TRANSLATION VALUES (4, 'db_activity_manage_crawl')");
 $db->execute("INSERT INTO TRANSLATION VALUES (5, 'db_activity_mix_crawls')");
 $db->execute("INSERT INTO TRANSLATION VALUES (6, 'db_activity_file_options')");
-$db->execute("INSERT INTO TRANSLATION VALUES (7,'db_activity_search_filters')");
+$db->execute("INSERT INTO TRANSLATION VALUES (7,'db_activity_results_editor')");
 $db->execute("INSERT INTO TRANSLATION VALUES(8,'db_activity_manage_machines')");
 $db->execute("INSERT INTO TRANSLATION VALUES (9,'db_activity_manage_locales')");
 $db->execute("INSERT INTO TRANSLATION VALUES (10, 'db_activity_configure')");
@@ -167,7 +167,7 @@ $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (3, 1, 'Manage Roles')");
 $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (4, 1, 'Manage Crawls')");
 $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (5, 1, 'Mix Crawls')");
 $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (6, 1, 'Page Options')");
-$db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (7, 1, 'Search Filters')");
+$db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (7, 1, 'Results Editor')");
 $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (8, 1, 'Manage Machines')");
 $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (9, 1, 'Manage Locales')");
 $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 1, 'Configure')");
@@ -185,7 +185,7 @@ $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (5, 5,
 $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (6, 5,
     'Options de fichier')");
 $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (7, 5,
-    'Les filtres de recherche')");
+    'Éditeur de résultats')");
 $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (8, 5,
     'Modifier les ordinateurs')");
 $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (9, 5,
diff --git a/configs/token_tool.php b/configs/token_tool.php
new file mode 100644
index 000000000..ea437485b
--- /dev/null
+++ b/configs/token_tool.php
@@ -0,0 +1,292 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * token_tool is used to create suggest word dictionaries and 'n' word gram
+ * filter files for the Yioop! search engine.
+ *
+ * A description of its usage is given in the $usage global variable
+ *
+ *
+ * @author Ravi Dhillon  ravi.dhillon@yahoo.com, Chris Pollett (modified for n
+ *      ngrams)
+ * @package seek_quarry
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2012
+ * @filesource
+ */
+
+if(php_sapi_name() != 'cli') {echo "BAD REQUEST"; exit();}
+
+ini_set("memory_limit","1024M");
+/**
+ * Calculate base directory of script
+ * @ignore
+ */
+define("BASE_DIR", substr(
+    dirname(realpath($_SERVER['PHP_SELF'])), 0,
+    -strlen("/configs")));
+
+/** Load in global configuration settings */
+require_once BASE_DIR.'/configs/config.php';
+
+/**
+ *  Contains makeNWordGramsTextFile and
+ *  and makeNWordGramsFilterFile used to create the bloom filter
+ */
+require_once BASE_DIR."/lib/nword_grams.php";
+
+/**
+ *  Contains Trie Class used to store suggest terms
+ */
+require_once BASE_DIR."/lib/trie.php";
+
+/**
+ * Used to print out a description of how to use token_tool.php
+ * @var string
+ */
+$usage = <<<EOD
+token_tool.php
+==============
+
+Usage
+=====
+token_tool is used to create suggest word dictionaries and 'n' word gram filter
+files for the Yioop! search engine. To create either of these items, the user
+puts a source file in Yioop's WORK_DIRECTORY/prepare folder. Suggest word
+dictionaries are used to supply the content of the dropdown of search terms
+that appears as a user is entering a query in Yioop. To make a suggest
+dictionary one can use a command like:
+
+php token_tool.php dictionary filename locale endmarker
+
+Here filename should be in the current folder or PREP_DIR and should consist
+of one word per line, locale is the locale this suggest (for example, en-US)
+file is being made for and where a file suggest-trie.txt.gz will be written,
+and endmarker is the end of word symbol to use in the trie. For example,
+$ works pretty well.
+
+token_tool.php can also be used to make filter files. A filter file is used to
+detect when words in a language should be treated as a unit when extracting text
+during a crawl. For example, Bill Clinton is 2 word gram which should be treated
+as unit because it is a particular person. ngram_builder is run from the command
+line as:
+
+php token_tool.php filter wiki_file lang locale n extract_type max_to_extract
+
+where wiki_file is a wikipedia xml file or a bz2  compressed xml file whose urls
+or wiki page count dump file which will be used to determine the n-grams, lang
+is an Wikipedia language tag,  locale is the IANA language tag of locale to
+store the results for (if different from lang, for example, en-US versus en for
+lang), n is the number of words in a row to consider, extract_type is where
+from Wikipedia source to extract:
+
+0 = title's,
+1 = redirect's,
+2 = page count dump wikipedia data,
+3 = page count dump wiktionary data.
+
+
+Obtaining Data
+==============
+Many word lists are obtainable on the web for free with Creative Commons
+licenses. A good starting point is:
+http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists
+A little script-fu can generally take such a list and put it into the
+format of one word/term per line which is needed by token_tool.php
+
+For filter file, Raw page count dumps can be found at
+http://dumps.wikimedia.org/other/pagecounts-raw/
+These probably give the best n-gram or all gram results, usually
+in a matter of minutes; nevertheless, this tool does support trying to extract
+similar data from Wikipedia dumps. This can take hours.
+
+For Wikipedia dumps, one can go to http://dumps.wikimedia.org/enwiki/
+and obtain a dump of the English Wikipedia (similar for other languages).
+This page lists all the dumps according to date they were taken. Choose any
+suitable date or the latest. A link with a label such as 20120104/, represents
+a  dump taken on  01/04/2012.  Click this link to go in turn to a page which has
+many links based on type of content you are looking for. For
+this tool you are interested in files under
+
+"Recombine all pages, current versions only".
+
+Beneath this we might find a link with a name like:
+enwiki-20120104-pages-meta-current.xml.bz2
+which is a file that could be processed by this tool.
+
+EOD;
+
+
+$num_args = count($argv);
+if( $num_args < 3 || $num_args > 8) {
+    echo $usage;
+    exit();
+}
+
+switch($argv[1])
+{
+    case "dictionary":
+        if(!isset($argv[3])) {
+            $argv[3] = "en-US";
+        }
+        if(!isset($argv[4])) {
+            $argv[4] = " ";
+        }
+        makeSuggestTrie($argv[2], $argv[3], $argv[4]);
+    break;
+
+    case "filter":
+        array_shift($argv);
+        array_shift($argv);
+        makeNWordGramsFiles($argv);
+    break;
+
+    default:
+        echo $usage;
+        exit();
+}
+
+
+
+if(!PROFILE) {
+    echo "Please configure the search engine instance ".
+        "by visiting its web interface on localhost.\n";
+    exit();
+}
+
+/**
+ * Makes an n or all word gram Bloom filter based on the supplied arguments
+ * Wikipedia files are assumed to have been place in the PREP_DIR before this
+ * is run and writes it into the resources folder of the given locale
+ *
+ * @param array $args command line arguments with first two elements of $argv
+ *      removed. For details on which arguments do what see the $usage variable
+ */
+function makeNWordGramsFiles($args)
+{
+    if(!isset($args[1])) {
+        $args[1] = "en";
+        $args[2] = "en-US";
+    }
+    if(!isset($args[2])) {
+        $args[2] = $args[1];
+    }
+    if(!isset($args[3])) {
+        $args[3] = 2; // bigrams
+    }
+    if(!isset($argv[4])) {
+        $args[4] = NWordGrams::PAGE_COUNT_WIKIPEDIA;
+    }
+    if(!isset($args[5]) && $args[3] == "all" &&
+        $args[2] == NWordGrams::PAGE_COUNT_WIKIPEDIA) {
+        $$args[5] = 400000;
+    } else {
+        $args[5] = -1;
+    }
+    $wiki_file_path = PREP_DIR."/";
+    if (!file_exists($wiki_file_path.$args[0])) {
+        echo $args[0]." does not exist in $wiki_file_path";
+        exit();
+    }
+    /*
+     *This call creates a ngrams text file from input xml file and
+     *returns the count of ngrams in the text file.
+     */
+    list($num_ngrams, $max_gram_len) =
+        NWordGrams::makeNWordGramsTextFile($args[0], $args[1], $args[2],
+        $args[3], $args[4], $args[5]);
+
+    /*
+     *This call creates a bloom filter file from n word grams text file based
+     *on the language specified.The lang passed as parameter is prefixed
+     *to the filter file name. The count of n word grams in text file is passed
+     *as a parameter to set the limit of n word grams in the filter file.
+     */
+    NWordGrams::makeNWordGramsFilterFile($argv[3], $argv[4], $num_ngrams,
+        $max_gram_len);
+}
+
+/**
+ * Makes a trie that can be used to make word suggestions as someone enters
+ * terms into the Yioop! search box. Outputs the result into the file
+ * suggest_trie.txt.gz in the supplied locale dir
+ *
+ * @param string $dict_file where the word list is stored, one word per line
+ * @param string $locale which locale to write the suggest file to
+ * @param string $end_marker used to indicate end of word in the trie
+ */
+function makeSuggestTrie($dict_file, $locale, $end_marker)
+{
+    $out_file = LOCALE_DIR."/$locale/resources/suggest_trie.txt.gz";
+
+    // Read and load dictionary and stop word files
+    $words = fileWithTrim($dict_file);
+    sort($words);
+    $trie = new Trie($end_marker);
+
+    /** Ignore the words in the following cases. If the word
+     *   - contains punctuation
+     *   - is less than 3 characters
+     *   - is a stop word
+     */
+    foreach($words as $word) {
+        if(mb_ereg_match("\p{P}", $word) == 0 && mb_strlen($word) > 2) {
+            $trie->add($word);
+        }
+    }
+    $output = array();
+    $output["trie_array"] = $trie->trie_array;
+    $output["end_marker"] = $trie->end_marker;
+    file_put_contents($out_file, gzencode(json_encode($output), 9));
+}
+
+/**
+ * Reads file into an array or outputs file not found. For each entry in
+ * array trims it. Any blank lines are deleted
+ *
+ * @param $file_name file to read into array
+ * @return array of trimmed lines
+ */
+function fileWithTrim($file_name)
+{
+    if(!file_exists($file_name)) {
+        $file_name = PREP_DIR."/$file_name";
+        if(!file_exists($file_name)) {
+            echo "$file_name Not Found\n\n";
+            return array();
+        }
+    }
+    $file_string = file_get_contents($file_name);
+    $pre_lines = mb_split("\n", $file_string);
+    $lines = array();
+    foreach($pre_lines as $pre_line) {
+        $line = preg_replace( "/(^\s+)|(\s+$)/us", "", $pre_line );
+        if ($line != "") {
+            array_push($lines, $line);
+        }
+    }
+    return $lines;
+}
+?>
diff --git a/controllers/admin_controller.php b/controllers/admin_controller.php
index 1ce712fcc..272fe35d0 100755
--- a/controllers/admin_controller.php
+++ b/controllers/admin_controller.php
@@ -73,9 +73,16 @@ class AdminController extends Controller implements CrawlConstants
      * @var array
      */
     var $activities = array("signin", "manageAccount", "manageUsers",
-        "manageRoles", "manageCrawls", "pageOptions", "searchFilters",
+        "manageRoles", "manageCrawls", "pageOptions", "resultsEditor",
         "manageMachines", "manageLocales", "crawlStatus", "mixCrawls",
         "machineStatus", "configure");
+    /**
+     * An array of activities which are periodically updated within other
+     * activities that they live. For example, within manage crawl,
+     * the current crawl status is updated every 20 or so seconds.
+     * @var array
+     */
+    var $status_activities = array("crawlStatus", "machineStatus");



@@ -136,6 +143,11 @@ class AdminController extends Controller implements CrawlConstants
         } else if($this->checkCSRFToken('YIOOP_TOKEN', "config")) {
             $data['SCRIPT'] = "doMessage('<h1 class=\"red\" >".
                 tl('admin_controller_login_to_config')."</h1>')";
+        } else if(isset($_REQUEST['a']) &&
+            in_array($_REQUEST['a'], $this->status_activities)) {
+            e("<p class='red'>".
+                tl('admin_controller_status_updates_stopped')."</p>");
+            exit();
         }
         $this->displayView($view, $data);
     }
@@ -216,8 +228,7 @@ class AdminController extends Controller implements CrawlConstants
             $data = $this->$activity();
             $data['ACTIVITIES'] = $allowed_activities;
         }
-        $status_activities = array("crawlStatus", "machineStatus");
-        if(!in_array($activity, $status_activities)) {
+        if(!in_array($activity, $this->status_activities)) {
             $data['CURRENT_ACTIVITY'] =
                 $this->activityModel->getActivityNameFromMethodName($activity);
         }
@@ -773,7 +784,8 @@ class AdminController extends Controller implements CrawlConstants
                         isset($seed_info['disallowed_sites']['url']) ?
                         $seed_info['disallowed_sites']['url'] : array();
                     $crawl_params[self::META_WORDS] =
-                        $seed_info['meta_words'];
+                        isset($seed_info['meta_words']) ?
+                        $seed_info['meta_words'] : array();
                     if(isset($seed_info['indexing_plugins']['plugins'])) {
                         $crawl_params[self::INDEXING_PLUGINS] =
                             $seed_info['indexing_plugins']['plugins'];
@@ -1463,9 +1475,9 @@ class AdminController extends Controller implements CrawlConstants
      * @return array $data info about the groups and their contents for a
      *      particular crawl mix
      */
-    function searchFilters()
+    function resultsEditor()
     {
-        $data["ELEMENT"] = "searchfiltersElement";
+        $data["ELEMENT"] = "resultseditorElement";
         $data['SCRIPT'] = "";

         if(isset($_REQUEST['disallowed_sites'])) {
@@ -1481,12 +1493,58 @@ class AdminController extends Controller implements CrawlConstants
             $data['disallowed_sites'] = implode("\n", $disallowed_sites);
             $this->searchfiltersModel->set($disallowed_sites);
             $data['SCRIPT'] .= "doMessage('<h1 class=\"red\" >".
-                tl('admin_controller_site_filter_update')."</h1>')";
+                tl('admin_controller_results_editor_update')."</h1>')";
         }
         if(!isset($data['disallowed_sites'])) {
             $data['disallowed_sites'] =
                 implode("\n", $this->searchfiltersModel->getUrls());
         }
+        foreach (array("URL", "TITLE", "DESCRIPTION") as $field) {
+            $data[$field] = (isset($_REQUEST[$field])) ?
+                $this->clean($_REQUEST[$field], "string") :
+                 ((isset($data[$field]) ) ? $data[$field] : "");
+        }
+        if($data["URL"] != "") {
+            $data["URL"] = UrlParser::canonicalLink($data["URL"],"");
+        }
+        $tmp = tl('admin_controller_edited_pages');
+        $data["URL_LIST"] = array ($tmp => $tmp);
+        $summaries = $this->searchfiltersModel->getEditedPageSummaries();
+        foreach($summaries as $hash => $summary) {
+            $data["URL_LIST"][$summary[self::URL]] = $summary[self::URL];
+        }
+        if(isset($_REQUEST['arg']) ) {
+            switch($_REQUEST['arg'])
+            {
+                case "save_page":
+                    $missing_page_field = ($data["URL"] == "") ? true: false;
+                    if($missing_page_field) {
+                        $data['SCRIPT'] .= "doMessage('<h1 class=\"red\" >".
+                            tl('admin_controller_results_editor_need_url').
+                            "</h1>')";
+                    } else {
+                        $this->searchfiltersModel->updateResultPage(
+                            $data["URL"], $data["TITLE"], $data["DESCRIPTION"]);
+                        $data['SCRIPT'] .= "doMessage('<h1 class=\"red\" >".
+                            tl('admin_controller_results_editor_page_updated').
+                            "</h1>')";
+                    }
+                break;
+                case "load_url":
+                    $hash_url = crawlHash($_REQUEST['LOAD_URL'], true);
+                    if(isset($summaries[$hash_url])) {
+                        $data["URL"] = $this->clean($_REQUEST['LOAD_URL'],
+                            "string");
+                        $data["TITLE"] = $summaries[$hash_url][self::TITLE];
+                        $data["DESCRIPTION"] = $summaries[$hash_url][
+                            self::DESCRIPTION];
+                        $data['SCRIPT'] .= "doMessage('<h1 class=\"red\" >".
+                            tl('admin_controller_results_editor_page_loaded').
+                            "</h1>')";
+                    }
+                break;
+            }
+        }

         return $data;
     }
@@ -1566,6 +1624,10 @@ class AdminController extends Controller implements CrawlConstants
         foreach($request_fields as $field => $type) {
             if(isset($_REQUEST[$field])) {
                 $r[$field] = $this->clean($_REQUEST[$field], $type);
+                if($field == "url" && $r[$field][strlen($r[$field])-1]
+                    != "/") {
+                    $r[$field] .= "/";
+                }
             } else {
                 $allset = false;
             }
@@ -1854,6 +1916,10 @@ class AdminController extends Controller implements CrawlConstants
                             $this->localeModel->getStaticPage(
                                 $_REQUEST['static_page'],
                                 $data['CURRENT_LOCALE_TAG']);
+                        /*since page data can contain tags we clean it
+                          htmlentities it just before displaying*/
+                        $data['PAGE_DATA'] = $this->clean($data['PAGE_DATA'],
+                            "string");
                         break;
                     }
                     $data['SCRIPT'] .= "selectPage = elt('static-pages');".
@@ -2166,8 +2232,8 @@ class AdminController extends Controller implements CrawlConstants
                         if(in_array($field, array(
                             'USE_FILECACHE', 'USE_MEMCACHE', 'IP_LINK',
                             'CACHE_LINK', 'SIMILAR_LINK', 'IN_LINK',
-                            'SIGNIN_LINK', "WEB_ACCESS", "RSS_ACCESS",
-                            "API_ACCESS"))) {
+                            'SIGNIN_LINK', "WEB_ACCESS", 'RSS_ACCESS',
+                            'API_ACCESS', 'WORD_SUGGEST'))) {
                             $profile[$field] = false;
                         }
                     }
@@ -2274,6 +2340,10 @@ class AdminController extends Controller implements CrawlConstants
                 strlen($data['ROBOT_DESCRIPTION']) == 0) {
                 $data['ROBOT_DESCRIPTION'] =
                     tl('admin_controller_describe_robot');
+            } else {
+                //since the description might contain tags we apply htmlentities
+                $data['ROBOT_DESCRIPTION'] =
+                    $this->clean($data['ROBOT_DESCRIPTION'], "string");
             }
             if(!isset($data['MEMCACHE_SERVERS']) ||
                 strlen($data['MEMCACHE_SERVERS']) == 0) {
diff --git a/controllers/resource_controller.php b/controllers/resource_controller.php
index b65b0c495..876cc4e51 100644
--- a/controllers/resource_controller.php
+++ b/controllers/resource_controller.php
@@ -63,7 +63,7 @@ class ResourceController extends Controller implements CrawlConstants
      * These are the activities supported by this controller
      * @var array
      */
-    var $activities = array("get", "syncList", "syncNotify");
+    var $activities = array("get", "syncList", "syncNotify", "suggest");


     /**
@@ -75,7 +75,8 @@ class ResourceController extends Controller implements CrawlConstants
     function processRequest()
     {
         if(!isset($_REQUEST['a']) ||
-            ($_REQUEST['a'] != "get" && !$this->checkRequest())) {return; }
+            (!in_array($_REQUEST['a'], array("get", "suggest"))
+            && !$this->checkRequest())) {return; }
         $activity = $_REQUEST['a'];

         if(in_array($activity, $this->activities)) {$this->$activity();}
@@ -90,7 +91,7 @@ class ResourceController extends Controller implements CrawlConstants
         if(!isset($_REQUEST['n']) || !isset($_REQUEST['f'])) return;
         $name = $this->clean($_REQUEST['n'], "string");
         if(in_array($_REQUEST['f'], array("css", "scripts", "resources"))) {
-            /* notice is this case we don't check if request come from a
+            /* notice in this case we don't check if request come from a
                legitimate source but we do try to restrict it to being
                a file (not a folder) in the above array
             */
@@ -130,6 +131,25 @@ class ResourceController extends Controller implements CrawlConstants
         }
     }

+    /**
+     * Used to get a keyword suggest trie. This sends additional
+     * header so will be decompressed on the fly
+     */
+    function suggest()
+    {
+        if(!isset($_REQUEST["locale"])){return;}
+        $locale = $_REQUEST["locale"];
+        $count = preg_match("/^[a-zA-z]{2}(-[a-zA-z]{2})?$/", $locale);
+        if($count != 1) {return;}
+        $path = LOCALE_DIR."/$locale/resources/suggest_trie.txt.gz";
+        if(file_exists($path)) {
+            header("Content-Type: application/json");
+            header("Content-Encoding: gzip");
+            header("Content-Length: ".filesize($path));
+            readfile($path);
+        }
+    }
+
     /**
      *  Used to notify a machine that another machine acting as a mirror
      *  is still alive. Data is stored in a txt file self::mirror_table_name
diff --git a/controllers/search_controller.php b/controllers/search_controller.php
index bf0ea0827..057fdad1d 100755
--- a/controllers/search_controller.php
+++ b/controllers/search_controller.php
@@ -105,10 +105,10 @@ class SearchController extends Controller implements CrawlConstants
         } else if (!WEB_ACCESS) {
             return;
         }
-        if(isset($_REQUEST['raw']) && $_REQUEST['raw'] == true) {
-            $raw = true;
+        if(isset($_REQUEST['raw']) && in_array($_REQUEST['raw'], array(0,1,2))){
+            $raw = $_REQUEST['raw'];
         } else {
-            $raw = false;
+            $raw = 0;
         }

         if(isset($_REQUEST['num'])) {
@@ -165,27 +165,35 @@ class SearchController extends Controller implements CrawlConstants
             $its = (isset($_REQUEST['its'])) ? $_REQUEST['its'] :
                 $_SESSION['its'];
             $index_time_stamp = $this->clean($its, "int");
-            //validate timestamp against list
-            //(some crawlers replay deleted crawls)
-            $crawls = $this->crawlModel->getCrawlList(false,true,$machine_urls,
-                true);
-            $found_crawl = false;
-            foreach($crawls as $crawl) {
-                if($index_time_stamp == $crawl['CRAWL_TIME']) {
-                    $found_crawl = true;
-                    break;
+            if($index_time_stamp != 0 ) {
+                //validate timestamp against list
+                //(some crawlers replay deleted crawls)
+                $crawls = $this->crawlModel->getCrawlList(false,true,
+                    $machine_urls,true);
+                $found_crawl = false;
+                foreach($crawls as $crawl) {
+                    if($index_time_stamp == $crawl['CRAWL_TIME']) {
+                        $found_crawl = true;
+                        break;
+                    }
                 }
-            }
-            if(!$found_crawl) {
-                unset($_SESSION['its']);
-                include(BASE_DIR."/error.php");
-                exit();
+                if(!$found_crawl && (isset($_REQUEST['q']) ||
+                    isset($_REQUEST['arg']))) {
+                    unset($_SESSION['its']);
+                    include(BASE_DIR."/error.php");
+                    exit();
+                } else if(!$found_crawl) {
+                    unset($_SESSION['its']);
+                    $index_time_stamp = $current_its;
+                }
+            } else {
+                $index_time_stamp = $current_its;
+                    //use the default crawl index
             }
         } else {
             $index_time_stamp = $current_its;
                 //use the default crawl index
         }
-
         if($web_flag && $index_time_stamp != 0 ) {
             $index_info =  $this->crawlModel->getInfoTimestamp(
                 $index_time_stamp, $machine_urls);
@@ -243,10 +251,16 @@ class SearchController extends Controller implements CrawlConstants
                 $data['INDEX_INFO'] = tl('search_controller_mix_info',
                     $index_info['DESCRIPTION']);
             } else {
-                $data['INDEX_INFO'] = tl('search_controller_crawl_info',
-                    $index_info['DESCRIPTION'],
-                    $index_info['VISITED_URLS_COUNT'],
-                    $index_info['COUNT']);
+                if(isset($index_info['DESCRIPTION']) &&
+                    isset($index_info['VISITED_URLS_COUNT']) &&
+                    isset($index_info['COUNT']) ) {
+                    $data['INDEX_INFO'] = tl('search_controller_crawl_info',
+                        $index_info['DESCRIPTION'],
+                        $index_info['VISITED_URLS_COUNT'],
+                        $index_info['COUNT']);
+                } else {
+                    $data['INDEX_INFO'] = "";
+                }
             }
         } else {
             $data['INDEX_INFO'] = "";
@@ -259,6 +273,7 @@ class SearchController extends Controller implements CrawlConstants

         $data['ELAPSED_TIME'] = changeInMicrotime($start_time);
         if ($view != "serial") {
+            $data['INCLUDE_SCRIPTS'] = array("autosuggest");
             $this->displayView($view, $data);
         } else {
             if(isset($data["PAGES"])) {
@@ -283,7 +298,8 @@ class SearchController extends Controller implements CrawlConstants
         $bots = array("googlebot", "baidu", "naver", "sogou");
         $query_okay = true;
         foreach($bots as $bot) {
-            if(stristr($_SERVER["HTTP_USER_AGENT"], $bot)) {
+            if(!isset($_SERVER["HTTP_USER_AGENT"]) ||
+                stristr($_SERVER["HTTP_USER_AGENT"], $bot)) {
                 $query_okay = false;
             }
         }
@@ -421,8 +437,11 @@ class SearchController extends Controller implements CrawlConstants
                 $top_phrases  =
                     $this->getTopPhrases($crawl_item, 3, $index_name);
                 $top_query = implode(" ", $top_phrases);
+                $filter = $this->searchfiltersModel->getFilter();
+                $this->phraseModel->editedPageSummaries =
+                    $this->searchfiltersModel->getEditedPageSummaries();
                 $phrase_results = $this->phraseModel->getPhrasePageResults(
-                    $top_query, $limit, $results_per_page, false, NULL,
+                    $top_query, $limit, $results_per_page, false, $filter,
                     $use_cache_if_possible, $raw, $queue_servers);
                 $data['PAGING_QUERY'] = "index.php?c=search&a=related&arg=".
                     urlencode($url);
@@ -459,6 +478,8 @@ class SearchController extends Controller implements CrawlConstants
                             $this->phraseModel->rewriteMixQuery($query, $mix);
                     }
                     $filter = $this->searchfiltersModel->getFilter();
+                    $this->phraseModel->editedPageSummaries =
+                        $this->searchfiltersModel->getEditedPageSummaries();
                     $phrase_results = $this->phraseModel->getPhrasePageResults(
                         $query, $limit, $results_per_page, true, $filter,
                         $use_cache_if_possible, $raw, $queue_servers);
@@ -506,8 +527,11 @@ class SearchController extends Controller implements CrawlConstants
         $phrase_string =
             PhraseParser::extractWordStringPageSummary($crawl_item);

+        $crawl_item[self::LANG] = (isset($crawl_item[self::LANG])) ?
+            $crawl_item[self::LANG] : DEFAULT_LOCALE;
+
         $page_word_counts =
-            PhraseParser::extractPhrasesAndCount($phrase_string, MAX_PHRASE_LEN,
+            PhraseParser::extractPhrasesAndCount($phrase_string,
                 $crawl_item[self::LANG]);
         $words = array_keys($page_word_counts);

@@ -516,7 +540,8 @@ class SearchController extends Controller implements CrawlConstants
         $word_ratios = array();
         foreach($page_word_counts as $word => $count) {
             $word_ratios[$word] =
-                (isset($word_counts[$word])) ? $count/$word_counts[$word] : 0;
+                (isset($word_counts[$word]) && $word_counts[$word] > 0) ?
+                $count/$word_counts[$word] : 0;
             /*discard cases where word only occurs in one doc as want
               to find related relevant documents */
             if($word_ratios[$word] == 1) $word_ratios[$word] = 0;
@@ -587,10 +612,9 @@ class SearchController extends Controller implements CrawlConstants
         if(!isset($node->childNodes->length)) {
             return $node;
         }
-        for($k = 0; $node->childNodes->length; $k++)
-        {
+        for($k = 0; $node->childNodes->length; $k++)  {
             if(!$node->childNodes->item($k)) { break; }
-
+
             $clone = $node->childNodes->item($k)->cloneNode(true);

             if($clone->nodeType == XML_TEXT_NODE) {
@@ -602,10 +626,10 @@ class SearchController extends Controller implements CrawlConstants
                         $mark_prefix = crawlHash($word);
                         if(stristr($mark_prefix, $word) !== false) {
                             $mark_prefix = preg_replace(
-                            "/$word/i", '', $mark_prefix);
+                            "/\b$word\b/i", '', $mark_prefix);
                         }
                         $text = preg_replace(
-                            "/$word/i", $mark_prefix.'$0', $text);
+                            "/\b$word\b/i", $mark_prefix.'$0', $text);
                     }
                 }

@@ -622,6 +646,43 @@ class SearchController extends Controller implements CrawlConstants
         return $node;
     }

+    function canonicalizeLinks($node, $url)
+    {
+        if(!isset($node->childNodes->length)) {
+            return $node;
+        }
+        for($k = 0; $node->childNodes->length; $k++) {
+            if(!$node->childNodes->item($k)) { break; }
+
+            $clone = $node->childNodes->item($k)->cloneNode(true);
+            $tag_name = (isset($clone->tagName) ) ? $clone->tagName : "-1";
+            if(in_array($tag_name, array("a", "link"))) {
+                if($clone->hasAttribute("href")) {
+                    $href = $clone->getAttribute("href");
+                    $href = UrlParser::canonicalLink($href, $url, false);
+                    $clone->setAttribute("href", $href);
+                    $node->replaceChild($clone, $node->childNodes->item($k));
+                }
+            } else if (in_array($tag_name, array("img", "object",
+                "script"))) {
+                if($clone->hasAttribute("src")) {
+                    $src = $clone->getAttribute("src");
+                    $src = UrlParser::canonicalLink($src, $url, false);
+                    $clone->setAttribute("src", $src);
+                    $node->replaceChild($clone, $node->childNodes->item($k));
+                }
+            } else {
+                if($tag_name != -1) {
+                    $clone = $this->canonicalizeLinks($clone, $url);
+                    if(is_object($clone)) {
+                        $node->replaceChild($clone, $node->childNodes->item($k));
+                    }
+                }
+            }
+        }
+        return $node;
+    }
+
     //*********BEGIN SEARCH API *********
     /**
      * Part of Yioop! Search API. Performs a normal search query and returns
@@ -730,7 +791,11 @@ class SearchController extends Controller implements CrawlConstants
             $this->displayView("nocache", $data);
             return;
         }
-
+        $check_fields = array(self::TITLE, self::DESCRIPTION, self::LINKS);
+        foreach($check_fields as $field) {
+            $crawl_item[$field] = (isset($crawl_item[$field])) ?
+                $crawl_item[$field] : "";
+        }
         $summary_string =
             tl('search_controller_extracted_title')."\n\n".
             wordwrap($crawl_item[self::TITLE], 80, "\n")."\n\n" .
@@ -791,10 +856,7 @@ class SearchController extends Controller implements CrawlConstants
         $cache_file = $cache_item[self::PAGE];
         if(!stristr($cache_item[self::TYPE], "image")) {

-            $meta_words = array('link\:', 'site\:', 'version\:', 'modified\:',
-                'filetype\:', 'info\:', '\-', 'os\:', 'server\:', 'date\:',
-                'lang\:', 'elink\:',
-                'index:', 'ip:', 'i:', 'weight:', 'w:', 'u:');
+            $meta_words = $this->phraseModel->meta_words_list;
             foreach($meta_words as $meta_word) {
                 $pattern = "/(\s)($meta_word(\S)+)/";
                 $terms = preg_replace($pattern, "", $terms);
@@ -829,7 +891,20 @@ class SearchController extends Controller implements CrawlConstants

         $xpath = new DOMXPath($dom);

-
+        $head = $dom->getElementsByTagName('head')->item(0);
+        if(is_object($head)) {
+            // add a noindex nofollow robot directive to page
+            $head_first_child = $head->firstChild;
+            $robotNode = $dom->createElement('meta');
+            $robotNode = $head->insertBefore($robotNode, $head_first_child);
+            $robotNode->setAttribute("name", "ROBOTS");
+            $robotNode->setAttribute("content", "NOINDEX,NOFOLLOW");
+            $comment = $dom->createComment(
+                tl('search_controller_cache_comment'));
+            $comment = $head->insertBefore($comment, $robotNode);
+            // make link and script links absolute
+            $head = $this->canonicalizeLinks($head, $url);
+        }
         $body =  $dom->getElementsByTagName('body')->item(0);
         if($body == false) {
             $body_tags = "<frameset><frame><noscript><img><span><b><i><em>".
@@ -842,7 +917,11 @@ class SearchController extends Controller implements CrawlConstants
             @$dom->loadHTML($cache_file);
             $body =  $dom->getElementsByTagName('body')->item(0);
         }
+        //make tags in body absolute
+        $body = $this->canonicalizeLinks($body, $url);
         $first_child = $body->firstChild;
+
+        // add information about what was extracted from page
         $summaryNode = $dom->createElement('pre');
         $summaryNode = $body->insertBefore($summaryNode, $first_child);
         $summaryNode->setAttributeNS("","style", "border-color: black; ".
diff --git a/controllers/static_controller.php b/controllers/static_controller.php
index dcf5d1fb5..1fd0d3160 100644
--- a/controllers/static_controller.php
+++ b/controllers/static_controller.php
@@ -90,6 +90,7 @@ class StaticController extends Controller
         $data['YIOOP_TOKEN'] = $this->generateCSRFToken($user);

         $this->displayView($view, $data);
+
     }


@@ -106,7 +107,7 @@ class StaticController extends Controller
             in_array($_REQUEST['p'], $this->staticView->pages)) {
             $data['page'] = $_REQUEST['p'];
         } else {
-            $data['page'] = "about";
+            $data['page'] = "blog";
         }
         if((isset($this->staticView->head_objects[$data['page']]['title']))) {
             $data["subtitle"]=" - ".
diff --git a/controllers/statistics_controller.php b/controllers/statistics_controller.php
index a0638286e..030ac794d 100644
--- a/controllers/statistics_controller.php
+++ b/controllers/statistics_controller.php
@@ -57,7 +57,7 @@ class StatisticsController extends Controller implements CrawlConstants
      * No models used by this controller
      * @var array
      */
-    var $models = array("crawl", "machine", "phrase");
+    var $models = array("crawl", "machine", "phrase", "user");
     /**
      * Only outputs JSON data so don't need view
      * @var array
@@ -87,6 +87,11 @@ class StatisticsController extends Controller implements CrawlConstants
      */
     const NUM_TIMES_INTERVAL = 50;

+    /**
+     * While computing the statistics page, number of seconds until a
+     * page refresh and save of progress so far occurs
+     */
+    const STATISTIC_REFRESH_RATE = 30;
     /**
      * Main handler for requests coming into this controller for web crawl
      * statistics. Checks for the presence of a statistics file, if not
@@ -100,14 +105,14 @@ class StatisticsController extends Controller implements CrawlConstants
         $view = "statistics";
         $data = array();
         if(isset($_SESSION['USER_ID'])) {
-            $user = $_SESSION['USER_ID'];
-            $token_okay = $this->checkCSRFToken('YIOOP_TOKEN', $user);
+            $user_id = $_SESSION['USER_ID'];
+            $token_okay = $this->checkCSRFToken('YIOOP_TOKEN', $user_id);
             if($token_okay === false) {
                 unset($_SESSION['USER_ID']);
                 $user = $_SERVER['REMOTE_ADDR'];
             }
         } else {
-            $user = $_SERVER['REMOTE_ADDR'];
+            $user_id = $_SERVER['REMOTE_ADDR'];
         }
         $this->machine_urls = $this->machineModel->getQueueServerUrls();
         if(isset($_REQUEST['its'])) {
@@ -145,10 +150,39 @@ class StatisticsController extends Controller implements CrawlConstants
         if($stats_file_exists) {
             $data = unserialize(file_get_contents($this->stats_file));
         }
-        if(!$stats_file_exists || isset($data["UNFINISHED"])) {
+        $computing = false;
+        if((!$stats_file_exists || isset($data["UNFINISHED"])) &&
+            $user_id != $_SERVER['REMOTE_ADDR']) {
+            //check if user allowed to make statistics
+            $activities = $this->userModel->getUserActivities($user_id);
+            $allowed_to_make_statistics = false;
+            foreach($activities as $activity) {
+                if($activity['METHOD_NAME'] == "manageCrawls") {
+                    $allowed_to_make_statistics = true;
+                    break;
+                }
+            }
+            // check that no one else is making statistics on the same index
+            if(isset($data["UNFINISHED"])) {
+                if(!isset($data['user_id']) ||$data['user_id'] != $user_id ||
+                    !isset($data['REMOTE_ADDR']) ||
+                    $data['REMOTE_ADDR'] != $_SERVER["REMOTE_ADDR"]) {
+                    $_REQUEST['p'] = "409";
+                    include(BASE_DIR."/error.php");
+                    exit(); //bail
+                }
+            }
+            $data['user_id'] = $user_id;
+            $data['REMOTE_ADDR'] = $_SERVER["REMOTE_ADDR"];
             $this->computeStatistics($data);
+            $computing = true;
+        }
+        if(!$stats_file_exists && !$computing) {
+            unset($_SESSION['its']);
+            include(BASE_DIR."/error.php");
+            exit(); //bail
         }
-        $data['YIOOP_TOKEN'] = $this->generateCSRFToken($user);
+        $data['YIOOP_TOKEN'] = $this->generateCSRFToken($user_id);
         $data["its"] = $this->index_time_stamp;
         $this->statisticsView->head_objects["robots"] = "NOINDEX, NOFOLLOW";
         $this->displayView($view, $data);
@@ -171,8 +205,11 @@ class StatisticsController extends Controller implements CrawlConstants
         global $INDEXED_FILE_TYPES;

         if(!isset($data["COUNT"])) {
-            $data =  $this->crawlModel->getInfoTimestamp(
+            $tmp =  $this->crawlModel->getInfoTimestamp(
                 $this->index_time_stamp, $this->machine_urls);
+            $tmp["user_id"] = $data["user_id"];
+            $tmp["REMOTE_ADDR"] = $data["REMOTE_ADDR"];
+            $data = $tmp;
             $data["stars"] = "*";
             if(!isset($data["COUNT"])) {
                 include(BASE_DIR."./error.php");
@@ -212,7 +249,7 @@ class StatisticsController extends Controller implements CrawlConstants
                 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug', 'uk', 'ur',
                 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi', 'yo', 'za',
                 'zh', 'zu'),
-            "MEDIA" => array("image", "text"),
+            "MEDIA" => array("image", "text", "video"),
             "OS" => array("asianux", "centos", "clearos", "debian", "fedora",
                 "freebsd", "gentoo", "linux", "netware", "solaris", "sunos",
                 "ubuntu", "unix"),
@@ -297,7 +334,7 @@ class StatisticsController extends Controller implements CrawlConstants
                     $data[$group_description]["DATA"][$query] = $count;
                     $total += $count;
                 }
-                if(time() - $time > 20) {
+                if(time() - $time > self::STATISTIC_REFRESH_RATE) {
                     $data["UNFINISHED"] = true;
                     break 2;
                 }
@@ -333,7 +370,7 @@ class StatisticsController extends Controller implements CrawlConstants
     {
         $results = $this->phraseModel->getPhrasePageResults(
             "$query i:{$this->index_time_stamp}", 0,
-            1, true, NULL, true, 0, $this->machine_urls);
+            1, true, NULL, false, 0, $this->machine_urls);
         return (isset($results["TOTAL_ROWS"])) ? $results["TOTAL_ROWS"] : -1;
     }

diff --git a/css/search.css b/css/search.css
index 69df34fc9..f94f2586d 100755
--- a/css/search.css
+++ b/css/search.css
@@ -169,28 +169,32 @@ body.html-tb-lr

 .landing .logo
 {
-    text-align:center;
+    text-align:center;
+    min-width: 8in;
 }

 .logo
 {
     margin:0;
-    min-width: 8in;
+
 }
+
 .logo img
 {
     border: 0;
+    width:2in;
 }

 .landing .logo img
 {
     border: 0;
+    width:3in;
 }

 .logo span
 {
     position:relative;
-    top: -.6in;
+    top: -.3in;
 }

 .html-ltr .login, .html-ltr .settings
@@ -231,30 +235,17 @@ body.html-tb-lr
     font-size:16pt;
 }

-
-
 .settings button, .settings select, .login button
 {
     font-size: 16pt;
 }

-
-.html-ltr .img .logo
-{
-    float:left;
-}
-
-.html-rtl .img .logo
-{
-    float:left;
-}
-
 .content
 {
     position:relative;
     margin-left: .5in;
     margin-right: .5in;
-    width:8;
+    width:8in;
     min-width: 10in;
     min-height:3in;
     padding: 8px;
@@ -265,14 +256,40 @@ body.html-tb-lr
 {
     padding-bottom: 8px;
 }
+
+.html-ltr .serp
+{
+    position:relative;
+    top: -0.9in;
+    left:2.2in;
+}
+.html-ltr .serp-results
+{
+    position:relative;
+    top: -0.9in;
+    left:1in;
+}
+.html-rtl .serp
+{
+    position:relative;
+    top: -1.15in;
+    right:2.2in;
+}
+.html-rtl .serp-results
+{
+    position:relative;
+    top: -1in;
+    right:1in;
+}
 .searchbox
 {
     width:8in;
-    padding: .1in;
-    background-color: #ddddff;
-    border-width: 2px;
-    border-style: dashed;
-
+    padding: 0.1in;
+    background-color: #DDF;
+    border-width: 0.05in;
+    border-color: #AAA;
+    border-style: solid;
+    border-radius: 0.07in;
 }

 .searchbox p
@@ -280,17 +297,64 @@ body.html-tb-lr
     font-size:16pt;
 }

-.searchbox input
+.searchbox input, .autoresult, .dropdown
 {
     width: 6.5in;
     font-size:16pt;
     margin-right:0;
     margin-left:0;
-    border: 0;
+    border:0;
     padding-top: 0;
-    padding-bottom:3pt;
+    padding-bottom:0.05in;
     padding-right:0;
     padding-left:0;
+    margin:0;
+}
+
+
+#aslist li
+{
+    position:relative;
+    top:-0.015in;
+    background:#DDF;
+    width: 6.6in;
+    font-size:16pt;
+    margin-right:0in;
+    margin-left:0in;
+    padding-top:0;
+    padding-right:0;
+    padding-left:0.1in;
+    cursor:pointer;
+    list-style:none;
+    border-color: #AAA;
+    border-width: 0.05in;
+    border-top-style:none;
+    border-right-style:solid;
+    border-bottom-style:none;
+    border-left-style:solid;
+}
+
+#aslist li:last-child
+{
+    border-bottom-style:solid;
+    border-bottom-right-radius: 0.05in;
+    border-bottom-left-radius: 0.05in;
+    padding-bottom:0.1in;
+}
+
+#aslist li span
+{
+    background:white;
+    width:6.5in;
+    padding:0;
+    margin:0;
+    display:block
+}
+
+#aslist li:hover span
+{
+    background:#AAE;
+    color:black;
 }

 .html-ltr .buttonbox
@@ -484,7 +548,7 @@ p

 .setting-footer, .signin-exit, .landing-footer
 {
-    margin-top: 1in;
+    margin-top: 0.25in;
     text-align: center;
 }

@@ -494,7 +558,6 @@ p
     width: 2.5in;
     padding: 0;
     border-radius: 8px;
-    -moz-border-radius: 8px; -webkit-border-radius:8px;
 }

 .html-rtl .sidemenu
@@ -503,7 +566,6 @@ p
     width: 2.5in;
     padding: 0;
     border-radius: 8px;
-    -moz-border-radius: 8px; -webkit-border-radius:8px;
 }

 .sidemenu h2
@@ -514,10 +576,6 @@ p
     padding: .05in .15in .05in .15in ;
     border-top-right-radius: 8px;
     border-top-left-radius: 8px;
-    -moz-border-radius-topleft: 8px;
-    -moz-border-radius-topright: 8px;
-    -webkit-border-radius-topleft:8px;
-    -webkit-border-radius-topright:8px;
 }

 .sidemenu li
@@ -551,8 +609,6 @@ p
     padding: 0;
     margin: 0;
     border-radius: 8px;
-    -moz-border-radius: 8px; -webkit-border-radius:8px;
-
 }

 .html-ltr .currentactivity
@@ -571,7 +627,6 @@ p
     border: 1px solid #ccc;

     border-radius: 8px;
-    -moz-border-radius: 8px; -webkit-border-radius:8px;
 }

 .html-rtl .currentactivity
@@ -590,7 +645,6 @@ p
     border: 1px solid #ccc;

     border-radius: 8px;
-    -moz-border-radius: 8px; -webkit-border-radius:8px;
 }


@@ -827,6 +881,7 @@ p
 }
 .talltextarea
 {
+    font-size:16pt;
     width:100%;
     height:4in;
 }
diff --git a/data/default.db b/data/default.db
index ab39992f2..de00dd0a6 100644
Binary files a/data/default.db and b/data/default.db differ
diff --git a/error.php b/error.php
index 0483be89d..d26cef84b 100755
--- a/error.php
+++ b/error.php
@@ -34,6 +34,17 @@
  * @filesource
  */

+/** Calculate base directory of script
+ *  @ignore
+ */
+$pathinfo = pathinfo($_SERVER['SCRIPT_FILENAME']);
+if(!defined('BASE_DIR')) {
+    define("BASE_DIR", $pathinfo["dirname"].'/');
+}
+/**
+ * Load the configuration file
+ */
+require_once(BASE_DIR.'configs/config.php');
 /**
  * Used to set-up static error pages
  */
@@ -52,7 +63,7 @@ $locale = NULL;
 setLocaleObject($locale_tag);

 if(!isset($_REQUEST['p']) ||
-    !in_array($_REQUEST['p'], array("404"))) {
+    !in_array($_REQUEST['p'], array("404", "409"))) {
     $_REQUEST['p'] = "404";
 }
 switch($_REQUEST['p'])
@@ -60,10 +71,24 @@ switch($_REQUEST['p'])
     case "404":
         header("HTTP/1.0 404 Not Found");
     break;
+    case "409":
+        header("HTTP/1.0 409 Conflict");
+    break;
 }

 $controller = new StaticController();

 $controller->processRequest();

+/**
+ * shorthand for echo
+ *
+ * @param string $text string to send to the current output
+ */
+if(!function_exists("e")) {
+    function e($text)
+    {
+        echo $text;
+    }
+}
 ?>
diff --git a/lib/bigrams.php b/lib/bigrams.php
deleted file mode 100644
index 4f0857ef0..000000000
--- a/lib/bigrams.php
+++ /dev/null
@@ -1,278 +0,0 @@
-<?php
-/**
- *  SeekQuarry/Yioop --
- *  Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
- *
- *  LICENSE:
- *
- *  This program is free software: you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation, either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- *  END LICENSE
- *
- * @author Ravi Dhillon ravi.dhillon@yahoo.com
- * @package seek_quarry
- * @subpackage library
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
- * @copyright 2009 - 2012
- * @filesource
- */
-
-if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
-
-/**
- *  Load the stem word functions
- */
-foreach(glob(BASE_DIR."/lib/stemmers/*_stemmer.php")
-    as $filename) {
-    require_once $filename;
-}
-
-/**
- * Load the Bloom Filter File
- */
-require_once BASE_DIR."/lib/bloom_filter_file.php";
-
-/**
- * Load the Phrase Parser File
- */
-require_once BASE_DIR."/lib/phrase_parser.php";
-
-/**
- * Library of functions used to create and extract bigrams
- *
- * @author Ravi Dhillon
- *
- * @package seek_quarry
- * @subpackage library
- */
-class Bigrams
-{
-     /**
-      * Language tags and their corresponding bigram prefix
-      * @var array
-      */
-     static $LANG_PREFIX = array(
-        'en' => "en",
-        'en-US' => "en",
-        'en-GB' => "en",
-        'en-CA' => "en"
-     );
-
-     /**
-      * @constant Name of the folder inside user work directory
-      * that contains the input compressed XML file. The filter
-      * file generated will also be stored in this folder.
-      */
-     const FILTER_FOLDER = "/search_filters/";
-     /**
-      * @constant Suffix appended to langauge tag to create the
-      * filter file name containing bigrams.
-      */
-     const FILTER_SUFFIX = "_bigrams.ftr";
-     /**
-      * @constant Suffix appended to langauge tag to create the
-      * text file name containing bigrams.
-      */
-     const TEXT_SUFFIX = "_bigrams.txt";
-
-    /**
-     * Extracts Bigrams from input set of phrases. If a filter file
-     * is not available for $lang we just return the input phrases.
-     * Each pair of phrases is searched in filter file to check if
-     * it is a bigram. If a pair passes the bigram check we add it
-     * to the array of phrases as a single phrase otherwise individual
-     * phrases are added to the array. The resultant array of phrases
-     * is returned at the end.
-     *
-     * @param array $phrases subject to bigram check
-     * @param string $lang Language to be used to stem bigrams.
-     * @return array of bigrams and phrases
-     */
-    static function extractBigrams($phrases, $lang)
-    {
-        $lang_prefix = $lang;
-        if(isset(self::$LANG_PREFIX[$lang])) {
-            $lang_prefix = self::$LANG_PREFIX[$lang];
-        }
-        $filter_path = WORK_DIRECTORY .
-            self::FILTER_FOLDER . $lang_prefix . self::FILTER_SUFFIX;
-        if (file_exists($filter_path)) {
-            $bigrams = BloomFilterFile::load($filter_path);
-        }
-        else {
-            return $phrases;
-        }
-        $bigram_phrases = array();
-        $num_phrases = count($phrases);
-        $i = 0;
-        $j = 1;
-        while($j < $num_phrases){
-            $pair = $phrases[$i]." ".$phrases[$j];
-            if($bigrams->contains(strtolower($pair))){
-                $bigram_phrases[] = $pair;
-                $i += 2;
-                $j += 2;
-            } else {
-                $bigram_phrases[] = $phrases[$i];
-                $i++;
-                $j++;
-            }
-        }
-        if($j == $num_phrases) {
-            $bigram_phrases[] = $phrases[$j - 1];
-        }
-
-        return $bigram_phrases;
-    }
-
-    /**
-     * Creates a bloom filter file from a bigram text file. The
-     * path of bigram text file used is based on the input $lang.
-     * The name of output filter file is based on the $lang and
-     * size based on input number of bigrams .
-     * The bigrams are read from text file, stemmed if a stemmer
-     * is available for $lang and then stored in filter file.
-     *
-     * @param string $lang language to be used to stem bigrams.
-     * @param number $num_bigrams Count of bigrams in text file.
-     * @return none
-     */
-    static function createBigramFilterFile($lang, $num_bigrams)
-    {
-        $lang_prefix = $lang;
-        if(isset(self::$LANG_PREFIX[$lang])) {
-            $lang_prefix = self::$LANG_PREFIX[$lang];
-        }
-        $filter_path =
-            WORK_DIRECTORY . self::FILTER_FOLDER . $lang_prefix .
-            self::FILTER_SUFFIX;
-        if (file_exists($filter_path)) {
-            $bigrams = BloomFilterFile::load($filter_path);
-        }
-        else {
-            $bigrams = new BloomFilterFile($filter_path, $num_bigrams);
-        }
-
-        $inputFilePath = WORK_DIRECTORY . self::FILTER_FOLDER .
-            $lang_prefix . self::TEXT_SUFFIX;
-        $fp = fopen($inputFilePath, 'r') or die("Can't open bigrams text file");
-        while ( ($bigram = fgets($fp)) !== false) {
-          $words = PhraseParser::
-                  extractPhrasesOfLengthOffset(trim($bigram), 1, 0, $lang);
-          if(strlen($words[0]) == 1) { // get rid of bigrams like "a dog"
-              continue;
-          }
-          $bigram_stemmed = implode(" ", $words);
-          $bigrams->add(strtolower($bigram_stemmed));
-        }
-        fclose($fp);
-
-        $bigrams->save();
-    }
-
-    /**
-     * Generates a bigrams text file from input wikipedia xml file.
-     * The input file can be a bz2 compressed or uncompressed, if
-     * the file is compressed it is uncompressed by calling the function
-     * uncompressBz2File($compressed_wiki_file_path).
-     * The input XML file is parsed line by line and pattern for
-     * bigram is searched. If a bigram is found it is added to the
-     * array. After the complete file is parsed we remove the duplicate
-     * bigrams and sort them. The resulting array is written to the
-     * text file. The function returns the number of bigrams stored in
-     * the text file.
-     *
-     * @param string $wiki_file compressed or uncompressed wikipedia
-     *      XML file path to be used to extract bigrams.
-     * @param string $lang Language to be used to create bigrams.
-     * @return number $num_bigrams Count of bigrams in text file.
-     */
-    static function generateBigramsTextFile($wiki_file, $lang)
-    {
-        $lang_prefix = $lang;
-        if(isset(self::$LANG_PREFIX[$lang])) {
-            $lang_prefix = self::$LANG_PREFIX[$lang];
-        }
-        $compressed_wiki_file_path =
-            WORK_DIRECTORY.self::FILTER_FOLDER.$wiki_file;
-        $found = strpos($compressed_wiki_file_path, "bz2");
-        if($found == false){
-            $wiki_file_path = $compressed_wiki_file_path;
-        }
-        else{
-            $wiki_file_path =
-                self::uncompressBz2File($compressed_wiki_file_path);
-        }
-        $fr = fopen($wiki_file_path, 'r') or die("Can't open xml file");
-        $bigrams_file_path
-            = WORK_DIRECTORY.self::FILTER_FOLDER.$lang_prefix.self::TEXT_SUFFIX;
-        $fw = fopen($bigrams_file_path, 'w') or die("Can't open text file");
-        $bigrams = array();
-        while ( ($input_text = fgetss($fr)) !== false) {
-            $input_text = strtolower($input_text);
-            $pattern = '/#redirect\s\[\[[a-z]+[\s|_][a-z0-9]+\]\]/';
-            preg_match($pattern, $input_text, $matches);
-            if(count($matches) == 1) {
-                $bigram = str_replace(
-                    array('#redirect [[',']]'), "", $matches[0]);
-                $bigram = str_replace("_", " ", $bigram);
-                $bigrams[] = $bigram;
-            }
-        }
-        $bigrams = array_unique($bigrams);
-        $num_bigrams = count($bigrams);
-        sort($bigrams);
-        $bigrams_string = implode("\n", $bigrams);
-        fwrite($fw, $bigrams_string);
-        fclose($fr);
-        fclose($fw);
-        return $num_bigrams;
-    }
-
-    /**
-     * Uncompress the compressed Bz2 xml file specified by input
-     * parameter $compressed_wiki_file_path. The $buffer_size
-     * variable specifies the size of block which is read in one
-     * iteration from the compressed file. The uncompressed xml
-     * file is stored in the same directory as the compressed file.
-     * The name of this file is generated by removing ".bz2" from
-     * the end of compressed file name. The name of uncompressed
-     * file is returned by the function.
-     *
-     * @param string $compressed_wiki_file_path bz2 compressed
-     *     wikipedia XML file path.
-     * @return string $wiki_file_path Uncompressed xml file path.
-     */
-    static function uncompressBz2File($compressed_wiki_file_path)
-    {
-        $wiki_file_path = str_replace('.bz2', '', $compressed_wiki_file_path);
-        $bz = bzopen($compressed_wiki_file_path, 'r');
-        $out_file = fopen($wiki_file_path, 'w');
-        $buffer_size = 8092;
-
-        do {
-            $block = bzread($bz, $buffer_size);
-            if($block!==false)
-                fwrite($out_file, $block);
-        }
-        while($block);
-
-        fclose($out_file);
-        bzclose($bz);
-        return $wiki_file_path;
-    }
-}
diff --git a/lib/crawl_daemon.php b/lib/crawl_daemon.php
index 221e4035a..90f18874d 100644
--- a/lib/crawl_daemon.php
+++ b/lib/crawl_daemon.php
@@ -72,7 +72,7 @@ class CrawlDaemon implements CrawlConstants
      *  which fetcher daemon instance.
      *
      * @var string
-     * @var static
+     * @static
      */
      static $subname;

diff --git a/lib/fetch_url.php b/lib/fetch_url.php
index 3854ccf0d..8d4be83de 100755
--- a/lib/fetch_url.php
+++ b/lib/fetch_url.php
@@ -448,14 +448,14 @@ class FetchUrl implements CrawlConstants
     /**
      * Computes the IP address from http get-responser header
      *
-     * @param string contains complete transcript of HTTP get/responce
+     * @param string contains complete transcript of HTTP get/response
      * @return string IPv4 address as a string of dot separated quads.
      */
     static function getCurlIp($header)
     {
-        if (preg_match_all('/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/',
+        if (preg_match_all('/Trying\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/',
             $header, $matches)) {
-            return array_unique($matches[0]);
+            return array_unique($matches[1]);
         } else {
             return false;
         }
@@ -506,6 +506,7 @@ class FetchUrl implements CrawlConstants
         }
         crawlLog("Set curl options");
         $response = curl_exec($agents[$host]);
+        curl_setopt($agents[$host], CURLOPT_POSTFIELDS, "");
         crawlLog("Done curl exec");
         return $response;
     }
diff --git a/lib/index_bundle_iterators/group_iterator.php b/lib/index_bundle_iterators/group_iterator.php
index a1ce67ef1..c4630f984 100644
--- a/lib/index_bundle_iterators/group_iterator.php
+++ b/lib/index_bundle_iterators/group_iterator.php
@@ -211,7 +211,6 @@ class GroupIterator extends IndexBundleIterator
         $this->current_seen_hashes = array();
         if($this->count_block_unfiltered > 0 ) {
             if($this->only_lookup && !$this->no_lookup) {
-
                 $pages = $this->insertUnseenDocs($pages);

                 $this->count_block = count($pages);
@@ -288,13 +287,7 @@ class GroupIterator extends IndexBundleIterator
         foreach($pages as $doc_key => $doc_info) {
             if(!is_array($doc_info) || $doc_info[self::SUMMARY_OFFSET] ==
                 self::NEEDS_OFFSET_FLAG) { continue;}
-            $doc_info['KEY'] = $doc_key;
             $hash_url = substr($doc_key, 0, IndexShard::DOC_KEY_LEN);
-            $doc_info[self::HASH] = substr($doc_key,
-                IndexShard::DOC_KEY_LEN, IndexShard::DOC_KEY_LEN);
-            // inlinks is the domain of the inlink
-            $doc_info[self::INLINKS] = substr($doc_key,
-                2 * IndexShard::DOC_KEY_LEN, IndexShard::DOC_KEY_LEN);
             // initial aggregate domain score vector for given domain
             if($doc_info[self::IS_DOC]) {
                 if(!isset($pre_out_pages[$hash_url])) {
@@ -454,13 +447,6 @@ class GroupIterator extends IndexBundleIterator
         }
         $need_docs = array_diff_key($need_docs, $this->grouped_keys);
         foreach($pages as $doc_key => $doc_info) {
-            $doc_info['KEY'] = $doc_key;
-            $hash_url = substr($doc_key, 0, IndexShard::DOC_KEY_LEN);
-            $doc_info[self::HASH] = substr($doc_key,
-                IndexShard::DOC_KEY_LEN, IndexShard::DOC_KEY_LEN);
-            // inlinks is the domain of the inlink
-            $doc_info[self::INLINKS] = substr($doc_key,
-                2 * IndexShard::DOC_KEY_LEN, IndexShard::DOC_KEY_LEN);
             $new_pages[$doc_key] = $doc_info;
             if($doc_info[self::IS_DOC]) {
                 if(isset($need_docs[$hash_url])) {
@@ -562,10 +548,10 @@ class GroupIterator extends IndexBundleIterator
                 }
                 $min = ($current_rank < $min ) ? $current_rank : $min;
                 $max = ($max < $current_rank ) ? $current_rank : $max;
+                $alpha = $relevance_boost * $domain_weights[$hash_host];
                 $sum_score += $hash_page[self::DOC_RANK]
-                    * $relevance_boost * pow(1.1,$hash_page[self::RELEVANCE]) *
-                    $hash_page[self::PROXIMITY] * $domain_weights[$hash_host];
-                $alpha = $relevance_boost * $domain_weights[$hash_host];;
+                    * $alpha * pow(1.1,$hash_page[self::RELEVANCE]) *
+                    $hash_page[self::PROXIMITY];
                 $sum_rank += $alpha * $hash_page[self::DOC_RANK];
                 $sum_relevance += $alpha * $hash_page[self::RELEVANCE];
                 $sum_proximity += $alpha * $hash_page[self::PROXIMITY];
diff --git a/lib/index_bundle_iterators/phrase_filter_iterator.php b/lib/index_bundle_iterators/phrase_filter_iterator.php
index b433d1a9c..cacd006d3 100644
--- a/lib/index_bundle_iterators/phrase_filter_iterator.php
+++ b/lib/index_bundle_iterators/phrase_filter_iterator.php
@@ -190,6 +190,9 @@ class PhraseFilterIterator extends IndexBundleIterator

                     if($found == true) {
                         $doc_info["WEIGHT"] = $this->weight;
+                        $doc_info[self::DOC_RANK] *= $this->weight;
+                        $doc_info[self::RELEVANCE] *= $this->weight;
+                        $doc_info[self::PROXIMITY] *= $this->weight;
                         $doc_info[self::SCORE] *= $this->weight;
                         $out_pages[$doc_key] = $doc_info;
                     }
diff --git a/lib/index_bundle_iterators/word_iterator.php b/lib/index_bundle_iterators/word_iterator.php
index d1fff9a29..cd08330c2 100644
--- a/lib/index_bundle_iterators/word_iterator.php
+++ b/lib/index_bundle_iterators/word_iterator.php
@@ -133,7 +133,7 @@ class WordIterator extends IndexBundleIterator
     /** Length of a doc key*/
     const KEY_LEN = 8;

-
+    static $start_time = 0;
     /**
      * Creates a word iterator with the given parameters.
      *
@@ -249,16 +249,23 @@ class WordIterator extends IndexBundleIterator

         //the next call also updates next offset
         $shard = $this->index->getCurrentShard();
-        $results = $shard->getPostingsSlice(
+        $pre_results = $shard->getPostingsSlice(
             $this->start_offset,
             $this->next_offset, $this->last_offset, $this->results_per_block);
-        if($this->filter != NULL) {
-            foreach($results as $keys => $data) {
-                $host_key = substr($keys, self::HOST_KEY_POS, self::KEY_LEN);
-                if(in_array($host_key, $this->filter) ) {
-                    unset($results[$keys]);
-                }
+        $filter = ($this->filter == NULL) ? array() : $this->filter;
+        foreach($pre_results as $keys => $data) {
+            $host_key = substr($keys, self::HOST_KEY_POS, self::KEY_LEN);
+            if(in_array($host_key, $filter) ) {
+                continue;
             }
+            $data['KEY'] = $keys;
+            $hash_url = substr($keys, 0, IndexShard::DOC_KEY_LEN);
+            $data[self::HASH] = substr($keys,
+                IndexShard::DOC_KEY_LEN, IndexShard::DOC_KEY_LEN);
+            // inlinks is the domain of the inlink
+            $data[self::INLINKS] = substr($keys,
+                2 * IndexShard::DOC_KEY_LEN, IndexShard::DOC_KEY_LEN);
+            $results[$keys] = $data;
         }
         $this->count_block = count($results);
         $this->pages = $results;
diff --git a/lib/index_dictionary.php b/lib/index_dictionary.php
index e57fac9c3..2f71d07f9 100644
--- a/lib/index_dictionary.php
+++ b/lib/index_dictionary.php
@@ -491,6 +491,9 @@ class IndexDictionary implements CrawlConstants
      */
      function getWordInfo($word_id, $raw = false, $extract = true)
      {
+        if(strlen($word_id) < IndexShard::WORD_KEY_LEN) {
+            return false;
+        }
         if($raw == false) {
             //get rid of out modified base64 encoding
             $word_id = unbase64Hash($word_id);
@@ -663,11 +666,11 @@ class IndexDictionary implements CrawlConstants
             return $this->blocks[$file_num][$bytes];
         }
         if(!isset($this->fhs[$file_num]) || $this->fhs[$file_num] === NULL) {
-            $this->fhs[$file_num] = fopen($this->dir_name.
-                "/$file_num/".$this->max_tier."A.dic", "rb");
-            if($this->fhs[$file_num] === false) return false;
-            $this->file_lens[$file_num] = filesize($this->dir_name.
-                "/$file_num/".$this->max_tier."A.dic");
+            $file_name = $this->dir_name. "/$file_num/".$this->max_tier."A.dic";
+            if(!file_exists($file_name)) return $false;
+            $this->fhs[$file_num] = fopen($file_name, "rb");
+            if($this->fhs[$file_num] === false) return $false;
+            $this->file_lens[$file_num] = filesize($file_name);
         }
         if($bytes >= $this->file_lens[$file_num]) {

diff --git a/lib/nword_grams.php b/lib/nword_grams.php
new file mode 100644
index 000000000..ad93da51e
--- /dev/null
+++ b/lib/nword_grams.php
@@ -0,0 +1,313 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * @author Ravi Dhillon ravi.dhillon@yahoo.com, Chris Pollett
+ * @package seek_quarry
+ * @subpackage library
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2012
+ * @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+/**
+ * Load the Bloom Filter File
+ */
+require_once BASE_DIR."/lib/bloom_filter_file.php";
+
+/**
+ * Load the Phrase Parser File
+ */
+require_once BASE_DIR."/lib/phrase_parser.php";
+
+/**
+ * Library of functions used to create and extract n word grams
+ *
+ * @author Ravi Dhillon (Bigram Version), Chris Pollett (ngrams + rewrite +
+ *  support for page count dumps)
+ *
+ * @package seek_quarry
+ * @subpackage library
+ */
+class NWordGrams
+{
+     /**
+      * Static copy of n-grams files
+      * @var object
+      */
+    static $ngrams = NULL;
+     /**
+      *
+      */
+     const BLOCK_SIZE = 8192;
+     /**
+      * Suffix appended to language tag to create the
+      * filter file name containing bigrams.
+      */
+     const FILTER_SUFFIX = "_word_grams.ftr";
+     /**
+      * Suffix appended to language tag to create the
+      * text file name containing bigrams.
+      */
+     const TEXT_SUFFIX = "_word_grams.txt";
+
+     const WIKI_DUMP_REDIRECT = 0;
+     const WIKI_DUMP_TITLE = 1;
+     const PAGE_COUNT_WIKIPEDIA = 2;
+     const PAGE_COUNT_WIKTIONARY = 3;
+
+    /**
+     * Says whether or not phrase exists in the N word gram Bloom Filter
+     *
+     * @param $phrase what to check if is a bigram
+     * @param string $lang language of bigrams file
+     * @return true or false
+     */
+    static function ngramsContains($phrase, $lang, $num_gram = 2)
+    {
+
+        if(self::$ngrams == NULL || !isset(self::$ngrams[$num_gram])) {
+            $filter_path =
+                LOCALE_DIR . "/$lang/resources/" .
+                "{$num_gram}" . self::FILTER_SUFFIX;
+            if (file_exists($filter_path)) {
+                self::$ngrams[$num_gram] = BloomFilterFile::load($filter_path);
+            } else  {
+                return false;
+            }
+        }
+        return self::$ngrams[$num_gram]->contains(strtolower($phrase));
+    }
+
+    /**
+     * Creates a bloom filter file from a n word gram text file. The
+     * path of n word gram text file used is based on the input $lang.
+     * The name of output filter file is based on the $lang and the
+     * number n. Size is based on input number of n word grams .
+     * The n word grams are read from text file, stemmed if a stemmer
+     * is available for $lang and then stored in filter file.
+     *
+     * @param string $lang language to be used to stem bigrams.
+     * @param int $num_gram number of words in grams we are storing
+     * @param int $num_ngrams_found count of n word grams in text file.
+     * @param int $max_gram_len value n of longest n gram to be added.
+     * @return none
+     */
+    static function makeNWordGramsFilterFile($lang, $num_gram,
+        $num_ngrams_found, $max_gram_len)
+    {
+        $filter_path =
+            LOCALE_DIR . "/$lang/resources/" .
+            "{$num_gram}" . self::FILTER_SUFFIX;
+        if (file_exists($filter_path)) {
+            unlink($filter_path); //build again from scratch
+        }
+        $ngrams = new BloomFilterFile($filter_path, $num_ngrams_found);
+
+        $inputFilePath = LOCALE_DIR . "/$lang/resources/" .
+            "{$num_gram}" .  self::TEXT_SUFFIX;
+        $fp = fopen($inputFilePath, 'r') or die("Can't open ngrams text file");
+        while ( ($ngram = fgets($fp)) !== false) {
+          $words = PhraseParser::stemTerms(trim($ngram), $lang);
+          if(strlen($words[0]) == 1) { // get rid of n grams like "a dog"
+              continue;
+          }
+          $ngram_stemmed = implode(" ", $words);
+          $ngrams->add(mb_strtolower($ngram_stemmed));
+        }
+        fclose($fp);
+        $ngrams->max_gram_len = $max_gram_len;
+        $ngrams->save();
+    }
+
+    /**
+     * Generates a n word grams text file from input wikipedia xml file.
+     * The input file can be a bz2 compressed or uncompressed.
+     * The input XML file is parsed line by line and pattern for
+     * n word gram is searched. If a n word gram is found it is added to the
+     * array. After the complete file is parsed we remove the duplicate
+     * n word grams and sort them. The resulting array is written to the
+     * text file. The function returns the number of bigrams stored in
+     * the text file.
+     *
+     * @param string $wiki_file compressed or uncompressed wikipedia
+     *      XML file path to be used to extract bigrams.
+     * @param string $lang Language to be used to create n grams.
+     * @param string $locale Locale to be used to store results.
+     * @param int $num_gram number of words in grams we are looking for
+     * @param int $ngram_type where in Wiki Dump to extract grams from
+     * @return number $num_ngrams_found count of bigrams in text file.
+     */
+    static function makeNWordGramsTextFile($wiki_file, $lang,
+        $locale, $num_gram = 2, $ngram_type = self::PAGE_COUNT_WIKIPEDIA,
+        $max_terms = -1)
+    {
+        $wiki_file_path = PREP_DIR."/$wiki_file";
+        if(strpos($wiki_file_path, "bz2") !== false) {
+            $fr = bzopen($wiki_file_path, 'r') or
+                die ("Can't open compressed file");
+            $read = "bzread";
+            $close = "bzclose";
+        } else if (strpos($wiki_file_path, "gz") !== false) {
+            $fr = gzopen($wiki_file_path, 'r') or
+                die ("Can't open compressed file");
+            $read = "gzread";
+            $close = "gzclose";
+        } else {
+            $fr = fopen($wiki_file_path, 'r') or die("Can't open file");
+            $read = "fread";
+            $close = "fclose";
+        }
+        $ngrams_file_path
+            = LOCALE_DIR . "/$locale/resources/" . "{$num_gram}" .
+                self::TEXT_SUFFIX;
+        $ngrams = array();
+        $input_buffer = "";
+        $time = time();
+        echo "Reading wiki file ...\n";
+        $bytes = 0;
+        $bytes_since_last_output = 0;
+        $output_message_threshold = self::BLOCK_SIZE*self::BLOCK_SIZE;
+        $is_count_type = false;
+        switch($ngram_type)
+        {
+            case self::WIKI_DUMP_TITLE:
+                $pattern = '/<title>[^\p{P}]+';
+                $pattern_end = '<\/title>/u';
+                $replace_array = array('<title>','</title>');
+            break;
+            case self::WIKI_DUMP_REDIRECT:
+                $pattern = '/#redirect\s\[\[[^\p{P}]+';
+                $pattern_end='\]\]/u';
+                $replace_array = array('#redirect [[',']]');
+            break;
+            case self::PAGE_COUNT_WIKIPEDIA:
+                $pattern = '/^'.$lang.'\s[^\p{P}]+';
+                $pattern_end='/u';
+                $is_count_type = true;
+            break;
+            case self::PAGE_COUNT_WIKTIONARY:
+                $pattern = '/^'.$lang.'.d\s[^\p{P}]+';
+                $pattern_end='/u';
+                $is_count_type = true;
+            break;
+        }
+        $is_all = false;
+        $repeat_pattern = "[\s|_][^\p{P}]+";
+        if($num_gram == "all" || $is_count_type) {
+            $pattern .= "($repeat_pattern)+";
+            if($num_gram == "all") {
+                $is_all = true;
+            }
+            $max_gram_len = -1;
+        } else {
+            for($i = 1; $i < $num_gram; $i++) {
+                $pattern .= $repeat_pattern;
+            }
+            $max_gram_len = $num_gram;
+        }
+        $pattern .= $pattern_end;
+        $replace_types = array(self::WIKI_DUMP_TITLE, self::WIKI_DUMP_REDIRECT);
+        while (!feof($fr)) {
+            $input_text = $read($fr, self::BLOCK_SIZE);
+            $len = strlen($input_text);
+            if($len == 0) break;
+            $bytes += $len;
+            $bytes_since_last_output += $len;
+            if($bytes_since_last_output > $output_message_threshold) {
+                echo "Have now read ".$bytes." many bytes. " .
+                    "Peak memory so far ".memory_get_peak_usage().
+                    " Elapsed time so far:".(time() - $time)."\n";
+                $bytes_since_last_output = 0;
+            }
+            $input_buffer .= mb_strtolower($input_text);
+            $lines = explode("\n", $input_buffer);
+            $input_buffer = array_pop($lines);
+            foreach($lines as $line) {
+                preg_match($pattern, $line, $matches);
+                if(count($matches) > 0) {
+                    if($is_count_type) {
+                        $line_parts = explode(" ", $matches[0]);
+                        if(isset($line_parts[1]) && isset($line_parts[2])) {
+                            $ngram = mb_ereg_replace("_", " ", $line_parts[1]);
+                            $char_grams =
+                                PhraseParser::getCharGramsTerm(array($ngram),
+                                    $locale);
+                            $ngram = implode(" ", $char_grams);
+                            $ngram_num_words =  mb_substr_count($ngram, " ")+1;
+                            if(($is_all && $ngram_num_words > 1) ||(!$is_all &&
+                                $ngram_num_words == $num_gram)) {
+                                $ngrams[$ngram] = $line_parts[2];
+                            }
+                        }
+                    } else {
+                        $ngram = mb_ereg_replace(
+                            $replace_array, "", $matches[0]);
+                        $ngram = mb_ereg_replace("_", " ", $ngram);
+
+                        $ngrams[] = $ngram;
+                    }
+                    if($is_all && isset($ngram)) {
+                        $ngram_num_words =  mb_substr_count($ngram, " ") + 1;
+                        $max_gram_len = max($max_gram_len, $ngram_num_words);
+                    }
+                }
+            }
+        }
+        if($is_count_type) {
+            arsort($ngrams);
+            $ngrams = array_keys($ngrams);
+        }
+        $ngrams = array_unique($ngrams);
+        $num_ngrams_found = count($ngrams);
+        if($max_terms > 0 && $num_ngrams_found > $max_terms) {
+            $ngrams = array_slice($ngrams, 0, $max_terms);
+        }
+        $num_ngrams_found = count($ngrams);
+        // in is_all case add prefix*'s for (n >= 3)-grams
+        if($is_all) {
+            for($i = 0; $i < $num_ngrams_found; $i++) {
+                $ngram_in_word =  mb_substr_count($ngrams[$i], " ")+1;
+                if($ngram_in_word >= 3) {
+                    $ngram_parts = explode(" ", $ngrams[$i]);
+                    $ngram = $ngram_parts[0];
+                    for($j = 1; $j < $ngram_in_word - 1;  $j++ ) {
+                        $ngram .= " ".$ngram_parts[$j];
+                        $ngrams[] = $ngram."*";
+                    }
+                }
+            }
+            $ngrams = array_unique($ngrams);
+            $num_ngrams_found = count($ngrams);
+        }
+        sort($ngrams);
+
+        $ngrams_string = implode("\n", $ngrams);
+        file_put_contents($ngrams_file_path, $ngrams_string);
+        $close($fr);
+        return array($num_ngrams_found, $max_gram_len);
+    }
+
+}
diff --git a/lib/phrase_parser.php b/lib/phrase_parser.php
index 35356404f..eecbf9d18 100755
--- a/lib/phrase_parser.php
+++ b/lib/phrase_parser.php
@@ -33,18 +33,16 @@

 if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}

-/**
- *  Load the stem word functions, if necessary
- */
-foreach(glob(BASE_DIR."/lib/stemmers/*_stemmer.php")
+foreach(glob(LOCALE_DIR."/*/resources/tokenizer.php")
     as $filename) {
     require_once $filename;
 }
+$GLOBALS["CHARGRAMS"] = $CHARGRAMS;

 /**
- * Load the Bigrams File
+ * Load the n word grams File
  */
-require_once BASE_DIR."/lib/bigrams.php";
+require_once BASE_DIR."/lib/nword_grams.php";

 /**
  * Reads in constants used as enums used for storing web sites
@@ -61,43 +59,6 @@ require_once BASE_DIR."/lib/crawl_constants.php";
  */
 class PhraseParser
 {
-    /**
-     * Language tags and their corresponding stemmer
-     * @var array
-     */
-     static $STEMMERS = array(
-        'en' => "EnStemmer",
-        'en-US' => "EnStemmer",
-        'en-GB' => "EnStemmer",
-        'en-CA' => "EnStemmer",
-     );
-
-    /**
-     * Language tags and their corresponding character n-gram length
-     * (should only use one of character n-grams or stemmer)
-     */
-     static $CHARGRAMS = array(
-        'ar' => 5,
-        'de' => 5,
-        'es' => 5,
-        'fr' => 5,
-        'fr-FR' => '5',
-        'he' => 5,
-        'hi' => 5,
-        'kn' => 5,
-        'in-ID' => 5,
-        'pt' => 5,
-        'it' => 5,
-        'ko' => 3,
-        'ja' => 3,
-        'ru' => 5,
-        'th' => 4,
-        'tr' => 6,
-        'zh-CN' => 2,
-        'cn' => 2,
-        'zh' => 2
-     );
-
     /**
      * Converts a summary of a web page into a string of space separated words
      *
@@ -107,11 +68,18 @@ class PhraseParser
      */
     static function extractWordStringPageSummary($page)
     {
-        $title_phrase_string = mb_ereg_replace(PUNCT, " ",
-            $page[CrawlConstants::TITLE]);
-        $description_phrase_string = mb_ereg_replace(PUNCT, " ",
-            $page[CrawlConstants::DESCRIPTION]);
-
+        if(isset($page[CrawlConstants::TITLE])) {
+            $title_phrase_string = mb_ereg_replace(PUNCT, " ",
+                $page[CrawlConstants::TITLE]);
+        } else {
+            $title_phrase_string = "";
+        }
+        if(isset($page[CrawlConstants::DESCRIPTION])) {
+            $description_phrase_string = mb_ereg_replace(PUNCT, " ",
+                $page[CrawlConstants::DESCRIPTION]);
+        } else {
+            $description_phrase_string = "";
+        }
         $page_string = $title_phrase_string . " " . $description_phrase_string;
         $page_string = preg_replace("/(\s)+/", " ", $page_string);

@@ -119,65 +87,57 @@ class PhraseParser
     }

     /**
-     * Extracts all phrases (sequences of adjacent words) from $string of
-     * length less than or equal to $len.
+     * Extracts all phrases (sequences of adjacent words) from $string. Does
+     * not extract terms within those phrase. Array key indicates position
+     * of phrase
      *
      * @param string $string subject to extract phrases from
-     * @param int $len longest length of phrases to consider
      * @param string $lang locale tag for stemming
      * @param bool $orig_and_grams if char-gramming is done whether to keep
      *      the original term as well in what's returned
      * @return array of phrases
      */
-    static function extractPhrases($string,
-        $len =  MAX_PHRASE_LEN, $lang = NULL, $orig_and_grams = false)
+    static function extractPhrases($string,$lang = NULL,$orig_and_grams = false)
     {
-        $phrases = array();
-
-        for($i = 0; $i < $len; $i++) {
-            $phrases =
-                array_merge($phrases,
-                    self::extractPhrasesOfLength($string, $i, $lang,
-                        $orig_and_grams));
-        }
-
+        self::canonicalizePunctuatedTerms($string, $lang);
+        $phrase_pos = self::extractPhrasesInLists($string, $lang,
+            $orig_and_grams, false);
+        $phrases = array_keys($phrase_pos);
         return $phrases;
     }

     /**
-     * Extracts all phrases (sequences of adjacent words) from $string of
-     * length less than or equal to $len.
+     * Extracts all phrases (sequences of adjacent words) from $string. Does
+     * not extract terms within those phrase. Returns an associative array
+     * of phrase => number of occurrences of phrase
      *
      * @param string $string subject to extract phrases from
-     * @param int $len longest length of phrases to consider
      * @param string $lang locale tag for stemming
      * @param bool $orig_and_grams if char-gramming is done whether to keep
      *      the original term as well in what's returned
      * @return array pairs of the form (phrase, number of occurrences)
      */
-    static function extractPhrasesAndCount($string,
-        $len =  MAX_PHRASE_LEN, $lang = NULL, $orig_and_grams = false)
+    static function extractPhrasesAndCount($string, $lang = NULL,
+        $orig_and_grams = false)
     {
-        $phrases = array();

-        for($i = 0; $i < $len; $i++) {
-            $phrases =
-                array_merge($phrases,
-                    self::extractPhrasesOfLength($string, $i, $lang,
-                        $orig_and_grams));
-        }
+        self::canonicalizePunctuatedTerms($string, $lang);

-        $phrase_counts = array_count_values($phrases);
+        $phrases = self::extractPhrasesInLists($string, $lang, $orig_and_grams,
+            false);
+        $phrase_counts = array();
+        foreach($phrases as $term => $positions) {
+            $phrase_counts[$term] = count($positions);
+        }

         return $phrase_counts;
     }

     /**
-     * Extracts all phrases (sequences of adjacent words) from $string of
-     * length less than or equal to $len.
+     * Extracts all phrases (sequences of adjacent words) from $string. Does
+     * extract terms within those phrase.
      *
      * @param string $string subject to extract phrases from
-     * @param int $len longest length of phrases to consider
      * @param string $lang locale tag for stemming
      * @param bool $orig_and_grams if char-gramming is done whether to keep
      *      the original term as well in what's returned
@@ -185,130 +145,172 @@ class PhraseParser
      *      the document
      */
     static function extractPhrasesInLists($string,
-        $len =  MAX_PHRASE_LEN, $lang = NULL, $orig_and_grams = false)
+        $lang = NULL, $orig_and_grams = false, $phrases_and_terms = true)
     {
         $phrase_lists = array();
-
-        for($i = 0; $i < $len; $i++) {
-            $phrases = self::extractPhrasesOfLength($string, $i, $lang,
-                $orig_and_grams);
-            if($i==1){
-                $n = 0;
-                foreach ($phrases as $phrase) {
-                    $words = explode(" ",$phrase);
-                    if(count($words)==2){
-                        $phrase_lists[$phrase][] = $n;
-                        $phrase_lists[$words[0]][] = $n++;
-                        $phrase_lists[$words[1]][] = $n++;
-                    }
-                    else{
-                        $phrase_lists[$phrase][] = $n++;
+        self::canonicalizePunctuatedTerms($string, $lang);
+        $pre_phrases =
+            self::extractTermsAndFilterPhrases($string, $lang, $orig_and_grams);
+        $phrases = array();
+        $j = 0;
+        foreach($pre_phrases as $pre_phrase) {
+            $len = count($pre_phrase);
+            if($len == 1) {
+                $phrases[$pre_phrase[0]][] = $j++;
+            } else {
+                $phrases[implode(" ", $pre_phrase)][] = $j;
+                if($phrases_and_terms) {
+                    foreach($pre_phrase as $term) {
+                        $phrases[$term][] = $j++;
                     }
                 }
             }
-            else{
-                $count = count($phrases);
-                for($j = 0; $j < $count; $j++) {
-                    $phrase_lists[$phrases[$j]][] = $j;
-                }
-            }
         }
-        return $phrase_lists;
+        return $phrases;
     }

     /**
-     * Extracts all phrases (sequences of adjacent words) from $string of
-     * length exactly equal to $len.
+     * This functions tries to convert acronyms, e-mail, urls, etc into
+     * a format that does not involved punctuation that will be stripped
+     * as we extract phrases.
      *
-     * @param string $string subject to extract phrases from
-     * @param int $len length of phrases to consider
-     * @param string $lang locale tag for stemming
-     * @param bool $orig_and_grams if char-gramming is done whether to keep
-     *      the original term as well in what's returned
-     * @return array of phrases
+     * @param &$string a string of words, etc which might involve such terms
+     * @param $lang a language tag to use as part of the canonicalization
+     *      process not used right now
      */
-    static function extractPhrasesOfLength($string, $phrase_len, $lang = NULL,
-        $orig_and_grams = false)
+    static function canonicalizePunctuatedTerms(&$string, $lang = NULL)
     {
-        $phrases = array();
-
-        for($i = 0; $i < $phrase_len; $i++) {
-            $phrases = array_merge($phrases,
-                self::extractPhrasesOfLengthOffset($string,
-                    $phrase_len, $i, $lang, $orig_and_grams));
+        //these obscure statics is because php 5.2 does not garbage collect
+        //create_function's
+        static $replace_function0, $replace_function1, $replace_function2;
+        $acronym_pattern = "/[A-Za-z]\.(\s*[A-Za-z]\.)+/";
+        if(!isset($replace_function0)) {
+            $replace_function0 = create_function('$matches', '
+                $result = "_".mb_strtolower(
+                    mb_ereg_replace("\.", "", $matches[0]));
+                return $result;');
         }
-
-        if($phrase_len == 1 && count($phrases) > 1){
-            $phrases = Bigrams::extractBigrams($phrases, $lang);
+        $string = preg_replace_callback($acronym_pattern,
+            $replace_function0, $string);
+
+        $ampersand_pattern = "/[A-Za-z]+(\s*(\s(\'n|\'N)\s|\&)\s*[A-Za-z])+/";
+        if(!isset($replace_function1)) {
+            $replace_function1 = create_function('$matches', '
+                $result = mb_strtolower(
+                    mb_ereg_replace("\s*(\'n|\'N|\&)\s*", "_and_",$matches[0]));
+                return $result;
+            ');
         }
-
-        return $phrases;
+        $string = preg_replace_callback($ampersand_pattern,$replace_function1,
+            $string);
+
+        $url_or_email_pattern =
+            '@((http|https)://([^ \t\r\n\v\f\'\"\;\,<>])*)|'.
+            '([A-Z0-9._%-]+\@[A-Z0-9.-]+\.[A-Z]{2,4})@i';
+        if(!isset($replace_function2)) {
+            $replace_function2 = create_function('$matches', '
+                $result =  mb_ereg_replace("\.", "_d_",$matches[0]);
+                $result =  mb_ereg_replace("\:", "_c_",$result);
+                $result =  mb_ereg_replace("\/", "_s_",$result);
+                $result =  mb_ereg_replace("\@", "_a_",$result);
+                $result =  mb_ereg_replace("\[", "_bo_",$result);
+                $result =  mb_ereg_replace("\]", "_bc_",$result);
+                $result =  mb_ereg_replace("\(", "_po_",$result);
+                $result =  mb_ereg_replace("\)", "_pc_",$result);
+                $result =  mb_ereg_replace("\?", "_q_",$result);
+                $result =  mb_ereg_replace("\=", "_e_",$result);
+                $result =  mb_ereg_replace("\&", "_a_",$result);
+                $result = mb_strtolower($result);
+                return $result;
+            ');
+        }
+        $string = preg_replace_callback($url_or_email_pattern,
+            $replace_function2, $string);
     }

     /**
-     * Extracts phrases (sequences of adjacent words) from $string of
-     * length exactly equal to $len, beginning with the $offset'th word.
-     * This extracts the the $len many words after offset, then the $len
-     * many words after that, and so on.
+     * Splits string according to punctuation and white space then
+     * extracts (stems/char grams) of terms and n word grams from the string
      *
-     * @param string $string subject to extract phrases from
-     * @param int $len length of phrases to consider
-     * @param int $offset the first word to begin with
-     * @param string $lang locale tag for stemming
+     * @param string $string to extract terms from
+     * @param string $lang IANA tag to look up stemmer under
      * @param bool $orig_and_grams if char-gramming is done whether to keep
      *      the original term as well in what's returned
-     * @return array of phrases
+     * @return array of terms and n word grams in the order they appeared in
+     *      string
      */
-    static function extractPhrasesOfLengthOffset($string,
-        $phrase_len, $offset, $lang = NULL, $orig_and_grams = false)
+    static function extractTermsAndFilterPhrases($string,
+        $lang = NULL, $orig_and_grams = false)
     {
-        $words = mb_split("[[:space:]]|".PUNCT, $string);
-
-        $stems = array();
-
-        if(isset(self::$STEMMERS[$lang])) {
-            $stemmer = self::$STEMMERS[$lang];
-        } else {
-            $stemmer = NULL;
-        }
-        for($i = $offset; $i < count($words); $i++) {
-            if($words[$i] == "") {continue;}
-
-            $phrase_number = ($i - $offset)/$phrase_len;
-            if(!isset($stems[$phrase_number])) {
-                $stems[$phrase_number]="";
-                $first_time = "";
+        global $CHARGRAMS;
+
+        mb_internal_encoding("UTF-8");
+        //split first on punctuation as n word grams shouldn't cross punctuation
+        $fragments = mb_split(PUNCT, $string);
+
+        $final_terms = array();
+        $stem_obj = self::getStemmer($lang);
+
+        foreach($fragments as $fragment) {
+            $pre_terms = mb_split("[[:space:]]", $fragment);
+            if($pre_terms == array()) continue;
+            $terms = array();
+            if(isset($CHARGRAMS[$lang])) {
+                foreach($pre_terms as $pre_term) {
+                    if($pre_term == "") continue;
+                    $ngrams = self::getCharGramsTerm(array($pre_term), $lang);
+                    if($orig_and_grams) {
+                        $terms[]  = $pre_term;
+                        $terms = array_merge($terms, $ngrams);
+                    } else if(count($ngrams) > 0) {
+                        $terms = array_merge($terms, $ngrams);
+                    }
+                }
+            } else {
+                $terms = $pre_terms;
             }
-            $pre_stem = mb_strtolower($words[$i]);
-
-
-            if($stemmer != NULL) {
-                $stem_obj = new $stemmer(); //for php 5.2 compatibility
-                $stem =  $stem_obj->stem($pre_stem);
+            $stems = array();
+            if($stem_obj != NULL) {
+                foreach($terms as $term) {
+                    $pre_stem = mb_strtolower($term);
+                    $stems[] = $stem_obj->stem($pre_stem);
+                }
             } else {
-                $stem = $pre_stem;
+                foreach($terms as $term) {
+                    $stems[] = mb_strtolower($term);
+                }
             }
-
-            $stems[$phrase_number] .= $first_time.$stem;
-            $first_time = " ";
-        }
-
-        if($phrase_len == 1) {
-            /*
-                calculate character n-grams if dealing with single terms
-                not phrases; this only changes anything if no stemmer
-                was used
-             */
-            $ngrams = self::getCharGramsTerm($stems, $lang);
-            if($orig_and_grams) {
-                $stems = array_merge($stems, $ngrams);
-            } else if(count($ngrams) > 0) {
-                $stems = $ngrams;
+            $accumulators = array();
+            $phrases = array();
+            $i = 0;
+            $num_stems = count($stems);
+            while($i < $num_stems) {
+                $tmp = $stems[$i];
+                if($stems[$i] == "") {
+                    $i++;
+                    continue;
+                }
+                $j = $i + 1;
+                $max_j = $i;
+                $cont_ngram = true;
+                while($cont_ngram && $j < $num_stems) {
+                    $tmp .= " " . $stems[$j];
+                    $isngram = NWordGrams::ngramsContains($tmp, $lang, "all");
+                    if($isngram) {
+                        $max_j = $j;
+                    }
+                    $cont_ngram = NWordGrams::ngramsContains($tmp."*", $lang,
+                        "all");
+                    $j++;
+                }
+                $phrases[] = array_slice($stems, $i, $max_j - $i + 1);
+                $i = $max_j + 1;
             }
-        }
-
-        return $stems;

+            $phrases = array_values($phrases);
+            $final_terms = array_merge($final_terms, $phrases);
+        }
+        return $final_terms;
     }

     /**
@@ -316,15 +318,18 @@ class PhraseParser
      * Yioop uses for the language in question. If a stemmer is used for
      * language then n-gramming is no done and this just returns an empty array
      *
-     * @param array $term the terms to make n-grams for
+     * @param array $terms the terms to make n-grams for
      * @param string $lang locale tag to determine n to be used for n-gramming
      *
      * @return array the n-grams for the terms in question
      */
     static function getCharGramsTerm($terms, $lang)
     {
-        if(isset(self::$CHARGRAMS[$lang])) {
-            $n = self::$CHARGRAMS[$lang];
+        global $CHARGRAMS;
+
+        mb_internal_encoding("UTF-8");
+        if(isset($CHARGRAMS[$lang])) {
+            $n = $CHARGRAMS[$lang];
         } else {
             return array();
         }
@@ -338,10 +343,129 @@ class PhraseParser
                 $ngrams[] = $pre_gram;
             } else {
                 for($i = 0; $i <= $last_pos; $i++) {
-                    $ngrams[] = mb_substr($pre_gram, $i, $n);
+                    $tmp = mb_substr($pre_gram, $i, $n);
+                    if($tmp != "") {
+                        $ngrams[] = $tmp;
+                    }
                 }
             }
         }
         return $ngrams;
     }
+
+    /**
+     * Splits supplied string based on white space, then stems each
+     * terms according to the stemmer for $lanf if exists
+     *
+     * @param string $string to extract stemmed terms from
+     * @param string $lang IANA tag to look up stemmer under
+     * @return array stemmed terms if stemmer; terms otherwise
+     */
+    static function stemTerms($string, $lang)
+    {
+        $terms = mb_split("[[:space:]]", $string);
+        $stem_obj = self::getStemmer($lang);
+        $stems = array();
+        if($stem_obj != NULL) {
+            foreach($terms as $term) {
+                $pre_stem = mb_strtolower($term);
+                $stems[] = $stem_obj->stem($pre_stem);
+            }
+        } else {
+            foreach($terms as $term) {
+                $stems[] = mb_strtolower($term);
+            }
+        }
+
+        return $stems;
+    }
+
+    /**
+     * Loads and instantiates a stemmer object for a language if exists
+     *
+     * @param string $lang IANA tag to look up stemmer under
+     * @return object stemmer object
+     */
+    static function getStemmer($lang)
+    {
+        mb_regex_encoding('UTF-8');
+        mb_internal_encoding("UTF-8");
+        $lower_lang = strtolower($lang); //try to avoid case sensitivity issues
+        $lang_parts = explode("-", $lang);
+        if(isset($lang_parts[1])) {
+            $stem_class_name = ucfirst($lang_parts[0]).ucfirst($lang_parts[1]) .
+                "Stemmer";
+            if(!class_exists($stem_class_name)) {
+                $stem_class_name = ucfirst($lang_parts[0])."Stemmer";
+            }
+        } else {
+            $stem_class_name = ucfirst($lang)."Stemmer";
+        }
+        if(class_exists($stem_class_name)) {
+            $stem_obj = new $stem_class_name(); //for php 5.2 compatibility
+        } else {
+            $stem_obj = NULL;
+        }
+        return $stem_obj;
+    }
+
+    /**
+     *  Scores documents according to the lack or nonlack of sexually explicit
+     *  terms. Tries to work for several languages.
+     *
+     *  @param array $word_lists word => pos_list tuples
+     *  @param int $len length of text being examined in characters
+     *  @return int $score of how explicit document is
+     */
+    static function computeSafeSearchScore(&$word_lists, $len)
+    {
+        static $unsafe_phrase = "
+XXX sex slut nymphomaniac MILF lolita lesbian sadomasochism
+bondage fisting erotic vagina Tribadism penis facial hermaphrodite
+transsexual tranny bestiality snuff boob fondle tit
+blowjob lap cock dick hardcore pr0n fuck pussy penetration ass
+cunt bisexual prostitution screw ass masturbation clitoris clit suck whore bitch
+bellaco cachar chingar shimar chinquechar chichar clavar coger culear hundir
+joder mámalo singar cojon carajo caray bicho concha chucha chocha
+chuchamadre coño panocha almeja culo fundillo fundío puta puto teta
+connorito cul pute putain sexe pénis vulve foutre baiser sein nicher nichons
+puta sapatão foder ferro punheta vadia buceta bucetinha bunda caralho
+mentula cunnus verpa sōpiō pipinna cōleī cunnilingus futuō copulate cēveō crīsō
+scortor meretrīx futatrix minchia coglione cornuto culo inocchio frocio puttana
+vaffanculo fok hoer kut lul やりまん 打っ掛け  二形 ふたなりゴックン ゴックン
+ショタコン 全裸 受け 裏本 пизда́ хуй еба́ть блядь елда́ гондо́н хер манда́ му́ди мудя
+пидора́с залу́па жо́па за́дница буфер
+雞巴 鷄巴 雞雞 鷄鷄 阴茎 陰莖 胯下物
+屌 吊 小鳥 龟头 龜頭 屄 鸡白 雞白 傻屄 老二 那话儿 那話兒 屄 鸡白 雞白 阴道 陰道
+阴户 陰戶 大姨妈 淫蟲 老嫖 妓女 臭婊子 卖豆腐 賣豆腐 咪咪 大豆腐 爆乳 肏操
+炒饭 炒飯 cặc lồn kaltak orospu siktir sıçmak amcık";
+        static $unsafe_terms = array();
+
+        if(count($word_lists) == 0) {
+            return 0;
+        }
+
+        if($unsafe_terms == array()) {
+            $unsafe_lists = PhraseParser::extractPhrasesInLists($unsafe_phrase,
+                "en-US", true);
+            $unsafe_terms = array_keys($unsafe_lists);
+        }
+
+        $num_unsafe_terms = 0;
+        $unsafe_count = 0;
+        $words = array_keys($word_lists);
+
+        $unsafe_found = array_intersect($words, $unsafe_terms);
+
+        foreach($unsafe_found as $term) {
+            $count = count($word_lists[$term]);
+            if($count > 0 ) {
+                $unsafe_count += $count;
+                $num_unsafe_terms++;
+            }
+        }
+
+        $score = $num_unsafe_terms * $unsafe_count/($len + 1);
+        return $score;
+    }
 }
diff --git a/lib/processors/epub_processor.php b/lib/processors/epub_processor.php
index 0e8522017..e76db492f 100644
--- a/lib/processors/epub_processor.php
+++ b/lib/processors/epub_processor.php
@@ -51,18 +51,14 @@ require_once BASE_DIR."/lib/url_parser.php";

 /**
  *  The maximum length of description
- *
- *  @const integer MAX_DESCRIPTION_LEN
-*/
+ */
 const MAX_DESCRIPTION_LEN = 2000;

 /**
  * The constant represents the number of
  * child levels at which the data is present in
  * the content.opf file.
- *
- *  @const integer MAX_DOM_LEVEL
-*/
+ */
 const MAX_DOM_LEVEL = 15;

  /**
diff --git a/lib/processors/robot_processor.php b/lib/processors/robot_processor.php
index b7847e36a..f44079010 100644
--- a/lib/processors/robot_processor.php
+++ b/lib/processors/robot_processor.php
@@ -130,7 +130,7 @@ class RobotProcessor extends PageProcessor

                 case "sitemap":
                     $tmp_url = UrlParser::canonicalLink($value, $host_url);
-                    if(!UrlParser::checkRecursiveUrl($tmp_url)
+                    if(!UrlParser::checkRecursiveUrl($tmp_url)
                         && strlen($tmp_url) < MAX_URL_LENGTH) {
                         $summary[self::LINKS][] = $tmp_url;
                     }
@@ -140,7 +140,7 @@ class RobotProcessor extends PageProcessor
                     if($add_rule_state) {
                         $rule_added_flag = true;
                         $summary[self::ROBOT_PATHS][self::ALLOWED_SITES][] =
-                            urldecode($value);
+                            $this->makeCanonicalRobotPath($value);
                     }
                 break;

@@ -148,7 +148,7 @@ class RobotProcessor extends PageProcessor
                     if($add_rule_state) {
                         $rule_added_flag = true;
                         $summary[self::ROBOT_PATHS][self::DISALLOWED_SITES][] =
-                            urldecode($value);
+                            $this->makeCanonicalRobotPath($value);
                     }
                 break;

@@ -175,5 +175,22 @@ class RobotProcessor extends PageProcessor

         return $summary;
     }
+
+    /**
+     * For robot paths
+     *     foo
+     * is treated the same as
+     *     /foo
+     * Path might contain urlencoded characters. These are all decoded
+     * except for %2F which corresponds to a / (this is as per
+     * http://www.robotstxt.org/norobots-rfc.txt)
+     */
+    function makeCanonicalRobotPath($path)
+    {
+        if($path[0] != "/") {
+            $path = "/$path";
+        }
+        return urldecode(preg_replace("/\%2F/i", "%252F", $path));
+    }
 }
 ?>
diff --git a/lib/processors/sitemap_processor.php b/lib/processors/sitemap_processor.php
index 98c4be944..21545ab13 100644
--- a/lib/processors/sitemap_processor.php
+++ b/lib/processors/sitemap_processor.php
@@ -136,7 +136,7 @@ class SitemapProcessor extends TextProcessor

         $i = 0;
         foreach($paths as $path) {
-            $nodes = $xpath->evaluate($path);
+            $nodes = @$xpath->evaluate($path);
             foreach($nodes as $node) {
                 $url = UrlParser::canonicalLink(
                     $node->textContent, $site);
diff --git a/lib/processors/text_processor.php b/lib/processors/text_processor.php
index 397cf6a11..43410841e 100755
--- a/lib/processors/text_processor.php
+++ b/lib/processors/text_processor.php
@@ -172,7 +172,7 @@ class TextProcessor extends PageProcessor
     static function extractHttpHttpsUrls($page)
     {
         $pattern =
-            '@((http|https)://([^ \t\r\n\v\f\'\"\;\,\<\>\[\]\{\}\(\)])*)@i';
+            '@((http|https)://([^ \t\r\n\v\f\'\"\;\,<>\{\}])*)@i';
         $sites = array();
         preg_match_all($pattern, $page, $matches);
         $i = 0;
diff --git a/lib/trie.php b/lib/trie.php
new file mode 100644
index 000000000..78ba6d9e2
--- /dev/null
+++ b/lib/trie.php
@@ -0,0 +1,177 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * @author Sandhya Vissapragada, Chris Pollett (separated out this
+ *      code into a separate file and cleaned up)
+ * @package seek_quarry
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2012
+ * @filesource
+ */
+
+/**
+ * Implements a trie data structure which can be used to store terms read
+ * from a dictionary in a succinct way
+ *
+ * @author Sandhya Vissapragada, Chris Pollett (rewrite +
+ *      documentation, multi-byte support)
+ *
+ * @package seek_quarry
+ * @subpackage library
+ */
+class Trie
+{
+    /**
+     * A nested array used to represent the trie
+     * @var array
+     */
+    var $trie_array;
+    /**
+     * The marker used to represent the end of an entry in a trie
+     * @var string
+     */
+    var $end_marker;
+
+    /**
+     * Creates and returnes an empty trie. Sets the end of term character
+     *
+     * @param string $end_marker end of term marker
+     */
+    function __construct($end_marker = " ")
+    {
+        $this->trie_array = array();
+        $this->end_marker = $end_marker;
+    }
+
+    /**
+     * Adds a term to the Trie
+     *
+     * @param string $term the term to be inserted
+     * @return array $trie_array benath last letter of term inserted
+     */
+    function add($term)
+    {
+        $trie_array = & $this->trie_array;
+        for($i = 0; $i < mb_strlen($term); $i++) {
+            $character = mb_substr($term, $i, 1);
+            // If letter doesnt exist then create one by
+            // assigning new array
+            $enc_char = urlencode($character);
+            if(!isset($trie_array[$enc_char])) {
+                $trie_array[$enc_char] = array();
+            }
+            $trie_array = & $trie_array[$enc_char];
+        }
+        // Set end of term marker
+        $trie_array[$this->end_marker] = $this->end_marker;
+        return $trie_array;
+    }
+
+    /**
+     * Returns the sub trie_array under $term in
+     * $this->trie_array. If $term does not exist in $trie->trie_array
+     * returns false
+     *
+     * @param string $term term to look up
+     * @return array $trie_array subtrie under term
+     */
+    function exists($term)
+    {
+        $trie_array = & $this->trie_array;
+        $len = mb_strlen($term);
+        for($i = 0; $i < $len; $i++) {
+            if($trie_array == null){
+                return false;
+            }
+            if ($trie_array != $this->end_marker) {
+                $character = mb_substr($term, $i, 1);
+                $enc_char = urlencode($character);
+                if(!isset($trie_array[$enc_char])) {
+                    return false;
+                }
+                if($trie_array[$enc_char] != $this->end_marker) {
+                    $trie_array = & $trie_array[$enc_char];
+                }
+            }
+            else {
+                return false;
+            }
+        }
+        return $trie_array;
+    }
+
+    /**
+     * Returns all the terms in the trie beneath the provided term prefix
+     *
+     * @param string $prefix of term to look up
+     * @return array $terms under $prefix
+     */
+    function getValues($prefix, $max_results)
+    {
+        $trie_array = $this->exists($prefix);
+        if(!$trie_array) return false;
+
+        return $this->getValuesTrieArray($trie_array, $prefix, $max_results);
+    }
+
+    /**
+     * Computes the suffixes $count,...$max_results-$count in the trie_array
+     * beneath the provided $find_more is true. Prepends $prefix to each
+     * and returns the array of the result.
+     *
+     * @param array $trie_array a nested array representing a trie to look
+     *      up suffixes in
+     * @param string $prefix to prepend to each found suffix
+     * @param int $max_results maximum number of strings to return
+     * @param int $count which suffix in trie_array to start with
+     * @param bool $find_more whether to try to look up or not (stops recursion)
+     * @return array $terms a list of ($prefix.suffix1, $prefix, $suffix2,...)
+     */
+    private function getValuesTrieArray($trie_array, $prefix, $max_results,
+        &$count = 0, &$find_more = true)
+    {
+        $end_marker = $this->end_marker;
+        $terms = array();
+        if ($trie_array != NULL && $find_more) {
+            foreach ($trie_array as $character => $subtrie) {
+                if ($character != $end_marker) {
+                    $new_terms =
+                        $this->getValuesTrieArray($subtrie,
+                            $prefix . urldecode($character),
+                            $max_results, $count, $find_more);
+                    $terms = array_merge($terms, $new_terms);
+                } else {
+                    $count++;
+                    if($count > $max_results) {
+                        $find_more = false;
+                    }
+                    $terms[] = $prefix;
+                }
+            }
+        }
+        return $terms;
+    }
+}
+?>
diff --git a/lib/upgrade_functions.php b/lib/upgrade_functions.php
index 1d31f4c66..749abe259 100644
--- a/lib/upgrade_functions.php
+++ b/lib/upgrade_functions.php
@@ -40,9 +40,9 @@
 function upgradeLocaleCheck()
 {
     global $locale_tag;
-    $config_name = LOCALE_DIR."/$locale_tag/configure.ini";
+    $config_name = LOCALE_DIR."/$locale_tag/";
     $fallback_config_name =
-        FALLBACK_LOCALE_DIR."/$locale_tag/configure.ini";
+        FALLBACK_LOCALE_DIR."/$locale_tag/";
     if(filemtime($fallback_config_name) > filemtime($config_name)) {
         return "locale";
     }
@@ -74,7 +74,7 @@ function upgradeDatabaseWorkDirectoryCheck()
     $result = @$model->db->execute($sql);
     if($result !== false) {
         $row = $model->db->fetchArray($result);
-        if($row['ID'] == 5) {
+        if($row['ID'] == 7) {
             return false;
         }
     }
@@ -88,7 +88,7 @@ function upgradeDatabaseWorkDirectoryCheck()
  */
 function upgradeDatabaseWorkDirectory()
 {
-    $versions = array(0, 1, 2, 3, 4, 5);
+    $versions = array(0, 1, 2, 3, 4, 5, 6, 7);
     $model = new Model();
     $model->db->selectDB(DB_NAME);
     $sql = "SELECT ID FROM VERSION";
@@ -253,4 +253,35 @@ function upgradeDatabaseVersion5(&$db)
     }
     $db->setWorldPermissionsRecursive($static_page_path);
 }
+
+/**
+ * Upgrades a Version 5 version of the Yioop! database to a Version 6 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion6(&$db)
+{
+    $db->execute("DELETE FROM VERSION WHERE ID=5");
+    $db->execute("INSERT INTO VERSION VALUES (6)");
+
+    if(!file_exists(PREP_DIR)) {
+        mkdir(PREP_DIR);
+    }
+    $db->setWorldPermissionsRecursive(PREP_DIR);
+}
+
+function upgradeDatabaseVersion7(&$db)
+{
+    $db->execute("DELETE FROM VERSION WHERE ID=6");
+    $db->execute("INSERT INTO VERSION VALUES (7)");
+    $db->execute("DELETE FROM ACTIVITY WHERE ACTIVITY_ID=7");
+    $db->execute("INSERT INTO ACTIVITY VALUES (7, 7, 'resultsEditor')");
+    $db->execute("DELETE FROM TRANSLATION WHERE TRANSLATION_ID=7");
+    $db->execute("DELETE FROM TRANSLATION_LOCALE WHERE TRANSLATION_ID=7");
+    $db->execute(
+        "INSERT INTO TRANSLATION VALUES (7,'db_activity_results_editor')");
+    $db->execute(
+        "INSERT INTO TRANSLATION_LOCALE VALUES (7, 1, 'Results Editor')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (7, 5,
+        'Éditeur de résultats')");
+}
 ?>
diff --git a/lib/url_parser.php b/lib/url_parser.php
index 3e3c55064..b74903455 100755
--- a/lib/url_parser.php
+++ b/lib/url_parser.php
@@ -328,25 +328,31 @@ class UrlParser
             $rlen = strlen($robot_path);
             if($rlen == 0) continue;
             $end_match = false;
-            if($robot_path[$rlen - 1] == "$"){
-                $end_match = true;
-                $path_parts = explode("*", substr($robot_path, 0, $rlen - 1));
-            } else {
-                $path_parts = explode("*", $robot_path);
-            }
-            $offset = 0;
+            $end = ($robot_path[$rlen - 1] == "$") ? 1 : 0;
+            $path_string = substr($robot_path, 0, $rlen - $end);
+            $path_parts = explode("*", $path_string);
+            $offset = -1;
+            $old_part_len = 0;
             $is_match = true;
             foreach($path_parts as $part) {
-                if($part == "") continue;
+                $offset += 1 + $old_part_len;
+                $old_part_len = strlen($part);
+                if($part == "") {
+                    continue;
+                }
+                else if($offset >= $len) {
+                    $is_match = false;
+                    break;
+                }
                 $new_offset = stripos($path, $part, $offset);
-                if($new_offset === false) {
+                if($new_offset === false ||($offset == 0 && $new_offset !=0)) {
                     $is_match = false;
                     break;
                 }
                 $offset = $new_offset;
             }
             if($is_match) {
-                if(!$end_match || strlen($part) + $offset == $len) {
+                if($end == 0 || strlen($part) + $offset == $len) {
                     $is_member = true;
                 }
             }
@@ -695,6 +701,43 @@ class UrlParser
         return false;
     }

+    /**
+     * Checks if a URL corresponds to a known playback page of a video
+     * sharing site
+     *
+     * @param string $url the url to check
+     * @return bool whether or not corresponds to video playback page of a known
+     *      video site
+     */
+    static function isVideoUrl(&$url)
+    {
+        static $video_prefixes = array("http://www.youtube.com/watch?v=",
+            "http://www.metacafe.com/watch/",
+            "http://screen.yahoo.com/",
+            "http://player.vimeo.com/video/",
+            "http://archive.org/movies/thumbnails.php?identifier=",
+            "http://www.dailymotion.com/video/",
+            "http://v.youku.com/v_playlist/",
+            "http://www.break.com/index/");
+        static $patterns = array();
+
+        if(strlen($url) <= 0 ) {
+            return false;
+        }
+        if($patterns == array()) {
+            foreach($video_prefixes as $prefix) {
+                $quoted = preg_quote($prefix, "/");
+                $patterns[] = "/$quoted/";
+            }
+        }
+
+        foreach($patterns as $pattern) {
+            if(preg_match($pattern, $url) > 0) {
+                return true;
+            }
+        }
+        return false;
+    }
 }

 ?>
diff --git a/lib/utility.php b/lib/utility.php
index cfb86a3d9..b1c24e8af 100755
--- a/lib/utility.php
+++ b/lib/utility.php
@@ -291,6 +291,7 @@ function unpackListModified9($int_string)
  */
 function unpackInt($str)
 {
+    if(!is_string($str)) return false;
     $tmp = unpack("N", $str);
     return $tmp[1];
 }
@@ -314,6 +315,7 @@ function packInt($my_int)
  */
 function unpackFloat($str)
 {
+    if(!is_string($str)) return false;
     $tmp = unpack("f", $str);
     return $tmp[1];
 }
@@ -487,7 +489,8 @@ function unbase64Hash($base64)
  */
 function webencode($str)
 {
-    $str = str_replace("/", "_", base64_encode($str));
+    $str = base64_encode($str);
+    $str = str_replace("/", "_", $str);
     $str = str_replace("+", ".", $str);
     $str = str_replace("=", "~", $str);
     return $str;
@@ -503,7 +506,8 @@ function webdecode($str)
 {
     $str = str_replace("_", "/", $str);
     $str = str_replace(".", "+", $str);
-    return base64_decode(str_replace("~", "=", $str));
+    $str = str_replace("~", "=", $str);
+    return base64_decode($str);
 }

 /**
diff --git a/lib/web_archive_bundle.php b/lib/web_archive_bundle.php
index 9cadca1a5..794dd2d1b 100755
--- a/lib/web_archive_bundle.php
+++ b/lib/web_archive_bundle.php
@@ -243,6 +243,9 @@ class WebArchiveBundle
      */
     function getPartition($index, $fast_construct = true)
     {
+        if(!is_int($index)) {
+            $index = 0;
+        }
         if(!isset($this->partition[$index])) {
             //this might not have been open yet
             $create_flag = false;
@@ -257,7 +260,7 @@ class WebArchiveBundle
             $this->partition[$index] =
                 new WebArchive($archive_name,
                     new $compressor(), $fast_construct);
-            if($create_flag) {
+            if($create_flag && file_exists($archive_name)) {
                 chmod($archive_name, 0777);
             }
         }
diff --git a/lib/web_queue_bundle.php b/lib/web_queue_bundle.php
index c7b812f97..ea90f45d3 100755
--- a/lib/web_queue_bundle.php
+++ b/lib/web_queue_bundle.php
@@ -316,7 +316,7 @@ class WebQueueBundle implements Notifier
                 HashTable::load($dir_name."/robot.dat");
         } else {
             $this->robot_table =  new HashTable($dir_name.
-                "/robot.dat", 8*$num_urls_ram,
+                "/robot.dat", 16*$num_urls_ram,
                  self::HASH_KEY_SIZE, self::INT_SIZE);
         }

@@ -638,13 +638,24 @@ class WebQueueBundle implements Notifier
      */
     function checkRobotOkay($url)
     {
+        // local cache of recent robot.txt stuff
+        static $robot_cache = array();
+        $cache_size = 2000;
         $host = UrlParser::getHost($url);
         $path = UrlParser::getPath($url);
         $path = urldecode($path);
         $key = crawlHash($host, true);
-        $data = $this->robot_table->lookup($key);
-        $offset = unpackInt($data);
-        $robot_object = $this->robot_archive->getObjects($offset, 1);
+        if(isset($robot_cache[$key])) {
+            $robot_object = $robot_cache[$key];
+        } else {
+            $data = $this->robot_table->lookup($key);
+            $offset = unpackInt($data);
+            $robot_object = $this->robot_archive->getObjects($offset, 1);
+            $robot_cache[$key] = $robot_object;
+            if(count($robot_cache) > $cache_size) {
+                array_shift($robot_cache);
+            }
+        }
         $robot_paths = (isset($robot_object[0][1])) ? $robot_object[0][1]
             : array(); //these should have been urldecoded in RobotProcessor
         $robots_okay = true;
diff --git a/locale/ar/configure.ini b/locale/ar/configure.ini
index 2c697bf42..9b78ace27 100755
--- a/locale/ar/configure.ini
+++ b/locale/ar/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = ""
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = ""
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = ""
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = ""
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "بحث"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/ar/resources/tokenizer.php b/locale/ar/resources/tokenizer.php
new file mode 100755
index 000000000..1f7aa2fb7
--- /dev/null
+++ b/locale/ar/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Arabic specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['ar'] = 5;
+?>
diff --git a/locale/de/configure.ini b/locale/de/configure.ini
index 8ab1f9478..e1bdeb82f 100755
--- a/locale/de/configure.ini
+++ b/locale/de/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = ""
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = ""
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = ""
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = ""
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "Suche"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/de/resources/suggest_trie.txt.gz b/locale/de/resources/suggest_trie.txt.gz
new file mode 100644
index 000000000..9d5b6c71e
Binary files /dev/null and b/locale/de/resources/suggest_trie.txt.gz differ
diff --git a/locale/de/resources/tokenizer.php b/locale/de/resources/tokenizer.php
new file mode 100755
index 000000000..014496d51
--- /dev/null
+++ b/locale/de/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * German specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['de'] = 5;
+?>
diff --git a/locale/en-US/configure.ini b/locale/en-US/configure.ini
index a5e07d77c..f3f9e4925 100755
--- a/locale/en-US/configure.ini
+++ b/locale/en-US/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = "Login Successful!!"
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = "Username or Password Incorrect!"
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = "Login to continue configuration (default: u=root, p=)"
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = "Status updates have stopped."
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = "Typed passwords do not match."
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = "Current password incorrect."
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = "Password change successful!!"
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = "Select Username"
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = "Select Role"
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = "Typed passwords do not match."
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = "Cannot Create User As Username Exists"
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = "User Created"
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = "Username Does Not Exist"
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = "User Deleted"
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = "Username Does Not Exist"
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = "Role Name Does not Exist"
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = "Role Name Added"
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = "Username Does Not Exist"
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = "Role Name Does not Exist"
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = "Role Name Deleted"
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = "Select Role"
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = "Select Activity"
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = "Role Name Exists"
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = "Role Name Added"
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = "Role Name Does not Exist"
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = "Role Name Deleted"
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = "Role Name Does not Exist"
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = "Activity Name Does not Exist"
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = "Activity Added"
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = "Role Name Does not Exist"
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = "Activity Name Does not Exist"
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = "Activity Deleted"
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = "Starting New Crawl!"
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = "No Description for Crawl"
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = "Stopping crawl. . .This will take a moment to refresh."
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = "Resuming crawl. . .This will take a moment to refresh."
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = "Deleting Crawl. . .This will take a moment to refresh."
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = "Delete Crawl Failed!!"
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = "Setting Crawl To Use as Index"
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = "Use options below"
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = "Use Yioop! defaults"
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = "Use options below"
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = "Previous Crawl:"
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = "Breadth First"
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = "Page Importance"
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = "Urls Injected!"
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = "Updating Seed Site Info!"
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = "Select Crawl"
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = "Select Crawl"
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = "Unnamed Crawl"
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = "Crawl Mix Created!"
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = "Setting Crawl To Use as Index"
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = "Mix to Delete Does not Exist!"
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = "Crawl Mix Deleted!"
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = "Add Crawls"
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = "Number of Results"
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = "Delete Group"
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = "Weight"
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = "Name"
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = "Keywords"
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = "Actions"
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = "Add Query"
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = "Delete"
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = "Crawl Mix Changes Saved!"
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = "Never"
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = "1 days"
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = "2 days"
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = "3 days"
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = "7 days"
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = "14 days"
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = "Filtered Sites Updated!"
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = "Filter Pages Updated!"
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = "Select a Previously Edited URL"
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = "Result Page Update needs to Specify the URL!"
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = "Result Page Updated!"
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = "Page Loaded!"
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = "Select Machine"
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = "Machine Added!"
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = "Machine Name Already Exists; Please Delete First!"
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = "Missing Fields From Machine Form!"
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = "Machine Name does not Exists!"
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = "Machine in use. Please stop the service running on it!"
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = "Machine Deleted!"
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = "No Log File Found."
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = "Machine&#039;s Servers Updated!"
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = "Unable to Perform Action!"
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = "Select Locale"
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = "Locale Added!"
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = "Locale Does Not Exist!"
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = "Locale Deleted"
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = "Select a page"
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = "Static Page Updated!"
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = "Locale Strings Updated!"
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = "PHP Version 5.3 or Newer"
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = "configs/config.php not web server writable."
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = "Work directory needs to be writable by web server. "
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = "pnp.ini file variable post_max_size should be at least 32M"
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = "The following required items were missing: %s"
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = "The following optional items were missing: %s"
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = "Check Passed."
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = "Using configs/local_config.php so changing work directory above may not work."
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = "Must use an Absolute path for Work Directory"
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = "Work Directory Set! You may need to re-login!"
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = "Please Name Your robot"
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = "Working Directory and Profile Created!"
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = "Unable to Update config.php File!"
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = "Unable to Create Profile!"
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = "Work Directory is Invalid! Cannot Create Profile!"
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = "Work Directory is Invalid! Cannot Create Profile!"
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = "Problem Updating Database!"
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = "Profile Updated!"
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = "There was a Problem Updating Profile!"
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = "Please Describe Your Robot"
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = "Logout Successful!!"
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = "Index not found exiting..."
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = "Using Crawl Mix: %s"
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = "Using Index: %s -- Size: %s pages/%s urls"
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = "No Search Index Set For Use!"
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = "No Search Index Set For Use!"
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = "Extracted Title"
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = "Extracted Description"
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = "Extracted Links"
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = "Extracted Allowed To Crawl Paths"
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = "Extracted Disallowed To Crawl Paths"
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = "YioopBot Crawl Delay"
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = "Yioop Cache Page... This page has been modified to add a robots directive,  make links absolute, add extracted summaries, and to highlight query terms."
+;
+; search_controller.php line: 945
 search_controller_cached_version = "This cached version of %s was obtained by the Yioop crawler on %s."
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = "Toggle Extracted Page Summaries"
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = "crawl mix"
 ; settings_controller.php line: 142
 settings_controller_settings_saved = "Settings Saved!"
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = "Index not found exiting..."
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = "Search Index"
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = "Delete"
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = "No Previous Crawls"
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = "Database User:"
 configure_element_databasepassword = "Database Password:"
 ;
 ; configure_element.php line: 189
-configure_element_search_results = "Search Auxiliary Links Displayed"
+configure_element_search_page = "Search Page Elements and Links"
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = "Word Suggest"
+;
+; configure_element.php line: 200
 configure_element_signin_link = "Signin"
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = "Cache"
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = "Similar"
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = "Inlinks"
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = "IP address"
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = "Name Server Set-up"
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = "Server Key:"
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = "Name Server URL:"
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = "Use Memcache:"
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = "Memcache Servers"
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = "Use Filecache:"
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = "Crawl Robot Set-up"
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = "Crawl Robot Name:"
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = "Robot Instance:"
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = "Robot Description"
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = "Submit"
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = "Link Weight:"
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = "Save"
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = "Filter Websites from Results"
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = "Edit Result Page"
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = "Edited Urls:"
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = "Sites to Filter"
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = "Select a previously edited summary"
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = "Save"
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = "Load"
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = "URL:"
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = "Title:"
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = "Description"
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = "Reset"
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = "Save Page"
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = "Filter Websites from Results"
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = "Sites to Filter"
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = "Save Filter"
 ;
 ; signin_element.php line: 63
 signin_element_settings = "Settings"
@@ -1086,13 +1128,13 @@ web_layout_description = "PHP Crawler and Search Engine Software"
 ; web_layout.php line: 81
 web_layout_description = "PHP Crawler and Search Engine Software"
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = "Query Statistics"
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = "Total Elapsed Time for Queries: %s seconds."
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = "Time: %s seconds."
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = "Did not have cache of requested item."
 ; nocache_view.php line: 67
 nocache_view_summary_contents = "Summary Data stored in Yioop "
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = "Yioop! PHP Search Engine"
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = "Enter the terms you would like to search the web for"
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = "Type what you are looking for"
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "Search"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = "Query Results:"
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = "Calculated in %s seconds."
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = "Showing results %s - %s of %s"
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = "Rank: %s "
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = "Rel: %s "
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = "Prox: %s"
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = "Score %s"
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = "Cached"
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = "View&nbsp;as&nbsp;text"
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = "Similar"
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = "Inlinks"
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = "More Statistics"
 ;
 ; settings_view.php line: 76
diff --git a/locale/en-US/pages/409.thtml b/locale/en-US/pages/409.thtml
new file mode 100755
index 000000000..f4322db0a
--- /dev/null
+++ b/locale/en-US/pages/409.thtml
@@ -0,0 +1,5 @@
+title=Conflict
+description=Your request would result in an edit conflict.
+END_HEAD_VARS
+<h2>Your request would result in an edit conflict, so will not be processed.
+</h2>
diff --git a/locale/en-US/pages/bot.thtml b/locale/en-US/pages/bot.thtml
index 388e861be..e69de29bb 100755
--- a/locale/en-US/pages/bot.thtml
+++ b/locale/en-US/pages/bot.thtml
@@ -1 +0,0 @@
-Please describe your before you crawl.
\ No newline at end of file
diff --git a/locale/en-US/resources/all_word_grams.ftr b/locale/en-US/resources/all_word_grams.ftr
new file mode 100644
index 000000000..e23e7990f
Binary files /dev/null and b/locale/en-US/resources/all_word_grams.ftr differ
diff --git a/locale/en-US/resources/suggest_trie.txt.gz b/locale/en-US/resources/suggest_trie.txt.gz
new file mode 100644
index 000000000..2acbc0384
Binary files /dev/null and b/locale/en-US/resources/suggest_trie.txt.gz differ
diff --git a/lib/stemmers/en_stemmer.php b/locale/en-US/resources/tokenizer.php
similarity index 98%
rename from lib/stemmers/en_stemmer.php
rename to locale/en-US/resources/tokenizer.php
index 9611c02c7..b1260b4f6 100755
--- a/lib/stemmers/en_stemmer.php
+++ b/locale/en-US/resources/tokenizer.php
@@ -22,7 +22,7 @@
  *
  *  @author Chris Pollett chris@pollett.org
  *  @package seek_quarry
- *  @subpackage library
+ *  @subpackage locale
  *  @license http://www.gnu.org/licenses/ GPL3
  *  @link http://www.seekquarry.com/
  *  @copyright 2009 - 2012
@@ -43,12 +43,13 @@ if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
  *
  * @author Chris Pollett
  * @package seek_quarry
- * @subpackage library
+ * @subpackage locale
  */

 class EnStemmer
 {

+    static $no_stem_list = array("Titanic");
     /**
      * storage used in computing the stem
      * @var string
@@ -77,6 +78,10 @@ class EnStemmer
      */
     static function stem($word)
     {
+        if(in_array($word, self::$no_stem_list)) {
+            return $word;
+        }
+
         self::$buffer = $word;

         self::$k = strlen($word) - 1;
diff --git a/locale/en-US/statistics.txt b/locale/en-US/statistics.txt
index b6bef56f0..5a165df53 100755
--- a/locale/en-US/statistics.txt
+++ b/locale/en-US/statistics.txt
@@ -1 +1 @@
-d:99;
\ No newline at end of file
+d:100;
\ No newline at end of file
diff --git a/locale/es/configure.ini b/locale/es/configure.ini
index fb15684df..0c823e7d2 100755
--- a/locale/es/configure.ini
+++ b/locale/es/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = ""
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = ""
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = ""
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = ""
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "Buscar"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/es/resources/suggest_trie.txt.gz b/locale/es/resources/suggest_trie.txt.gz
new file mode 100644
index 000000000..237b7f3b1
Binary files /dev/null and b/locale/es/resources/suggest_trie.txt.gz differ
diff --git a/locale/es/resources/tokenizer.php b/locale/es/resources/tokenizer.php
new file mode 100755
index 000000000..d7d23bd25
--- /dev/null
+++ b/locale/es/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Spanish specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['es'] = 5;
+?>
diff --git a/locale/fr-FR/configure.ini b/locale/fr-FR/configure.ini
index 804bc7c9a..7f67658e6 100755
--- a/locale/fr-FR/configure.ini
+++ b/locale/fr-FR/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = ""
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = ""
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = ""
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = ""
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = "Param&egrave;tres de recherche"
@@ -1086,13 +1128,13 @@ web_layout_description = "Trouvez ce que vous cherchez"
 ; web_layout.php line: 81
 web_layout_description = "Trouvez ce que vous cherchez"
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = "Moteur de recherche PHP -Yioop!"
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = "Trouvez ce que vous cherchez"
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "Rechercher"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = "R&eacute;sultats:"
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = "Trouver en %s secondes."
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = "Affichage de %s - %s sur %s r&eacute;sultats"
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = "Rang: %s"
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = "Pertinence: %s"
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = "Proximit&eacute;: %s"
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = "Total: %s"
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = "En&nbsp;Cache"
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = "Version&nbsp;texte"
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = "Pages&nbsp;similaires"
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = "Liens retour"
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/fr-FR/resources/suggest_trie.txt.gz b/locale/fr-FR/resources/suggest_trie.txt.gz
new file mode 100644
index 000000000..101096234
Binary files /dev/null and b/locale/fr-FR/resources/suggest_trie.txt.gz differ
diff --git a/locale/fr-FR/resources/tokenizer.php b/locale/fr-FR/resources/tokenizer.php
new file mode 100755
index 000000000..445c19ab5
--- /dev/null
+++ b/locale/fr-FR/resources/tokenizer.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * French specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['fr'] = 5;
+$CHARGRAMS['fr-FR'] = 5;
+?>
diff --git a/locale/he/configure.ini b/locale/he/configure.ini
index da67d73c7..9788e67be 100755
--- a/locale/he/configure.ini
+++ b/locale/he/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = "סיסמא / שם משתמש אינו נכון"
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = "התחבר על מנת להמשך בתהליך"
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = "סיסמא  אינה נכונה"
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = "סיסמא אינה נכונה"
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = "סיסמא עודכנה בהצלחה"
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = "בחר שם משתמש"
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = "בחר תפקיד"
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = "סיסמא  אינה נכונה"
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = " שם משתמש קיים במערכת"
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = "שם שמשתמש אינו קיים"
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = "שם משתמש נמחק"
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = "שם שמשתמש אינו קיים"
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = "שם תפקיד אינו קיים"
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = "שם תפקיד נוצר"
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = "שם שמשתמש אינו קיים"
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = "שם תפקיד אינו קיים"
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = "שם תפקיד נמחק"
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = "בחר תפקיד"
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = "בחר פעילות"
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = "שם תפקיד קיים במערכת"
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = "שם תפקיד נוצר"
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = "שם תפקיד אינו קיים"
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = "שם תפקיד נמחק"
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = "שם תפקיד אינו קיים"
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = "שם פעילות אינו קיים במערכת"
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = "שם תפקיד אינו קיים"
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = "שם פעילות אינו קיים במערכת"
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = "פעילות נמחקה"
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = "השתמש באפשרויות הבאות"
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = " השתמש כבררת מחדל כמנוע חיפוש"
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = "השתמש באפשרויות הבאות"
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = "פרופייל עודכן"
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = "בעיה עם עדכון הפרופייל"
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = "התנתקות הצליחה"
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = "מחק"
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = "התחבר"
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = "שלח"
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "חפש"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/he/resources/tokenizer.php b/locale/he/resources/tokenizer.php
new file mode 100755
index 000000000..33a0647d9
--- /dev/null
+++ b/locale/he/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Hebrew specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['he'] = 5;
+?>
diff --git a/locale/he/statistics.txt b/locale/he/statistics.txt
index 09559c0dd..1bdc2c466 100755
--- a/locale/he/statistics.txt
+++ b/locale/he/statistics.txt
@@ -1 +1 @@
-d:11;
\ No newline at end of file
+d:10;
\ No newline at end of file
diff --git a/locale/hi/configure.ini b/locale/hi/configure.ini
index 06d74aedb..44b32aa00 100755
--- a/locale/hi/configure.ini
+++ b/locale/hi/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = "लॉग इन सफल"
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = "लॉग इन असफल"
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = "कॉन्फ़िगर करने के लिए लॉगिन करें"
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = "पासवर्ड एक समान नहीं"
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = "अमान्य पुराना पासवर्ड"
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = "उपयोगकर्ता नाम का चयन करें"
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = "भूमिका नाम का चयन करें"
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = "पासवर्ड एक समान नहीं"
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = "उपयोगकर्ता मौजूद है"
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = "भूमिका नाम का चयन करें"
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = "क्रॉल पुनः आरंभ करें"
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = "लॉग आउट सफल"
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = "क्रॉल जानकारी "
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = "सारांश डेटा"
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = "सेटिंग्स सहेज दी गई है"
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = "सेटिंग्स"
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = "यहाँ लिखें की आप क्या खोजना चाहते हैं!"
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "खोज"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/hi/resources/tokenizer.php b/locale/hi/resources/tokenizer.php
new file mode 100755
index 000000000..cf056b0a9
--- /dev/null
+++ b/locale/hi/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Hindi specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['hi'] = 5;
+?>
diff --git a/locale/hi/statistics.txt b/locale/hi/statistics.txt
index 25dc1f752..fe8cd74a8 100755
--- a/locale/hi/statistics.txt
+++ b/locale/hi/statistics.txt
@@ -1 +1 @@
-d:8;
\ No newline at end of file
+d:7;
\ No newline at end of file
diff --git a/locale/in-ID/configure.ini b/locale/in-ID/configure.ini
index 575353335..ec33a3fa4 100755
--- a/locale/in-ID/configure.ini
+++ b/locale/in-ID/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = "Login berhasil"
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = "Login tidak berhasil"
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = "Kata sandi tidak sesuai"
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = "Kata sandi yang lama salah"
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = "Ganti kata sandi"
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = "Pilih username"
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = "Pilih rolename"
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = "Kata sandi tidak sesuai"
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = "Username ditemukan"
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = "Username telah ditambah"
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = "Username tidak ditemukan"
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = "Username telah dihapus"
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = "Username tidak ditemukan"
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = "Rolename tidak ditemukan"
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = "Rolename telah ditambah"
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = "Username tidak ditemukan"
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = "Rolename tidak ditemukan"
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = "Rolename telah dihapus"
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = "Pilih rolename"
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = "Pilih name aktivitas"
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = "Rolename ditemukan"
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = "Rolename telah ditambah"
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = "Rolename tidak ditemukan"
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = "Rolename telah dihapus"
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = "Rolename tidak ditemukan"
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = "Nama aktivitas tidak ditemukan"
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = "Aktivitas telah ditambah"
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = "Rolename tidak ditemukan"
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = "Nama aktivitas tidak ditemukan"
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = "Aktivitas telah dihapus"
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = "Pilih name locale"
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = "Locale telah ditambah"
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = "Locale tidak ditemukan"
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = "Locale telah dihapus"
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = "Logout berhasil"
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "Cari"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = "Hasil"
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = "Urutan"
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/in-ID/resources/tokenizer.php b/locale/in-ID/resources/tokenizer.php
new file mode 100755
index 000000000..1f5300c03
--- /dev/null
+++ b/locale/in-ID/resources/tokenizer.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Indonesian specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['in'] = 5;
+$CHARGRAMS['in-ID'] = 5;
+?>
diff --git a/locale/in-ID/statistics.txt b/locale/in-ID/statistics.txt
index 68101b705..09559c0dd 100755
--- a/locale/in-ID/statistics.txt
+++ b/locale/in-ID/statistics.txt
@@ -1 +1 @@
-d:12;
\ No newline at end of file
+d:11;
\ No newline at end of file
diff --git a/locale/it/configure.ini b/locale/it/configure.ini
index 67cbddf16..b95abf028 100755
--- a/locale/it/configure.ini
+++ b/locale/it/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = ""
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = ""
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = ""
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = ""
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "Cerca"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/it/resources/suggest_trie.txt.gz b/locale/it/resources/suggest_trie.txt.gz
new file mode 100644
index 000000000..5b3d1b099
Binary files /dev/null and b/locale/it/resources/suggest_trie.txt.gz differ
diff --git a/locale/it/resources/tokenizer.php b/locale/it/resources/tokenizer.php
new file mode 100755
index 000000000..d5e4732e2
--- /dev/null
+++ b/locale/it/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Italian specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['it'] = 5;
+?>
diff --git a/locale/ja/configure.ini b/locale/ja/configure.ini
index c6093fc47..f84942f01 100755
--- a/locale/ja/configure.ini
+++ b/locale/ja/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = "ログイン成功"
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = "無効なユーザー名またはパスワード"
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = "パスワードを違います"
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = "無効な古いパスワード"
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = "パスワードの編集できました"
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = "選択ユーザー名"
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = "選択役割名"
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = "パスワードを違います"
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = "ユーザー名が存在します"
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = "ユーザー名が追加しました"
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = "ユーザー名は存在しません"
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = "ユーザー名を削除しました"
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = "ユーザー名は存在しません"
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = "役割は存在しません"
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = "役割が追加しました"
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = "ユーザー名は存在しません"
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = "役割は存在しません"
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = "役割を削除しました"
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = "選択役割名"
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = "選択アクティビティ名"
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = "役割が存在します"
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = "役割が追加しました"
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = "役割は存在しません"
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = "役割を削除しました"
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = "役割は存在しません"
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = "アクティビティ名は存在しません"
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = "アクティビティが追加しました"
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = "役割は存在しません"
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = "アクティビティ名は存在しません"
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = "アクティビティを削除しました"
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = "新しい検索を始まります"
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = "検索の説明ありません"
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = "検索を停止する。ちょっと待ってください。"
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = "検索を再会する。ちょっと待ってください。"
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = "検索を削除する。ちょっと待ってください。"
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = "検索削除を失敗しました"
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = "指数のための検索設定する。"
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = "幅優先"
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = "ページの重要性"
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = "シッド情報の更新"
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = "指数のための検索設定する。"
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = "選択ローケル"
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = "ローケルが追加しました"
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = "ローケルは存在しません"
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = "ローケルを削除しました"
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = "ローケルストリングを編集しました"
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = "作業ディレクトリの設定しました。もう一度ログインしてください。"
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = "ボット名を入力してください。"
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = "作業ディレクトリとプロフィールの作成しました。"
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = "config.phpファイルのできない。更新"
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = "プロフィールを作成できない。"
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = "無効な作業ディレクト。プロフィールを作成できない。"
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = "無効な作業ディレクト。プロフィールを作成できない。"
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = "ディータベースの更新ない"
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = "プロフィールの変更できました。"
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = "プロフィールの変更できない。"
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = "ロボットの説明してください。"
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = "ログアウト成功"
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = "%sのこのキャッシュされたバージョンは%sのウィオップから入手しました。"
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = "設定の保存しました"
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = "検索指数"
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = "削除"
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = "さっきの検索はありません"
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = "データベースユーザー"
 configure_element_databasepassword = "データベースパスワード"
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = "検索ロボット設定"
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = "ロボット名"
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = "ロボット説明"
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = "サブミット"
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = "設定"
@@ -1086,13 +1128,13 @@ web_layout_description = "ヘルプ 探している情報を見つける。"
 ; web_layout.php line: 81
 web_layout_description = "ヘルプ 探している情報を見つける。"
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = "キュエリの統計"
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = "経過時間の合計:%s分"
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = "キュエリ時間:%s分"
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = "アイテムのキャッシュはありません"
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = "探している情報を入力してください。"
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = "探している情報を入力してください。"
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "検索"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = "キュエリ結果:"
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = "%s分で計算しました。"
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = "結果表示%s ー %s の %s"
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = "ランク:%s"
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = "関連:%s"
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = "近さ: %s"
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = "スコア %s"
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = "キャッシューしました。"
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = "テクストビュー"
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = "同じビュー"
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/ja/resources/tokenizer.php b/locale/ja/resources/tokenizer.php
new file mode 100755
index 000000000..b4b449d85
--- /dev/null
+++ b/locale/ja/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Japanese specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['ja'] = 3;
+?>
diff --git a/locale/ja/statistics.txt b/locale/ja/statistics.txt
index 3bd9f6b04..81ea401f0 100755
--- a/locale/ja/statistics.txt
+++ b/locale/ja/statistics.txt
@@ -1 +1 @@
-d:45;
\ No newline at end of file
+d:44;
\ No newline at end of file
diff --git a/locale/kn/configure.ini b/locale/kn/configure.ini
index ef349160c..3437068f0 100755
--- a/locale/kn/configure.ini
+++ b/locale/kn/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = "ಒಳಪ್ರವೇಶಣೆ ಸಫಲ"
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = "ಒಳಪ್ರವೇಶಣೆ ವಿಫಲ, ಬಳಕೆದಾರನ ಹೆಸರು ಅಥವಾ ಪ್ರವೇಶ ಪದ ತಪ್ಪಾಗಿದೆ "
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = "ಸಂರಚನೆ ಮುಂದುವರೆಸಲು ಒಳಪ್ರವೇಶಿಸಿ"
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = "ಬರೆದ ಪ್ರವೇಶ ಪದಗಳು ಹೋಲಲಿಲ್ಲ "
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = "ಪ್ರಸ್ತುತ ಪ್ರವೇಶ ಪದ ತಪ್ಪಾಗಿದೆ"
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = "ಪ್ರವೇಶ ಪದ ಬದಲಣೆ ಸಫಲವಾಯಿತು"
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = "ಬಳಕೆದಾರನ ಹೆಸರನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = "ಬಳಕೆದಾರನ ಪಾತ್ರ ಆಯ್ಕೆ ಮಾಡಿ"
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = "ಬರೆದ ಪ್ರವೇಶ ಪದಗಳು ಹೋಲಲಿಲ್ಲ "
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = "ಈ ಬಳಕೆದಾರನ ಹೆಸರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇದೆ"
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = "ಬಳಕೆದಾರನ ಹೆಸರನ್ನು ಸೃಷ್ಟನೆ ಸಂಪೂರ್ಣವಾಯಿತು"
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = "ಈ ಬಳಕೆದಾರನ ಹೆಸರು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = "ಬಳಕೆದಾರನ ಹೆಸರನ್ನು ಅಳಿಸಲಾಯಿತು"
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = "ಈ ಬಳಕೆದಾರನ ಹೆಸರು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = "ಈ ಪಾತ್ರದ ಹೆಸರು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = "ಈ ಪಾತ್ರದ ಹೆಸರನ್ನು ಸೇರಿಸಲಾಗಿದೆ"
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = "ಈ ಬಳಕೆದಾರನ ಹೆಸರು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = "ಈ ಪಾತ್ರದ ಹೆಸರು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = "ಈ ಪಾತ್ರದ ಹೆಸರನ್ನು ಅಳಿಸಲಾಗಿದೆ"
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = "ಬಳಕೆದಾರನ ಪಾತ್ರ ಆಯ್ಕೆ ಮಾಡಿ"
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = "ಚಟುವಟಿಕೆ ಆಯ್ಕೆ ಮಾಡಿ"
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = "ಈ ಪಾತ್ರದ ಹೆಸರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇದೆ"
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = "ಈ ಪಾತ್ರದ ಹೆಸರನ್ನು ಸೇರಿಸಲಾಗಿದೆ"
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = "ಈ ಪಾತ್ರದ ಹೆಸರು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = "ಈ ಪಾತ್ರದ ಹೆಸರನ್ನು ಅಳಿಸಲಾಗಿದೆ"
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = "ಈ ಪಾತ್ರದ ಹೆಸರು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = "ಈ ಚಟುವಟಿಕೆಯ ಹೆಸರು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = "ಈ ಚಟುವಟಿಕೆಯನ್ನು ಸೇರಿಸಲಾಗಿದೆ"
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = "ಈ ಪಾತ್ರದ ಹೆಸರು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = "ಈ ಚಟುವಟಿಕೆಯ ಹೆಸರು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = "ಈ ಚಟುವಟಿಕೆಯನ್ನು ಅಳಿಸಲಾಗಿದೆ"
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = "ಹೊಸ ಕ್ರಾವ್ಲ್  ಪ್ರಾರಂಬಿಸುತಿದ್ದಿವಿ"
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = "ಕ್ರಾವ್ಲಿನ ವಿವರಣೆ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = "ಕ್ರಾವ್ಲನ್ನು ನಿಲ್ಲಿಸುತಿದ್ದಿವಿ...ಈ ತೆರೆ ಸ್ವಲ್ಪ ಕ್ಷಣಗಳ ನಂತರ ಮಾರ್ಪಡುವುದು "
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = "ಕ್ರಾವ್ಲನ್ನು ಮರುಚಾಲಿಸುತಿದ್ದಿ...ಈ ತೆರೆ ಸ್ವಲ್ಪ ಕ್ಷಣಗಳ ನಂತರ ಮಾರ್ಪಡುವುದು "
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = "ಕ್ರಾವ್ಲನ್ನು ಅಳಿಸುತಿದ್ದಿವಿ...ಈ ತೆರೆ ಸ್ವಲ್ಪ ಕ್ಷಣಗಳ ನಂತರ ಮಾರ್ಪಡುವುದು"
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = "ಕ್ರಾವ್ಲನ್ನು ಅಳಿಸಲು ವಿಫಲವಾಗಿದೆ!! "
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = "ಸೂಚಿಕೆಯಾಗಿ ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ"
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = "ಐಚ್ಛಿಕ ಆಯ್ಕೆ ಉಪಯೋಗಿಸಿ"
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = "ಯೂಪ್ ನ ಪೂರ್ವನಿಯೋಜಿತ ನಿಗದಿಗಳನ್ನು ಉಪಯೋಗಿಸಿ"
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = "ಐಚ್ಛಿಕ ಆಯ್ಕೆ ಉಪಯೋಗಿಸಿ"
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = "ಮೊದಲಿನ ಕ್ರಾವ್ಲ:"
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = "ಅಗಲ ಮೊದಲಾಗಿ"
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = "ಪುಟ ಪ್ರಾಮುಖ್ಯತೆ"
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = "ಮೂಲ ವೆಬ್ ಸೈಟಿನ ಮಾಹಿತಿಯನ್ನು ಪರಿಷ್ಕರಿಸಲಾಗುತ್ತಿದೆ"
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = "ಕ್ರಾವ್ಲನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = "ಕ್ರಾವ್ಲನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = "ಹೆಸರಿಡದ ಕ್ರಾವ್ಲ"
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = "ಕ್ರಾವ್ಲಗಳ ಮಿಶ್ರಣ ಸೃಜಿಸಲಾಯಿತು"
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = "ಸೂಚಿಕೆಯಾಗಿ ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ"
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = "ಅಳಿಸಬೇಕಾದ ಕ್ರಾವ್ಲ ಮಿಶ್ರಣ ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = "ಕ್ರಾವ್ಲ ಮಿಶ್ರಣ ಅಳಿಸಲಾಗಿದೆ"
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = "ಕ್ರಾವ್ಲಗಳನ್ನು ಸೇರಿಸಿ"
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = "ಫಲಿತಾಂಶಗಳ ಸಂಖ್ಯೆ"
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = "ಗುಂಪನ್ನು ಅಳಿಸು"
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = "ಗೌರವ"
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = "ಹೆಸರು"
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = "ಮುಖ್ಯ ಪದ"
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = "ಕ್ರಿಯೆಗಳು"
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = "ಪ್ರಶ್ನೆಯನ್ನು ಸೇರಿಸು"
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = "ಅಳಿಸು"
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = "ಕ್ರಾವ್ಲ್ ಮಿಶ್ರಣದಲ್ಲಿ ಬದಲಾವಣೆಯನ್ನು ಉಳಿಸು"
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = "ಸೋಸಿದ ವೆಬ್ ಸೈಟಗಳನ್ನು ಪರಿಷ್ಕರಿಸಲಾಯಿತು"
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = "ಪ್ರದೇಶದ ಶಿಷ್ಟತೆ ಆಯ್ಕೆ ಮಾಡಿ"
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = "ಪ್ರದೇಶದ ಶಿಷ್ಟತೆ ಸೇರಿಸಲಾಗಿದೆ"
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = "ಈ ಪ್ರದೇಶದ ಶಿಷ್ಟತೆ ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ"
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = "ಪ್ರದೇಶದ ಶಿಷ್ಟತೆ ಅಳಿಸಲಾಗಿದೆ "
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = "ಪ್ರದೇಶ ಶಿಷ್ಟತೆಯ ಅಕ್ಷರ ಸಮೂಹವನ್ನು ಪರಿಷ್ಕರಿಸಲಾಯಿತು"
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = "configs/config.php ವೆಬ್ ಸರ್ವರ್ ನಿಂದ ಬರೆಯಲು ಸಶಕ್ತವಲ್ಲ"
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = "ಕಾರ್ಯ ನಿರ್ದೇಶಿಕೆ ವೆಬ್ ಸರ್ವರ್ ನಿಂದ ಬರೆಯಲು ಸಶಕ್ತವಾಗಿರಬೇಕು"
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = "php.ini ಕಡಿತದ ಚರಾಂಶ post_max_size ಕನಿಷ್ಠ ಪಕ್ಷ ೧೬ ಎಂ.ಬಿ. ಇರಬೇಕು"
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = "ಬರುವ ಅವಶ್ಯಕವಸ್ತುಗಳು ತಪ್ಪಿಹೋಗಿದ್ದಾವೆ:"
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = "ಬರುವ ಕಡ್ಡಾಯವಲ್ಲದ ವಸ್ತುಗಳು ತಪ್ಪಿಹೋಗಿದ್ದಾವೆ:"
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = "ಪರಿಶೀಲನೆ ತೇರ್ಗಡೆಯಾಗಿದೆ"
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = "configs/local_config.php ಉಪಯೋಗದಲ್ಲಿದೆ, ಅದರಿಂದ ಮೇಲಿನ ಕಾರ್ಯ ನಿರ್ದೇಶಿಕೆಯನ್ನು ಬದಲಾವಣೆ ನಿಷ್ಕ್ರಿಯವಾಗಬಹುದು "
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = "ಕಾರ್ಯ ನಿರ್ದೇಶಿಕೆಯನ್ನು ನಿಗದಿಪಡಿಸಲಾಗಿದೆ!  ನೀವು ಮರು ಪ್ರವೇಶಿಸಬೇಕಾಗಬಹುದು"
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = "ಉಳಿಸು"
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = "ನಿಗದಿಗಳು"
@@ -1086,13 +1128,13 @@ web_layout_description = "ಪಿಹೆಚಪಿ ಕ್ರಾವ್ಲರ್ ಮ
 ; web_layout.php line: 81
 web_layout_description = "ಪಿಹೆಚಪಿ ಕ್ರಾವ್ಲರ್ ಮತ್ತು ಶೋಧನಾ ಯಂತ್ರದ ತಂತ್ರಾಂಶ "
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = "ಸಮಯ: %s ಸೆಕೆಂಡುಗಳು"
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = "ಯೂಪ್!, ಪಿಹೆಚಪಿ ಶೋಧನಾ ಯಂತ್ರ "
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = "ನೀವು ಶೋಧಿಸಬೇಕಾದ ಪದ ವನ್ನು ಇಲ್ಲಿ ಬರೆಯಿರಿ "
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = "ನಿಮ್ಮ ಪ್ರಶ್ನೆಯನ್ನು ಇಲ್ಲಿ ಬರೆಯಿರಿ "
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "ಹುಡುಕು"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = "ನಿಮ್ಮ ಪ್ರಶ್ನೆಯ ಉತ್ತರಗಳು:"
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = "ಲೆಕ್ಕಾಚಾರದ ಸಮಯ %s ಸೆಕೆಂಡು"
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = "ತೋರಿಸುತ್ತಿರುವ ಫಲಿತಾಂಶಗಳು %s - %s ಆಫ್ %s"
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = "ಸ್ಥಾನ: %s"
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = "ಪ್ರಾಸ್ತಾವಿಕ: %s"
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = "ಸಾನಿಧ್ಯ: %s"
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = "ಅಂಕ: %s "
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = "ಸಿದ್ಧ ಸ್ಮೃತಿಕೋಶದಿಂದ ನೋಡಿ"
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = "ಪಠ್ಯ ರೂಪದಲ್ಲಿ ನೋಡಿ"
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = "ಸಮಾನರೂಪದ"
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = "ಒಳ ಕೊಂಡಿ"
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/kn/resources/tokenizer.php b/locale/kn/resources/tokenizer.php
new file mode 100755
index 000000000..fcd382e65
--- /dev/null
+++ b/locale/kn/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Kanada specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['kn'] = 5;
+?>
diff --git a/locale/kn/statistics.txt b/locale/kn/statistics.txt
index 8698e9b2d..36ca4c26d 100755
--- a/locale/kn/statistics.txt
+++ b/locale/kn/statistics.txt
@@ -1 +1 @@
-d:27;
\ No newline at end of file
+d:25;
\ No newline at end of file
diff --git a/locale/ko/configure.ini b/locale/ko/configure.ini
index 1a0c8d7d6..b72f9d571 100755
--- a/locale/ko/configure.ini
+++ b/locale/ko/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = "로그인 성공!!!"
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = "로그인 실패!!!"
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = "관리 (default: u=root, p=)"
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = "비밀 번호가 일치하지 않습니다."
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = "아이디나 비밀번호가 부정확 합니다."
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = "비밀 번호를 성공적으로 변경하였습니다."
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = "아이디를 선택하여 지정해 주십시요."
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = "사용자 권한을 선택해 지정해 주십시요."
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = "비밀 번호가 일치하지 않습니다."
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = "동일 아이디가 존재하여 생성을 실패하였습니다."
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = "아이디를 성공적으로 생성하였습니다."
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = "아이디가 존재 하지 않습니다."
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = "사용자를 삭제했습니다."
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = "아이디가 존재 하지 않습니다."
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = "사용자 권한 이름이 존재하지 않습니다."
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = "사용자 권한 이름을 추가하였습니다."
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = "아이디가 존재 하지 않습니다."
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = "사용자 권한 이름이 존재하지 않습니다."
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = "사용자 권한이름을 삭제하였습니다."
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = "사용자 권한을 선택해 지정해 주십시요."
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = "엑티비티 이름을 선택해 주십시요."
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = "동일 권한 이름이 존재 합니다."
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = "사용자 권한 이름을 추가하였습니다."
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = "사용자 권한 이름이 존재하지 않습니다."
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = "사용자 권한이름을 삭제하였습니다."
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = "사용자 권한 이름이 존재하지 않습니다."
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = "엑티비티 이름이 존재하지 않습니다."
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = "엑티비티를 추가했습니다."
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = "사용자 권한 이름이 존재하지 않습니다."
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = "엑티비티 이름이 존재하지 않습니다."
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = "엑티비티를 삭제 했습니다."
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = "크롤 시작!!"
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = "크롤에 대한 설명이 존재 하지 않습니다."
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = "크롤을 중지합니다.  잠시만 기다려 주십시요."
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = "크롤을 다시 시작합니다. 잠시만 기다려 주십시요."
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = "크롤을 삭제합니다. 잠시만 기다려 주십시요."
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = "크롤 삭제 실패!!"
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = "크롤을 인덱스로써 사용하기 지정"
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = "너비 우선"
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = "페이지 중요성"
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = "씨드 사이트 업데이트"
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = "크롤을 인덱스로써 사용하기 지정"
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = "로케일을 선택하여 주십시요."
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = "로케일 추가!!"
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = "로케일이 존재하지 않습니다."
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = "로케일을 삭제 하였습니다."
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = "로케일 지정 문자열을 업데이트 하였습니다."
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = "작업 디렉토리가 지정 됐습니다. 다시 로그인이 필요할수 있습니다."
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = "로봇 이름을 정해 주십시요."
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = "작업 디렉토리와 프로필이 생성됐습니다."
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = "config.php 파일을  업데이트 실패했습니다."
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = "프로필을 생성할수 없습니다."
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = "작업 디렉토리가 올바르지 않습니다. 프로필을 생성할수 없습니다."
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = "작업 디렉토리가 올바르지 않습니다. 프로필을 생성할수 없습니다."
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = "데이터베이스를 업데이트하는데 문제가 발생했습니다."
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = "프로필을 업데이트 했습니다."
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = "프로필을 업데이트하는데 문제가 발생했습니다."
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = "당신의 로봇을 기술해 주십시요."
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = "로그 아웃 성공!!"
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = "현재 캐시 버젼 %s 은 Yioop 크롤 %s 에 의하여 얻어 졌습니다. "
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = "현재 세팅이 저장됐습니다."
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = "검색 인덱스"
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = "삭제"
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = "전 크롤들이 없습니다."
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = "데이터베이스 사용자:"
 configure_element_databasepassword = "데이터베이스 비밀번호:"
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = "크롤 로봇 설정"
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = "로봇 기술 "
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = "크롤 로봇 이름:"
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = "제출 "
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = "세팅"
@@ -1086,13 +1128,13 @@ web_layout_description = "찾고자 하는걸 도와드립니다."
 ; web_layout.php line: 81
 web_layout_description = "찾고자 하는걸 도와드립니다."
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = "퀘리 분석"
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = "퀘리: %s 초."
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = "시간: %s 초."
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = "요청하신 아이템의 캐시가 없었습니다."
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = "검색하고 싶은 단어들을 적어 주십시요."
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = "찾고자 하는걸 적어 주십시요."
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "검색"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = "퀘리 결과"
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = "%s 초 결과 완료"
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = "결과 %s - %s 의 %s"
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = "랭크: %s"
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = "관련성: %s "
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = "점수 %s"
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = "캐시 됀것"
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = "일반 텍스트로써 보기"
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = "유사성"
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = "인링크"
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/ko/resources/tokenizer.php b/locale/ko/resources/tokenizer.php
new file mode 100755
index 000000000..0140a2b9a
--- /dev/null
+++ b/locale/ko/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Korean specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['ko'] = 3;
+?>
diff --git a/locale/ko/statistics.txt b/locale/ko/statistics.txt
index 5f9a99dac..3bd9f6b04 100755
--- a/locale/ko/statistics.txt
+++ b/locale/ko/statistics.txt
@@ -1 +1 @@
-d:47;
\ No newline at end of file
+d:45;
\ No newline at end of file
diff --git a/locale/pl/configure.ini b/locale/pl/configure.ini
index 14a4d3bf5..869028c86 100755
--- a/locale/pl/configure.ini
+++ b/locale/pl/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = ""
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = ""
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = ""
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = ""
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "Szukaj"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/pl/resources/suggest_trie.txt.gz b/locale/pl/resources/suggest_trie.txt.gz
new file mode 100644
index 000000000..ce7df6f36
Binary files /dev/null and b/locale/pl/resources/suggest_trie.txt.gz differ
diff --git a/locale/pl/resources/tokenizer.php b/locale/pl/resources/tokenizer.php
new file mode 100755
index 000000000..e3205cce0
--- /dev/null
+++ b/locale/pl/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Polish specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['pl'] = 5;
+?>
diff --git a/locale/pt/configure.ini b/locale/pt/configure.ini
index d5c96789a..8accf905a 100755
--- a/locale/pt/configure.ini
+++ b/locale/pt/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = ""
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = ""
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = ""
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = ""
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "Pesquisa"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/pt/resources/suggest_trie.txt.gz b/locale/pt/resources/suggest_trie.txt.gz
new file mode 100644
index 000000000..0aa2053e3
Binary files /dev/null and b/locale/pt/resources/suggest_trie.txt.gz differ
diff --git a/locale/pt/resources/tokenizer.php b/locale/pt/resources/tokenizer.php
new file mode 100755
index 000000000..e5a91ec85
--- /dev/null
+++ b/locale/pt/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Portuguese specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['pl'] = 5;
+?>
diff --git a/locale/ru/configure.ini b/locale/ru/configure.ini
index 6e372f609..93f867efc 100755
--- a/locale/ru/configure.ini
+++ b/locale/ru/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = ""
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = ""
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = ""
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = ""
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "Поиск"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/ru/resources/tokenizer.php b/locale/ru/resources/tokenizer.php
new file mode 100755
index 000000000..4b2b86896
--- /dev/null
+++ b/locale/ru/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Russian specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['ru'] = 5;
+?>
diff --git a/locale/th/configure.ini b/locale/th/configure.ini
index 3d70637a0..842dd5d53 100755
--- a/locale/th/configure.ini
+++ b/locale/th/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = ""
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = ""
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = ""
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = ""
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = ""
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/th/resources/tokenizer.php b/locale/th/resources/tokenizer.php
new file mode 100755
index 000000000..1ab591c08
--- /dev/null
+++ b/locale/th/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Thai specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['th'] = 5;
+?>
diff --git a/locale/tr/configure.ini b/locale/tr/configure.ini
index 2a32fd469..79629e94e 100755
--- a/locale/tr/configure.ini
+++ b/locale/tr/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = ""
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = ""
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = ""
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = ""
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = ""
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = ""
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = ""
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = ""
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = ""
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = ""
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = ""
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = ""
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = ""
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = ""
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = ""
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = ""
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = ""
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = ""
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = ""
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = ""
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = ""
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = ""
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = ""
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = ""
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = ""
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "Ara"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = ""
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = ""
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = ""
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = ""
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = ""
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = ""
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = ""
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/tr/bot.thtml b/locale/tr/pages/bot.thtml
similarity index 100%
rename from locale/tr/bot.thtml
rename to locale/tr/pages/bot.thtml
diff --git a/locale/tr/resources/tokenizer.php b/locale/tr/resources/tokenizer.php
new file mode 100755
index 000000000..f614f0eb4
--- /dev/null
+++ b/locale/tr/resources/tokenizer.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Turkish specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+$CHARGRAMS['tr'] = 5;
+?>
diff --git a/locale/vi-VN/configure.ini b/locale/vi-VN/configure.ini
index 0a5299595..bca818e55 100755
--- a/locale/vi-VN/configure.ini
+++ b/locale/vi-VN/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = "Đăng nhập th&agrave;nh c&ocirc;ng"
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = "T&ecirc;n đăng nhập họăc khẩu kh&ocirc;ng đ&uacute;ng"
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = "đăng nhập để cấu h&igrave;nh"
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = "Những mật khẩu đ&atilde; nhập kh&ocirc;ng tr&ugrave;ng nhau"
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = "Mật khẩu cũ bị sai"
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = "Thay đổi mật khẩu"
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = "Chọn t&ecirc;n sử dụng"
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = "Chọn chức vụ"
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = "Những mật khẩu đ&atilde; nhập kh&ocirc;ng tr&ugrave;ng nhau"
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = "T&ecirc;n sử dụng tồn tại"
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = "T&ecirc;n sử dụng đ&atilde; đựơc tạo"
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = "T&ecirc;n sử dụng kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = "X&oacute;a t&ecirc;n sử dụng"
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = "T&ecirc;n sử dụng kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = "Chức vụ kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = "Cộng th&ecirc;m chức vụ "
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = "T&ecirc;n sử dụng kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = "Chức vụ kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = "X&oacute;a chức vụ"
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = "Chọn chức vụ"
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = "Lựa chọn họat động"
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = "Chức vụ đ&atilde; đựơc d&ugrave;ng"
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = "Cộng th&ecirc;m chức vụ "
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = "Chức vụ kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = "X&oacute;a chức vụ"
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = "Chức vụ kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = "T&ecirc;n hoạt động kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = "Bổ sung t&ecirc;n hoạt động "
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = "Chức vụ kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = "T&ecirc;n hoạt động kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = "X&oacute;a t&ecirc;n hoạt động"
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = "Bắt đầu sự b&ograve; mới"
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = "Kh&ocirc;ng c&oacute; sự m&ocirc; tả n&agrave;o"
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = "Ngừng thu thập dữ liệu"
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = "Tiếp tục thu thập dữ liệu"
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = "X&oacute;a thu thập dữ liệu th&agrave;nh c&ocirc;ng"
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = "X&oacute;a thu thập dữ liệu kh&ocirc;ng th&agrave;nh c&ocirc;ng"
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = "Thiết lập thu thập dữ liệu để sử dụng l&agrave;m chỉ mục"
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = "Sử dụng dưới đ&acirc;y"
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = "Sử dụng mặc định"
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = "Sử dụng dưới đ&acirc;y"
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = "trước thu thập dữ liệu"
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = "Bề rộng đầu ti&ecirc;n"
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = "Trang quan trọng"
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = "Cập nhật th&ocirc;ng tin trang web hạt giống"
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = "Chọn thu thập th&ocirc;ng tin"
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = "Chọn thu thập th&ocirc;ng tin"
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = "V&ocirc; danh"
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = "Tạo ra hỗn hợp "
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = "Thiết lập thu thập dữ liệu để sử dụng l&agrave;m chỉ mục"
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = "Kết hợp n&agrave;y kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = "X&oacute;a kết hợp "
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = "Cộng th&ecirc;m thu thập"
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = "Số kết quả"
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = "Nh&oacute;m bị x&oacute;a "
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = "Trọng lượng"
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = "T&ecirc;n"
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = "Từ kh&oacute;a "
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = "H&agrave;nh động"
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = "Cộng th&ecirc;m truy vấn"
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = "X&oacute;a"
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = "Kết hợp đ&atilde; được lưu dữ"
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = "Cập nhật c&aacute;c trang web lọc"
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = "Chọn miền địa phương"
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = "Miền địa phương th&ecirc;m v&agrave;o"
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = "Miền địa phương kh&ocirc;ng tồn tại"
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = "X&oacute;a miền địa phương"
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = "Chuỗi Địa phương được cập nhật"
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = "Kiểm tra được th&ocirc;ng qua"
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = "C&ocirc;ng việc thiết lập thư mục bị đ&ocirc;ng cứng (Bạn c&oacute; thể cần phải đăng nhập)"
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = "Đặt t&ecirc;n cho r&ocirc; b&ocirc; của bạn"
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = "Thư mục l&agrave;m việc v&agrave; hồ sơ được tạo ra"
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = "Kh&ocirc;ng thể cập nhật hồ sơ config.php"
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = "Kh&ocirc;ng thể tạo hồ sơ"
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = "C&ocirc;ng t&aacute;c thư mục kh&ocirc;ng hợp lệ"
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = "C&ocirc;ng t&aacute;c thư mục kh&ocirc;ng hợp lệ"
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = "Vấn đề cập nhật cơ sở dữ liệu"
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = "Hồ sơ được cập nhật"
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = "C&oacute; sự trở ngaị về việc cập nhật hồ sơ "
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = "Diễn tả r&ocirc; b&ocirc; của bạn"
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = "Tho&aacute;t th&agrave;nh c&ocirc;ng"
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = "Bằng c&aacute;ch sử dụng kết hợp thu thập dữ liệu %s"
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = "Sử dụng chỉ số %s"
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = "Kh&ocirc;ng c&oacute; chỉ mục t&igrave;m kiếm thiết lập để sử dụng"
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = "Kh&ocirc;ng c&oacute; chỉ mục t&igrave;m kiếm thiết lập để sử dụng"
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = "Trang gốc n&agrave;y: %s đ&atilde; t&igrave;m được bởi c&ocirc;ng cụ t&igrave;m kiẽm Yioop v&agrave;o ng&agrave;y %s."
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = "Chuyển đổi chiết xuất trang t&oacute;m tắt"
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = "Thu thập th&ocirc;ng tin hỗn hợp"
 ; settings_controller.php line: 142
 settings_controller_settings_saved = "Những c&agrave;i đặt đ&atilde; được lưu lại"
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = "T&igrave;m mục lục"
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = "Xo&aacute;"
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = "Người sử dụng cơ sở dữ liệu:"
 configure_element_databasepassword = "Mật khẩu cơ sở dữ liệu:"
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = "M&ocirc; tả r&ocirc;-bốt"
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = "Những c&agrave;i đặt"
@@ -1086,13 +1128,13 @@ web_layout_description = "Gi&uacute;p t&igrave;m ca&iacute; m&agrave; bạn mu
 ; web_layout.php line: 81
 web_layout_description = "Gi&uacute;p t&igrave;m ca&iacute; m&agrave; bạn muốn t&igrave;m kiếm"
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = "Thời gian: %s gi&acirc;y"
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = "Kh&ocirc;ng t&igrave;m thấy trang gốc m&agrave; b
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = "Đ&aacute;nh v&agrave;o những cụm từ m&agrave; bạn muốn t&igrave;m trang web"
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = "Đ&aacute;nh v&agrave;o c&aacute;i m&agrave; bạn muốn t&igrave;m"
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "T&igrave;m Kiếm"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = "Kết Quả:"
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = "Đ&atilde; t&iacute;nh to&aacute;n trong %s gi&acirc;y."
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = "Cho kết quả tứ %s - %s của %s"
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = "Thứ Tự: %s"
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = "Th&iacute;ch hợp: %s"
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = "Gần: %s"
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = "Điểm: %s"
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = "Trang&nbsp;gốc"
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = "Trang&nbsp;Web&nbsp;Bắng Chữ"
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = "Tương&nbsp;Tự"
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/vi-VN/resources/suggest_trie.txt.gz b/locale/vi-VN/resources/suggest_trie.txt.gz
new file mode 100644
index 000000000..e5e020eb1
Binary files /dev/null and b/locale/vi-VN/resources/suggest_trie.txt.gz differ
diff --git a/locale/vi-VN/resources/tokenizer.php b/locale/vi-VN/resources/tokenizer.php
new file mode 100755
index 000000000..a39a9afa6
--- /dev/null
+++ b/locale/vi-VN/resources/tokenizer.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Vietnamese specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+
+/*for Vietnamese neither char gramming or stemming seemed to make sense, so
+  for now this file is blank.
+*/
+?>
diff --git a/locale/vi-VN/statistics.txt b/locale/vi-VN/statistics.txt
index 9be6a0c6e..e8680e29f 100755
--- a/locale/vi-VN/statistics.txt
+++ b/locale/vi-VN/statistics.txt
@@ -1 +1 @@
-d:43;
\ No newline at end of file
+d:41;
\ No newline at end of file
diff --git a/locale/zh-CN/configure.ini b/locale/zh-CN/configure.ini
index dcab6bc0f..33069019c 100755
--- a/locale/zh-CN/configure.ini
+++ b/locale/zh-CN/configure.ini
@@ -28,367 +28,382 @@
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//controllers
 ;
-; admin_controller.php line: 127
+; admin_controller.php line: 134
 admin_controller_login_successful = "登入成功"
 ;
-; admin_controller.php line: 132
+; admin_controller.php line: 139
 admin_controller_login_failed = "登入失敗"
 ;
-; admin_controller.php line: 137
+; admin_controller.php line: 144
 admin_controller_login_to_config = ""
 ;
-; admin_controller.php line: 330
+; admin_controller.php line: 148
+admin_controller_status_updates_stopped = ""
+;
+; admin_controller.php line: 341
 admin_controller_passwords_dont_match = "密碼錯誤"
 ;
-; admin_controller.php line: 340
+; admin_controller.php line: 351
 admin_controller_invalid_old_password = "密碼無效"
 ;
-; admin_controller.php line: 347
+; admin_controller.php line: 358
 admin_controller_change_password = "改變密碼"
 ;
-; admin_controller.php line: 378
+; admin_controller.php line: 389
 admin_controller_select_username = "使用者名稱"
 ;
-; admin_controller.php line: 415
+; admin_controller.php line: 426
 admin_controller_select_rolename = "暱稱"
 ;
-; admin_controller.php line: 441
+; admin_controller.php line: 452
 admin_controller_passwords_dont_match = "密碼錯誤"
 ;
-; admin_controller.php line: 448
+; admin_controller.php line: 459
 admin_controller_username_exists = "使用者已存在"
 ;
-; admin_controller.php line: 455
+; admin_controller.php line: 466
 admin_controller_username_added = "新增使用者"
 ;
-; admin_controller.php line: 464
+; admin_controller.php line: 475
 admin_controller_username_doesnt_exists = "此使用者不存在"
 ;
-; admin_controller.php line: 471
+; admin_controller.php line: 482
 admin_controller_username_deleted = "刪除使用者"
 ;
-; admin_controller.php line: 478
+; admin_controller.php line: 489
 admin_controller_username_doesnt_exists = "此使用者不存在"
 ;
-; admin_controller.php line: 484
+; admin_controller.php line: 495
 admin_controller_rolename_doesnt_exists = "無此暱稱"
 ;
-; admin_controller.php line: 490
+; admin_controller.php line: 501
 admin_controller_rolename_added = "增加暱稱"
 ;
-; admin_controller.php line: 501
+; admin_controller.php line: 512
 admin_controller_username_doesnt_exists = "此使用者不存在"
 ;
-; admin_controller.php line: 507
+; admin_controller.php line: 518
 admin_controller_rolename_doesnt_exists = "無此暱稱"
 ;
-; admin_controller.php line: 517
+; admin_controller.php line: 528
 admin_controller_rolename_deleted = "刪除暱稱"
 ;
-; admin_controller.php line: 547
+; admin_controller.php line: 558
 admin_controller_select_rolename = "暱稱"
 ;
-; admin_controller.php line: 582
+; admin_controller.php line: 593
 admin_controller_select_activityname = ""
 ;
-; admin_controller.php line: 615
+; admin_controller.php line: 626
 admin_controller_rolename_exists = "此暱稱已存在"
 ;
-; admin_controller.php line: 625
+; admin_controller.php line: 636
 admin_controller_rolename_added = "增加暱稱"
 ;
-; admin_controller.php line: 636
+; admin_controller.php line: 647
 admin_controller_rolename_doesnt_exists = "無此暱稱"
 ;
-; admin_controller.php line: 644
+; admin_controller.php line: 655
 admin_controller_rolename_deleted = "刪除暱稱"
 ;
-; admin_controller.php line: 650
+; admin_controller.php line: 661
 admin_controller_rolename_doesnt_exists = "無此暱稱"
 ;
-; admin_controller.php line: 656
+; admin_controller.php line: 667
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 666
+; admin_controller.php line: 677
 admin_controller_activity_added = ""
 ;
-; admin_controller.php line: 672
+; admin_controller.php line: 683
 admin_controller_rolename_doesnt_exists = "無此暱稱"
 ;
-; admin_controller.php line: 679
+; admin_controller.php line: 690
 admin_controller_activityname_doesnt_exists = ""
 ;
-; admin_controller.php line: 691
+; admin_controller.php line: 702
 admin_controller_activity_deleted = ""
 ;
-; admin_controller.php line: 733
+; admin_controller.php line: 744
 admin_controller_starting_new_crawl = "開始新的搜尋"
 ;
-; admin_controller.php line: 780
+; admin_controller.php line: 791
 admin_controller_no_description = "沒有任何項目"
 ;
-; admin_controller.php line: 791
+; admin_controller.php line: 802
 admin_controller_stop_crawl = "停止搜尋,需要一段時間更新"
 ;
-; admin_controller.php line: 797
+; admin_controller.php line: 808
 admin_controller_resume_crawl = "回復搜尋,需要一段時間更新"
 ;
-; admin_controller.php line: 819
+; admin_controller.php line: 830
 admin_controller_delete_crawl_success = "刪除搜尋,需要一段時間更新"
 ;
-; admin_controller.php line: 824
+; admin_controller.php line: 835
 admin_controller_delete_crawl_fail = "刪除搜尋失敗"
 ;
-; admin_controller.php line: 831
+; admin_controller.php line: 842
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 847
+; admin_controller.php line: 858
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 848
+; admin_controller.php line: 859
 admin_controller_use_defaults = ""
 ;
-; admin_controller.php line: 850
+; admin_controller.php line: 861
 admin_controller_use_below = ""
 ;
-; admin_controller.php line: 853
+; admin_controller.php line: 864
 admin_controller_previous_crawl = ""
 ;
-; admin_controller.php line: 931
+; admin_controller.php line: 942
 admin_controller_breadth_first = "深度優先"
 ;
-; admin_controller.php line: 933
+; admin_controller.php line: 944
 admin_controller_page_importance = "網頁重要性"
 ;
-; admin_controller.php line: 1037
+; admin_controller.php line: 1048
 admin_controller_urls_injected = ""
 ;
-; admin_controller.php line: 1048
+; admin_controller.php line: 1059
 admin_controller_update_seed_info = ""
 ;
-; admin_controller.php line: 1128
+; admin_controller.php line: 1139
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1130
+; admin_controller.php line: 1141
 admin_controller_select_crawl = ""
 ;
-; admin_controller.php line: 1158
+; admin_controller.php line: 1169
 admin_controller_unnamed = ""
 ;
-; admin_controller.php line: 1163
+; admin_controller.php line: 1174
 admin_controller_mix_created = ""
 ;
-; admin_controller.php line: 1172
+; admin_controller.php line: 1183
 admin_controller_set_index = ""
 ;
-; admin_controller.php line: 1182
+; admin_controller.php line: 1193
 admin_controller_mix_doesnt_exists = ""
 ;
-; admin_controller.php line: 1190
+; admin_controller.php line: 1201
 admin_controller_mix_deleted = ""
 ;
-; admin_controller.php line: 1226
+; admin_controller.php line: 1237
 editmix_element_add_crawls = ""
 ;
-; admin_controller.php line: 1228
+; admin_controller.php line: 1239
 editmix_element_num_results = ""
 ;
-; admin_controller.php line: 1229
+; admin_controller.php line: 1240
 editmix_element_del_grp = ""
 ;
-; admin_controller.php line: 1230
+; admin_controller.php line: 1241
 editmix_element_weight = ""
 ;
-; admin_controller.php line: 1231
+; admin_controller.php line: 1242
 editmix_element_name = ""
 ;
-; admin_controller.php line: 1232
+; admin_controller.php line: 1243
 editmix_add_keywords = ""
 ;
-; admin_controller.php line: 1233
+; admin_controller.php line: 1244
 editmix_element_actions = ""
 ;
-; admin_controller.php line: 1234
+; admin_controller.php line: 1245
 editmix_add_query = ""
 ;
-; admin_controller.php line: 1235
+; admin_controller.php line: 1246
 editmix_element_delete = ""
 ;
-; admin_controller.php line: 1287
+; admin_controller.php line: 1298
 admin_controller_mix_saved = ""
 ;
-; admin_controller.php line: 1358
+; admin_controller.php line: 1369
 admin_controller_recrawl_never = ""
 ;
-; admin_controller.php line: 1359
+; admin_controller.php line: 1370
 admin_controller_recrawl_1day = ""
 ;
-; admin_controller.php line: 1360
+; admin_controller.php line: 1371
 admin_controller_recrawl_2day = ""
 ;
-; admin_controller.php line: 1361
+; admin_controller.php line: 1372
 admin_controller_recrawl_3day = ""
 ;
-; admin_controller.php line: 1362
+; admin_controller.php line: 1373
 admin_controller_recrawl_7day = ""
 ;
-; admin_controller.php line: 1363
+; admin_controller.php line: 1374
 admin_controller_recrawl_14day = ""
 ;
-; admin_controller.php line: 1446
-admin_controller_site_filter_update = ""
+; admin_controller.php line: 1457
+admin_controller_results_editor_update = ""
+;
+; admin_controller.php line: 1471
+admin_controller_edited_pages = ""
 ;
-; admin_controller.php line: 1492
+; admin_controller.php line: 1484
+admin_controller_results_editor_need_url = ""
+;
+; admin_controller.php line: 1490
+admin_controller_results_editor_page_updated = ""
+;
+; admin_controller.php line: 1503
+admin_controller_results_editor_page_loaded = ""
+;
+; admin_controller.php line: 1549
 admin_controller_select_machine = ""
 ;
-; admin_controller.php line: 1560
+; admin_controller.php line: 1621
 admin_controller_machine_added = ""
 ;
-; admin_controller.php line: 1567
+; admin_controller.php line: 1628
 admin_controller_machine_exists = ""
 ;
-; admin_controller.php line: 1571
+; admin_controller.php line: 1632
 admin_controller_machine_incomplete = ""
 ;
-; admin_controller.php line: 1580
+; admin_controller.php line: 1641
 admin_controller_machine_doesnt_exists = ""
 ;
-; admin_controller.php line: 1597
+; admin_controller.php line: 1658
 admin_controller_stop_service_first = ""
 ;
-; admin_controller.php line: 1610
+; admin_controller.php line: 1671
 admin_controller_machine_deleted = ""
 ;
-; admin_controller.php line: 1658
+; admin_controller.php line: 1719
 admin_controller_no_machine_log = ""
 ;
-; admin_controller.php line: 1687
+; admin_controller.php line: 1748
 admin_controller_machine_servers_updated = ""
 ;
-; admin_controller.php line: 1691
+; admin_controller.php line: 1752
 admin_controller_machine_no_action = ""
 ;
-; admin_controller.php line: 1722
+; admin_controller.php line: 1783
 admin_controller_select_localename = ""
 ;
-; admin_controller.php line: 1766
+; admin_controller.php line: 1827
 admin_controller_locale_added = ""
 ;
-; admin_controller.php line: 1773
+; admin_controller.php line: 1834
 admin_controller_localename_doesnt_exists = ""
 ;
-; admin_controller.php line: 1782
+; admin_controller.php line: 1843
 admin_controller_localename_deleted = ""
 ;
-; admin_controller.php line: 1791
+; admin_controller.php line: 1852
 admin_controller_select_staticpages = ""
 ;
-; admin_controller.php line: 1810
+; admin_controller.php line: 1871
 admin_controller_staticpage_updated = ""
 ;
-; admin_controller.php line: 1833
+; admin_controller.php line: 1894
 admin_controller_localestrings_updated = ""
 ;
-; admin_controller.php line: 1890
+; admin_controller.php line: 1951
 admin_controller_php_version = ""
 ;
-; admin_controller.php line: 1898
+; admin_controller.php line: 1959
 admin_controller_no_write_config_php = ""
 ;
-; admin_controller.php line: 1903
+; admin_controller.php line: 1964
 admin_controller_no_write_work_dir = ""
 ;
-; admin_controller.php line: 1908
+; admin_controller.php line: 1969
 admin_controller_post_size_small = ""
 ;
-; admin_controller.php line: 1914
+; admin_controller.php line: 1975
 admin_controller_missing_required = ""
 ;
-; admin_controller.php line: 1937
+; admin_controller.php line: 1998
 admin_controller_missing_optional = ""
 ;
-; admin_controller.php line: 1942
+; admin_controller.php line: 2003
 admin_controller_check_passed = ""
 ;
-; admin_controller.php line: 1947
+; admin_controller.php line: 2008
 admin_controller_using_local_config = ""
 ;
-; admin_controller.php line: 2003
+; admin_controller.php line: 2064
 admin_controller_configure_use_absolute_path = ""
 ;
-; admin_controller.php line: 2036
+; admin_controller.php line: 2097
 admin_controller_configure_work_dir_set = ""
 ;
-; admin_controller.php line: 2048
+; admin_controller.php line: 2109
 admin_controller_name_your_bot = ""
 ;
-; admin_controller.php line: 2057
+; admin_controller.php line: 2118
 admin_controller_configure_work_profile_made = ""
 ;
-; admin_controller.php line: 2065
+; admin_controller.php line: 2126
 admin_controller_configure_no_set_config = ""
 ;
-; admin_controller.php line: 2076
+; admin_controller.php line: 2137
 admin_controller_configure_no_create_profile = ""
 ;
-; admin_controller.php line: 2085
+; admin_controller.php line: 2146
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2096
+; admin_controller.php line: 2157
 admin_controller_configure_work_dir_invalid = ""
 ;
-; admin_controller.php line: 2174
+; admin_controller.php line: 2235
 admin_controller_configure_no_change_db = ""
 ;
-; admin_controller.php line: 2188
+; admin_controller.php line: 2249
 admin_controller_configure_profile_change = ""
 ;
-; admin_controller.php line: 2202
+; admin_controller.php line: 2263
 admin_controller_configure_no_change_profile = ""
 ;
-; admin_controller.php line: 2238
+; admin_controller.php line: 2299
 admin_controller_describe_robot = ""
 ;
 ; search_controller.php line: 143
 search_controller_logout_successful = ""
 ;
-; search_controller.php line: 179
-search_controller_index_not_found = ""
-;
-; search_controller.php line: 241
+; search_controller.php line: 251
 search_controller_mix_info = ""
 ;
-; search_controller.php line: 244
+; search_controller.php line: 254
 search_controller_crawl_info = ""
 ;
-; search_controller.php line: 365
+; search_controller.php line: 377
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 368
+; search_controller.php line: 380
 search_controller_no_index_set = ""
 ;
-; search_controller.php line: 733
+; search_controller.php line: 794
 search_controller_extracted_title = ""
 ;
-; search_controller.php line: 735
+; search_controller.php line: 796
 search_controller_extracted_description = ""
 ;
-; search_controller.php line: 737
+; search_controller.php line: 798
 search_controller_extracted_links = ""
 ;
-; search_controller.php line: 742
+; search_controller.php line: 803
 search_controller_extracted_allow_paths = ""
 ;
-; search_controller.php line: 748
+; search_controller.php line: 809
 search_controller_extracted_disallow_paths = ""
 ;
-; search_controller.php line: 754
+; search_controller.php line: 815
 search_controller_crawl_delay = ""
 ;
-; search_controller.php line: 870
+; search_controller.php line: 897
+search_controller_cache_comment = ""
+;
+; search_controller.php line: 945
 search_controller_cached_version = ""
 ;
-; search_controller.php line: 884
+; search_controller.php line: 959
 search_controller_summary_data = ""
 ;
 ; settings_controller.php line: 125
@@ -397,9 +412,6 @@ settings_controller_crawl_mix = ""
 ; settings_controller.php line: 142
 settings_controller_settings_saved = "設定已儲存"
 ;
-; statistics_controller.php line: 126
-statistics_controller_index_not_found = ""
-;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views
 ;
 ; admin_view.php line: 79
@@ -528,7 +540,7 @@ crawlstatus_view_search_index = ""
 ; crawlstatus_view.php line: 235
 crawlstatus_view_delete = ""
 ;
-; crawlstatus_view.php line: 242
+; crawlstatus_view.php line: 243
 crawlstatus_view_no_previous_crawl = ""
 ;
 ; /Applications/XAMPP/xamppfiles/htdocs/git/yioop//views/elements
@@ -594,54 +606,57 @@ configure_element_databaseuser = ""
 configure_element_databasepassword = ""
 ;
 ; configure_element.php line: 189
-configure_element_search_results = ""
+configure_element_search_page = ""
 ;
-; configure_element.php line: 194
+; configure_element.php line: 195
+configure_element_wd_suggest = ""
+;
+; configure_element.php line: 200
 configure_element_signin_link = ""
 ;
-; configure_element.php line: 199
+; configure_element.php line: 205
 configure_element_cache_link = ""
 ;
-; configure_element.php line: 205
+; configure_element.php line: 211
 configure_element_similar_link = ""
 ;
-; configure_element.php line: 210
+; configure_element.php line: 216
 configure_element_in_link = ""
 ;
-; configure_element.php line: 215
+; configure_element.php line: 221
 configure_element_ip_link = ""
 ;
-; configure_element.php line: 219
+; configure_element.php line: 225
 configure_element_name_server = ""
 ;
-; configure_element.php line: 221
+; configure_element.php line: 227
 configure_element_name_server_key = ""
 ;
-; configure_element.php line: 227
+; configure_element.php line: 233
 configure_element_name_server_url = ""
 ;
-; configure_element.php line: 233
+; configure_element.php line: 239
 configure_element_use_memcache = ""
 ;
-; configure_element.php line: 240
+; configure_element.php line: 246
 configure_element_memcache_servers = ""
 ;
-; configure_element.php line: 248
+; configure_element.php line: 254
 configure_element_use_filecache = ""
 ;
-; configure_element.php line: 257
+; configure_element.php line: 263
 configure_element_crawl_robot = ""
 ;
-; configure_element.php line: 259
+; configure_element.php line: 265
 configure_element_robot_name = ""
 ;
-; configure_element.php line: 267
+; configure_element.php line: 273
 configure_element_robot_instance = ""
 ;
-; configure_element.php line: 274
+; configure_element.php line: 280
 configure_element_robot_description = ""
 ;
-; configure_element.php line: 283
+; configure_element.php line: 289
 configure_element_submit = ""
 ;
 ; crawloptions_element.php line: 62
@@ -1028,14 +1043,41 @@ pageoptions_element_link_weight = ""
 ; pageoptions_element.php line: 123
 pageoptions_element_save_options = ""
 ;
-; searchfilters_element.php line: 59
-searchfilters_element_filter_websites = ""
+; resultseditor_element.php line: 58
+resultseditor_element_edit_page = ""
+;
+; resultseditor_element.php line: 61
+resultseditor_element_edited_pages = ""
 ;
-; searchfilters_element.php line: 69
-searchfilters_element_sites_to_filter = ""
+; resultseditor_element.php line: 70
+resultseditor_element_url_list = ""
 ;
-; searchfilters_element.php line: 76
-searchfilters_element_save_options = ""
+; resultseditor_element.php line: 72
+resultseditor_element_load_page = ""
+;
+; resultseditor_element.php line: 83
+resultseditor_element_page_url = ""
+;
+; resultseditor_element.php line: 90
+resultseditor_element_page_title = ""
+;
+; resultseditor_element.php line: 96
+resultseditor_element_description = ""
+;
+; resultseditor_element.php line: 102
+resultseditor_element_reset = ""
+;
+; resultseditor_element.php line: 105
+resultseditor_element_save_page = ""
+;
+; resultseditor_element.php line: 108
+resultseditor_element_filter_websites = ""
+;
+; resultseditor_element.php line: 118
+resultseditor_element_sites_to_filter = ""
+;
+; resultseditor_element.php line: 125
+resultseditor_element_save_filter = ""
 ;
 ; signin_element.php line: 63
 signin_element_settings = "設定"
@@ -1086,13 +1128,13 @@ web_layout_description = ""
 ; web_layout.php line: 81
 web_layout_description = ""
 ;
-; web_layout.php line: 98
+; web_layout.php line: 99
 web_layout_query_statistics = ""
 ;
-; web_layout.php line: 102
+; web_layout.php line: 103
 web_layout_total_elapsed_time = ""
 ;
-; web_layout.php line: 107
+; web_layout.php line: 108
 web_layout_query_time = ""
 ;
 ; machinestatus_view.php line: 65
@@ -1128,52 +1170,52 @@ nocache_view_no_cache = ""
 ; nocache_view.php line: 67
 nocache_view_summary_contents = ""
 ;
-; search_view.php line: 82
+; search_view.php line: 81
 search_view_title = ""
 ;
-; search_view.php line: 91
+; search_view.php line: 97
 search_view_input_label = ""
 ;
-; search_view.php line: 94
+; search_view.php line: 100
 search_view_input_placeholder = ""
 ;
-; search_view.php line: 96
+; search_view.php line: 102
 search_view_search = "搜尋"
 ;
-; search_view.php line: 103
+; search_view.php line: 115
 search_view_query_results = "搜尋結果"
 ;
-; search_view.php line: 104
+; search_view.php line: 116
 search_view_calculated = "總計: %s 秒"
 ;
-; search_view.php line: 105
+; search_view.php line: 117
 search_view_results = "結果"
 ;
-; search_view.php line: 137
+; search_view.php line: 149
 search_view_rank = "排名: %s 名"
 ;
-; search_view.php line: 139
+; search_view.php line: 151
 search_view_relevancy = "關聯度:  %s 趴"
 ;
-; search_view.php line: 141
+; search_view.php line: 153
 search_view_proximity = ""
 ;
-; search_view.php line: 143
+; search_view.php line: 155
 search_view_score = "分數"
 ;
-; search_view.php line: 158
+; search_view.php line: 170
 search_view_cache = ""
 ;
-; search_view.php line: 161
+; search_view.php line: 173
 search_view_as_text = ""
 ;
-; search_view.php line: 173
+; search_view.php line: 185
 search_view_similar = "相似"
 ;
-; search_view.php line: 184
+; search_view.php line: 196
 search_view_inlink = ""
 ;
-; search_view.php line: 216
+; search_view.php line: 229
 search_view_more_statistics = ""
 ;
 ; settings_view.php line: 76
diff --git a/locale/zh-CN/resources/tokenizer.php b/locale/zh-CN/resources/tokenizer.php
new file mode 100755
index 000000000..0a5cfdecb
--- /dev/null
+++ b/locale/zh-CN/resources/tokenizer.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  @author Chris Pollett chris@pollett.org
+ *  @package seek_quarry
+ *  @subpackage locale
+ *  @license http://www.gnu.org/licenses/ GPL3
+ *  @link http://www.seekquarry.com/
+ *  @copyright 2009 - 2012
+ *  @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Turkish specific tokenization code. Typically, tokenizer.php
+ * either contains a stemmer for the language in question or
+ * it specifies how many characters in a char gram
+ *
+ * @author Chris Pollett
+ * @package seek_quarry
+ * @subpackage locale
+ */
+$CHARGRAMS['zh'] = 2;
+$CHARGRAMS['zh-CN'] = 2;
+$CHARGRAMS['cn'] = 2;
+?>
diff --git a/locale/zh-CN/statistics.txt b/locale/zh-CN/statistics.txt
index 604edd026..763247d34 100755
--- a/locale/zh-CN/statistics.txt
+++ b/locale/zh-CN/statistics.txt
@@ -1 +1 @@
-d:18;
\ No newline at end of file
+d:17;
\ No newline at end of file
diff --git a/models/crawl_model.php b/models/crawl_model.php
index 4e01f56ad..e14cd5b56 100755
--- a/models/crawl_model.php
+++ b/models/crawl_model.php
@@ -1339,10 +1339,11 @@ EOT;
         $phrases = array();

         $word_counts = array();
-        foreach($word_key_counts as $word_key =>$count) {
-            $word_counts[$lookup[$word_key]] = $count;
+        if(is_array($word_key_counts ) && count($word_key_counts ) > 0) {
+            foreach($word_key_counts as $word_key =>$count) {
+                $word_counts[$lookup[$word_key]] = $count;
+            }
         }
-
         return $word_counts;
      }

diff --git a/models/locale_model.php b/models/locale_model.php
index b89b358f7..6f97d7a8b 100644
--- a/models/locale_model.php
+++ b/models/locale_model.php
@@ -620,8 +620,12 @@ class LocaleModel extends Model
                 $fallback_path . '/configure.ini', true);
         }
         if(file_exists($fallback_path.'/pages')) {
-            $this->updateLocaleStaticPages($cur_path.'/pages',
-                $fallback_path.'/pages');
+            $this->updateLocaleSubFolder($cur_path.'/pages',
+                $fallback_path.'/pages', array("thtml"));
+        }
+        if(file_exists($fallback_path.'/resources')) {
+            $this->updateLocaleSubFolder($cur_path.'/resources',
+                $fallback_path.'/resources', array("php", "ftr", "txt.gz"));
         }
         $n = array();
         $n[] = <<<EOT
@@ -710,26 +714,33 @@ EOT;
     }

     /**
-     *  Copies over static pages which exists in a fallback directory, but
-     *  not in the actual directory of a locale.
+     *  Copies over subfolder items of the correct file extensions
+     *  which exists in a fallback directory, but not in the actual directory
+     *  of a locale.
      *
      *  @param string $locale_pages_path static page directory to which will
      *     copy
      *  @param string $fallback_pages_path static page directory from which will
      *     copy
+     *  @param array $file_extensions an array of strings names of file
+     *      extensions for example: .txt.gz .thtml .php ,etc
      */
-    function updateLocaleStaticPages($locale_pages_path, $fallback_pages_path) {
+    function updateLocaleSubFolder($locale_pages_path, $fallback_pages_path,
+        $file_extensions) {
         $change = false;
         if(!file_exists($locale_pages_path)) {
             mkdir($locale_pages_path);
             $change = true;
         }
-        foreach( glob($fallback_pages_path."/*.thtml") as $fallback_page_name) {
-            $basename = basename($fallback_page_name);
-            $locale_page_name = "$locale_pages_path/$basename";
-            if(!file_exists($locale_page_name)) {
-                copy($fallback_page_name, $locale_page_name);
-                $change = true;
+        foreach($file_extensions as $file_extension) {
+            foreach(glob($fallback_pages_path."/*.$file_extension")
+                as $fallback_page_name) {
+                $basename = basename($fallback_page_name);
+                $locale_page_name = "$locale_pages_path/$basename";
+                if(!file_exists($locale_page_name)) {
+                    copy($fallback_page_name, $locale_page_name);
+                    $change = true;
+                }
             }
         }
         $this->db->setWorldPermissionsRecursive($locale_pages_path);
diff --git a/models/model.php b/models/model.php
index d91c45ba1..d73ff2dcd 100755
--- a/models/model.php
+++ b/models/model.php
@@ -86,6 +86,12 @@ class Model implements CrawlConstants
      *  @var string
      */
     var $db_name;
+    /**
+     * Associative array of page summaries which might be used to
+     * override default page summaries if set.
+     * @var array
+     */
+    var $editedPageSummaries = NULL;


     /**
@@ -129,6 +135,25 @@ class Model implements CrawlConstants
         }
         for($i = 0; $i < $num_pages; $i++) {
             $page = $pages[$i];
+            if($this->editedPageSummaries != NULL) {
+                $url_parts = explode("|", $page[self::URL]);
+                if(count($url_parts) > 1) {
+                    $url = trim($url_parts[1]);
+                } else {
+                    $url = $page[self::URL];
+                }
+                $hash_url = crawlHash($url, true);
+                if(isset($this->editedPageSummaries[$hash_url])) {
+                    $summary = $this->editedPageSummaries[$hash_url];
+                    $page[self::URL] = $url;
+                    foreach(array(self::TITLE, self::DESCRIPTION) as $field) {
+                        if(isset($summary[$field])) {
+                            $page[$field] = $summary[$field];
+                        }
+                    }
+
+                }
+            }
             if(!isset($page[self::TITLE])) {
                 $page[self::TITLE] = "";
             }
diff --git a/models/phrase_model.php b/models/phrase_model.php
index 6f0aa8a1e..db147d777 100755
--- a/models/phrase_model.php
+++ b/models/phrase_model.php
@@ -97,6 +97,15 @@ class PhraseModel extends Model
      */
     var $query_info;

+    /**
+     * A list of meta words that might be extracted from a query
+     * @var array
+     */
+    var $meta_words_list = array('link:', 'site:', 'version:', 'modified:',
+            'filetype:', 'info:', '\-', 'os:', 'server:', 'date:', "numlinks:",
+            'index:', 'i:', 'ip:', 'weight:', 'w:', 'u:', 'time:', 'code:',
+            'lang:', 'media:', 'elink:', 'location:', 'size:', 'host:', 'dns:',
+            'path:', 'robot:', 'safe:');

     /**
      * Number of pages to cache in one go in memcache or filecache
@@ -269,13 +278,15 @@ class PhraseModel extends Model
         }

         $results_high = $low + $results_per_page;
-        $num_last_parts = count($query_parts[$last_part]);
-        if($query_parts[$last_part][$num_last_parts - 1][0] +
-            $query_parts[$last_part][$num_last_parts - 1][1] < $low) {
-            $query_parts[$last_part][$num_last_parts - 1][1] = $results_high;
-        }
-
         $num_phrases = count($query_parts);
+        if($num_phrases > 0 ) {
+            $num_last_parts = count($query_parts[$last_part]);
+            if($query_parts[$last_part][$num_last_parts - 1][0] +
+                $query_parts[$last_part][$num_last_parts - 1][1] < $low) {
+                $query_parts[$last_part][$num_last_parts - 1][1] =
+                    $results_high;
+            }
+        }

         foreach($query_parts as $phrase => $pre_result_bounds) {

@@ -442,11 +453,7 @@ class PhraseModel extends Model
         $phrase = $this->parseIfConditions($phrase);
         $phrase_string = $phrase;
         $phrase_string = str_replace("&", "&amp;", $phrase_string);
-        $meta_words = array('link:', 'site:', 'version:', 'modified:',
-            'filetype:', 'info:', '\-', 'os:', 'server:', 'date:', "numlinks:",
-            'index:', 'i:', 'ip:', 'weight:', 'w:', 'u:', 'time:', 'code:',
-            'lang:', 'media:', 'elink:', 'location:', 'size:', 'host:', 'dns:',
-            'path:', 'robot:');
+        $meta_words = $this->meta_words_list;
         if(isset($this->additional_meta_words)) {
             $meta_words = array_merge($meta_words, array_keys(
                 $this->additional_meta_words));
@@ -497,21 +504,24 @@ class PhraseModel extends Model
                 CRAWL_DIR.'/cache/'.$index_archive_name);
         }

-        $phrase_string = mb_ereg_replace("&amp;", "ZZandZZ", $phrase_string);
-        $phrase_string = mb_ereg_replace(PUNCT, " ", $phrase_string);
-        $phrase_string = preg_replace("/(\s)+/", " ", $phrase_string);
-        $phrase_string = mb_ereg_replace('ZZandZZ', '&', $phrase_string);
+        $phrase_string = mb_ereg_replace("&amp;", "_and_", $phrase_string);
+
+        $query_string = mb_ereg_replace(PUNCT, " ", $phrase_string);
+        $query_string = preg_replace("/(\s)+/", " ", $query_string);
+        $query_string = mb_ereg_replace('_and_', '&', $query_string);
+        $phrase_string = mb_ereg_replace('_and_', '&', $phrase_string);

         /*
             we search using the stemmed/char-grammed words, but we format
             snippets in the results by bolding either
          */
-        $query_words = explode(" ", $phrase_string); //not stemmed
+        $query_words = explode(" ", $query_string); //not stemmed

-        $locale_tag = guessLocaleFromString($phrase_string);
-        $base_words =
-            PhraseParser::extractPhrases($phrase_string, MAX_PHRASE_LEN,
-            $locale_tag); //stemmed, if have stemmer
+        $locale_tag = guessLocaleFromString($query_string);
+        $base_words = //still use original phrase string here to handle acronyms
+            //abbreviations and the like that use periods
+            PhraseParser::extractPhrases($phrase_string, $locale_tag);
+                //stemmed, if have stemmer
         $words = array_merge($base_words, $found_metas);
         if(QUERY_STATISTICS) {
             $this->query_info['QUERY'] .= "$in3<i>Index</i>: ".
@@ -755,7 +765,8 @@ class PhraseModel extends Model
      *      and then potentially restored in cache
      * @param int $raw ($raw == 0) normal grouping, ($raw == 1)
      *      no grouping but page look-up for links, ($raw == 2)
-     *      no grouping done on data
+     *      no grouping done on data. If $raw > 0 no caching is done as will
+     *      likely come from a network query
      * @param array $queue_servers a list of urls of yioop machines which might
      *      be used during lookup
      * @param string $original_query if set, the original query that corresponds
@@ -775,7 +786,7 @@ class PhraseModel extends Model
             self::NUM_CACHE_PAGES;
         $start_slice = floor(($limit)/self::NUM_CACHE_PAGES) *
             self::NUM_CACHE_PAGES;
-        if(USE_CACHE) {
+        if(USE_CACHE && $raw == 0) {
             $mem_tmp = "";
             foreach($word_structs as $word_struct) {
                 $mem_tmp .= serialize($word_struct["KEYS"]).
@@ -852,10 +863,10 @@ class PhraseModel extends Model
         $result_count = count($pages);
         // initialize scores
         for($i = 0; $i < $result_count; $i++) {
-            $pages[$i][CrawlConstants::SCORE] = 0;
+            $pages[$i]["OUT_SCORE"] = 0;
         }
         $subscore_fields = array(self::DOC_RANK, self::RELEVANCE,
-            self::PROXIMITY);
+            self::PROXIMITY, self::SCORE);
         $num_fields = count($subscore_fields);
         // Compute Reciprocal Rank Fusion Score
         $alpha = 600/$num_fields;
@@ -870,12 +881,15 @@ class PhraseModel extends Model
                             $score++;
                         }
                     }
-                    $pages[$i][CrawlConstants::SCORE] += $alpha/(60 + $score);
+                    $pages[$i]["OUT_SCORE"] += $alpha/(60 + $score);
                 }
             }
-            orderCallback($pages[0], $pages[0], CrawlConstants::SCORE);
+            orderCallback($pages[0], $pages[0], "OUT_SCORE");
         }
         usort($pages, "orderCallback");
+        for($i = 0; $i < $result_count; $i++) {
+           $pages[$i][self::SCORE] = $pages[$i]["OUT_SCORE"];
+        }

         if($num_retrieved < $to_retrieve) {
             $results['TOTAL_ROWS'] = $num_retrieved;
@@ -885,7 +899,7 @@ class PhraseModel extends Model
         }


-        if(USE_CACHE) {
+        if(USE_CACHE && $raw  == 0) {
             for($i = 0; $i < $result_count; $i++){
                 unset($pages[$i][self::LINKS]);
             }
@@ -954,7 +968,6 @@ class PhraseModel extends Model
                 $restrict_phrases = $word_struct["RESTRICT_PHRASES"];
                 $disallow_keys = $word_struct["DISALLOW_KEYS"];
                 $index_archive = $word_struct["INDEX_ARCHIVE"];
-
                 $weight = $word_struct["WEIGHT"];
                 $num_word_keys = count($word_keys);
                 $total_iterators = count($distinct_word_keys);
@@ -967,7 +980,8 @@ class PhraseModel extends Model
                         new WordIterator($distinct_word_keys[$i],
                             $index_archive, false, $filter);
                     foreach ($word_keys as $index => $key) {
-                        if($key == $distinct_word_keys[$i]){
+                        if(isset($distinct_word_keys[$i]) &&
+                            $key == $distinct_word_keys[$i]){
                             $word_iterator_map[$index] = $i;
                         }
                     }
@@ -1011,10 +1025,10 @@ class PhraseModel extends Model
         }

         $raw = intval($raw);
+
         if ($raw == 2) {
             $group_iterator = $union_iterator;
         } else if ($raw == 1) {
-
             $group_iterator =
                 new GroupIterator($union_iterator, $total_iterators, true);
         } else {
diff --git a/models/profile_model.php b/models/profile_model.php
index 04a20517a..e87c7f469 100644
--- a/models/profile_model.php
+++ b/models/profile_model.php
@@ -53,8 +53,9 @@ class ProfileModel extends Model
             'DEFAULT_LOCALE', 'DEBUG_LEVEL', 'DBMS','DB_HOST',
             'DB_NAME', 'DB_USER', 'DB_PASSWORD',
             'NAME_SERVER', 'AUTH_KEY', "ROBOT_DESCRIPTION", 'WEB_URI',
-            'USE_MEMCACHE', 'MEMCACHE_SERVERS', 'USE_FILECACHE', 'CACHE_LINK',
-            'SIMILAR_LINK', 'IN_LINK', 'IP_LINK', 'SIGNIN_LINK',
+            'USE_MEMCACHE', 'MEMCACHE_SERVERS', 'USE_FILECACHE',
+            'WORD_SUGGEST', 'CACHE_LINK', 'SIMILAR_LINK',
+            'IN_LINK', 'IP_LINK', 'SIGNIN_LINK',
             'ROBOT_INSTANCE', "WEB_ACCESS", "RSS_ACCESS", "API_ACCESS",
             'TITLE_WEIGHT','DESCRIPTION_WEIGHT','LINK_WEIGHT');
     /**
@@ -79,7 +80,8 @@ class ProfileModel extends Model

         $to_make_dirs = array($directory, "$directory/locale",
             "$directory/cache", "$directory/schedules",
-            "$directory/log", "$directory/data", "$directory/app");
+            "$directory/log", "$directory/data", "$directory/app",
+            "$directory/prepare");
         $dir_status = array();
         foreach($to_make_dirs as $dir) {
             $dir_status[$dir] = $this->createIfNecessaryDirectory($dir);
diff --git a/models/searchfilters_model.php b/models/searchfilters_model.php
index 0ec8caaaf..88fb057cc 100644
--- a/models/searchfilters_model.php
+++ b/models/searchfilters_model.php
@@ -129,5 +129,52 @@ class SearchfiltersModel extends Model implements CrawlConstants
             serialize($hash_urls));

     }
+
+    /**
+     * Save/updates/deletes an override of a search engine result summary
+     * page. The information stored will be used instead of what was actually
+     * in the index when it comes to displaying search results for a page.
+     * It will not be used for looking up results.
+     *
+     * @param string $url url of a result page
+     * @param string $title the title to be used on SERP pages
+     * @param string $description the description from which snippets will
+     *      be generated.
+     */
+    function updateResultPage($url, $title, $description)
+    {
+        $result_pages = array();
+        $file_name = $this->dir_name."/result_pages.txt";
+        if(file_exists($file_name)) {
+            $result_pages = unserialize(file_get_contents($file_name));
+        }
+        $hash_url = crawlHash($url, true);
+        if($title == "" && $description == "") {
+            unset($result_pages[$hash_url]);
+        } else {
+            $result_pages[$hash_url] = array(
+                self::URL => $url, self::TITLE => $title,
+                self::DESCRIPTION => $description);
+        }
+        file_put_contents($file_name, serialize($result_pages));
+    }
+
+    /**
+     * Reads in and returns data on result pages whose summaries should
+     * be altered to something other than whats in the current index.
+     *
+     * @return array of summary pages for url for which the summary page
+     *      is being overrided -- the intention is this is not many
+     *      as how this is being done won't in general scale
+     */
+    function getEditedPageSummaries()
+    {
+        $result_pages = array();
+        $file_name = $this->dir_name."/result_pages.txt";
+        if(file_exists($file_name)) {
+            $result_pages = unserialize(file_get_contents($file_name));
+        }
+        return $result_pages;
+    }
 }
 ?>
diff --git a/scripts/autosuggest.js b/scripts/autosuggest.js
new file mode 100644
index 000000000..e91548cbc
--- /dev/null
+++ b/scripts/autosuggest.js
@@ -0,0 +1,226 @@
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * @author Sandhya Vissapragada
+ * @package seek_quarry
+ * @subpackage javascript
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2012s
+ * @filesource
+ */
+
+/**
+ * Steps to follow every time a key is up from the user end
+ */
+function askeyup(text_field) {
+    var input_term = text_field.value;
+    var results_dropdown = document.getElementById("aslist");
+    autosuggest(dictionary, input_term);
+    results_dropdown.innerHTML = search_list;
+    search_list = "";
+}
+
+/**
+ * To select a value from the dropdownlist and place in the search box
+ */
+function aslitem_click(liObj)
+{
+    var results_dropdown = document.getElementById("aslist");
+    var astobj = document.getElementById("search-name");
+    astobj.value = liObj.firstChild.innerHTML;
+    results_dropdown.innerHTML = "";
+}
+
+/**
+ * Fetch words from the Trie and add to seachList with <li> </li> tags
+ */
+function getValues(trie_array, parent_word, max_display)
+{
+    // Default to display top 6 words
+    max_display = (typeof max_display == 'undefined') ?
+        6 : max_display;
+    // Default end_marker is ' '
+    if (trie_array != null && last_word == false ) {
+        for (key in trie_array) {
+            if (key != end_marker ) {
+                getValues(trie_array[key], parent_word + key);
+            } else {
+                search_list += "<li onclick='aslitem_click(this);'><span>"
+                    + decode(parent_word) + "</span></li>";
+                count++;
+                if(count == max_display) {
+                    last_word = true;
+                }
+            }
+        }
+    }
+}
+
+
+/**
+ * Returns the sub trie_array under term in
+ * trie_array. If term does not exist in the trie_array
+ * returns false
+ *
+ * @param String term  what to look up
+ * @return Array trie_array sub trie_array under term
+ */
+function exist(trie_array, term)
+{
+    for(var i = 1; i< term.length; i++) {
+        if(trie_array == null){
+            return false;
+        }
+        if (trie_array != 'null') {
+            tmp = getUnicodeCharAndNextOffset(term, i);
+            if(tmp == false) return false;
+            [next_char, i] = tmp;
+            enc_char = encode(next_char);
+            if(trie_array[enc_char] != 'null') {
+                trie_array = trie_array[enc_char];
+            }
+        }
+        else {
+            return false;
+        }
+    }
+    return trie_array;
+}
+
+/**
+ * Entry point to find words for autosuggestion. Finds the portion of trie_aray
+ * beneath term. Then using this subtrie get the first six entries.
+ * Six is specified in get values.
+ *
+ * @param Array trie_array - a nested array represent a trie
+ * @param String term - what to look up suggestions for
+ * @sideeffect global Array search_list has list of first six entries
+ */
+function autosuggest(trie_array, term)
+{
+    //default end_marker is space
+    end_marker = (typeof end_marker == 'undefined') ?
+        " " : end_marker;
+    last_word = false;
+    count = 0;
+    search_list = "";
+    term = term.toLowerCase();
+    var tmp;
+    if(trie_array == null) {
+        return false;
+    }
+    if((term.length) > 1) {
+        tmp = getUnicodeCharAndNextOffset(term, 0);
+        if(tmp == false) return false;
+        [start_char, ] = tmp;
+        enc_chr = encode(start_char);
+        trie_array = exist(trie_array[enc_chr], term);
+
+    } else {
+        trie_array = trie_array[term];
+    }
+    getValues(trie_array, term);
+}
+
+/* wrappers to save typing */
+function decode(str) {
+    str = str.replace(/\+/g, '%20');
+    return decodeURIComponent(str);
+}
+/* wrappers to save typing */
+function encode(str)
+{
+    return encodeURIComponent(str);
+}
+
+/**
+ * Extract next Unicode Char beginning at offset i in str returns Array
+ * with this character and the next offset
+ *
+ * This is based on code found at:
+ * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects
+ * /String/charAt
+ *
+ * @param String str what to get the next character out of
+ * @param int i current offset into str
+ * @return Array pair of Unicode character beginning at i and the next offset
+ */
+function getUnicodeCharAndNextOffset(str, i)
+{
+    var code = str.charCodeAt(i);
+    if (isNaN(code)) {
+        return '';
+    }
+    if (code < 0xD800 || code > 0xDFFF) {
+        return [str.charAt(i), i];
+    }
+    if (0xD800 <= code && code <= 0xDBFF) {
+        if (str.length <= i + 1) {
+            return false;
+        }
+        var next = str.charCodeAt(i + 1);
+        if (0xDC00 > next || next > 0xDFFF) {
+            return false;
+        }
+        return [str.charAt(i) + str.charAt(i + 1), i + 1];
+    }
+    if (i === 0) {
+        return false;
+    }
+    var prev = str.charCodeAt(i-1);
+    if (0xD800 > prev || prev > 0xDBFF) {
+        return false;
+    }
+    return [str.charAt(i + 1), i + 1];
+}
+
+/**
+ * Load the Trie(compressed with .gz extension) during the launch of website
+ * Trie's are represented using nested arrays.
+ */
+function loadTrie()
+{
+    var xmlhttp;
+    if (window.XMLHttpRequest) {
+        // code for IE7i+, Firefox, Chrome, Opera, Safari
+        xmlhttp=new XMLHttpRequest();
+    } else {
+        // code for IE6, IE5
+        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
+    }
+    xmlhttp.onreadystatechange = function() {
+        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
+            trie = JSON.parse(xmlhttp.responseText);
+            dictionary = trie["trie_array"]
+            end_marker = trie["end_marker"]
+        }
+    }
+    locale = document.documentElement.lang
+    if(locale) {
+        trie_loc = "./?c=resource&a=suggest&locale="+locale;
+        xmlhttp.open("GET", trie_loc, true);
+        xmlhttp.send();
+    }
+}
+document.getElementsByTagName("body")[0].onload = loadTrie;
diff --git a/scripts/basic.js b/scripts/basic.js
index 1f4762cdd..94baad39c 100755
--- a/scripts/basic.js
+++ b/scripts/basic.js
@@ -37,9 +37,9 @@
  */
 function doMessage(msg)
 {
-    messageTag = document.getElementById("message");
-    messageTag.innerHTML = msg;
-    msgTimer = setInterval("undoMessage()", 2000);
+    message_tag = document.getElementById("message");
+    message_tag.innerHTML = msg;
+    msg_timer = setInterval("undoMessage()", 2000);
 }

 /*
@@ -48,9 +48,9 @@ function doMessage(msg)
  */
 function undoMessage()
 {
-    messageTag = document.getElementById("message");
-    messageTag.innerHTML = "";
-    clearInterval(msgTimer);
+    message_tag = document.getElementById("message");
+    message_tag.innerHTML = "";
+    clearInterval(msg_timer);
 }

 /*
@@ -61,28 +61,18 @@ function undoMessage()
 function makeRequest()
 {
     try {
-
         request = new XMLHttpRequest();
-
     } catch(e) {
-
         try {
             request = new ActiveXObject('MSXML2.XMLHTTP');
         } catch(e) {
-
             try {
-
             request = new ActiveXObject('Microsoft.XMLHTTP');
-
             } catch(e) {
-
             return false;
-
             }
-
         }
     }
-
     return request;
 }

diff --git a/tests/phrase_parser_test.php b/tests/phrase_parser_test.php
new file mode 100644
index 000000000..3b9c2d253
--- /dev/null
+++ b/tests/phrase_parser_test.php
@@ -0,0 +1,240 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @package seek_quarry
+ * @subpackage test
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2012
+ * @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ *  Load the url parser library we'll be testing
+ */
+require_once BASE_DIR."/lib/phrase_parser.php";
+
+/**
+ *  Used to test that the PhraseParser class. Want to make sure bigram
+ *  extracting works correctly
+ *
+ *  @author Chris Pollett
+ *  @package seek_quarry
+ *  @subpackage test
+ */
+class PhraseParserTest extends UnitTest
+{
+    /**
+     * PhraseParser uses static methods so doesn't do anything right now
+     */
+    public function setUp()
+    {
+    }
+
+    /**
+     * PhraseParser uses static methods so doesn't do anything right now
+     */
+    public function tearDown()
+    {
+    }
+
+    /**
+     * Tests the ability of extractPhrasesInLists to extract some hard-case
+     * phrases and acronyms
+     */
+    public function extractPhrasesTestCase()
+    {
+        $phrase_string = <<< EOD
+THE THE
+‘Deep Space nine’ ‘Deep Space’ version of GIANT
+©2012
+EOD;
+        $word_lists = PhraseParser::extractPhrasesInLists($phrase_string,
+            "en-US", true);
+        $words = array_keys($word_lists);
+
+        $this->assertTrue(in_array("the the", $words), "Extract Bigram 1");
+        $this->assertTrue(in_array("deep space", $words), "Extract Bigram 2");
+        $this->assertTrue(in_array("deep", $words), "Unigrams still present 1");
+        $this->assertTrue(in_array("space", $words),"Unigrams still present 2");
+        $this->assertTrue(in_array("2012", $words), "Punctuation removal 1");
+        $phrase_string = <<< EOD
+THE . THE
+EOD;
+        $word_lists = PhraseParser::extractPhrasesInLists($phrase_string,
+            "en-US", true);
+        $words = array_keys($word_lists);
+
+        $this->assertFalse(in_array("the the", $words), "No Bigram when ".
+            "punctuation present");
+
+        $phrase_string = <<< EOD
+ 百度一下,你就知道
+ .. 知 道 MP3 图 片 视 频 地 图 输入法 手写
+拼音 关闭 空间 百科 hao123 | 更多>>
+About Baidu
+EOD;
+
+        $word_lists = PhraseParser::extractPhrasesInLists($phrase_string,
+            "zh-CN", true);
+        $words = array_keys($word_lists);
+        $this->assertTrue(in_array("百度", $words), "Chinese test 1");
+        $this->assertTrue(in_array("mp3", $words), "Chinese test 2");
+        $this->assertTrue(in_array("ab", $words), "Chinese test 3");
+        $this->assertFalse(in_array("", $words), "Chinese test 4");
+        $this->assertFalse(in_array("下,", $words), "Chinese test 5");
+
+        $phrase_string = <<< EOD
+P.O. Box 765,  http://somewhere.edu.au
+
+negative) results.  bigram/trigram
+
+Simon & Somebody (1880b) analysed roughly
+
+the U.K. based newspaper,
+
+15, 2006, from http://www.yo.org/index.pl?a=b&c=d
+http://yo.lo.edu/faculty_pages/zebra/
+
+A&W a&TT chris@pollett.org
+Fish 'n chips
+EOD;
+
+        $word_lists = PhraseParser::extractPhrasesInLists($phrase_string,
+            "en-US", true);
+        $words = array_keys($word_lists);
+        $this->assertTrue(in_array("_po", $words), "Acronym Test 1");
+        $this->assertTrue(in_array("_uk", $words), "Acronym Test 2");
+        $this->assertTrue(in_array("a_and_w", $words), "Ampersand Test 1");
+        $this->assertTrue(in_array("a_and_tt", $words), "Ampersand Test 2");
+        $this->assertTrue(in_array("fish_and_chip", $words), "n for and test");
+        $this->assertTrue(in_array("chris_a_pollett_d_org", $words),
+            "Email Check 1");
+        $this->assertTrue(in_array(
+            "http_c__s__s_www_d_yo_d_org_s_index_d_pl_q_a_e_b_and_c_e_d",
+            $words), "URL Check 1");
+        $this->assertTrue(in_array(
+            "http_c__s__s_yo_d_lo_d_edu_s_faculty_pages_s_zebra_s_",
+            $words), "URL Check 2");
+    }
+
+    /**
+     * Checks whether the same search threshold can classify porn from
+     * non-porn sites. Sample were taken from a couple porn sites,
+     * sorted alphabetically by word and then some of the non sensitive words
+     * were substituted so as to avoid copyright issues. For the safe tests
+     * a similar process was done with the Wizard of Oz (now public domain)
+     * and with some sexually related Wikipedia articles (Creative Commons SA).
+     */
+    public function computeSafeSearchScoreTestCase()
+    {
+        $phrase_string = <<< EOD
+a a a a a a a a a a a a all and and
+and and and and and another any arose at aunt aunt be bed bed beds big
+build building by by called carried case cellar cellar chairs contained
+cookstove corner corner could crush cupboard cyclone dark dishes door
+dorothy dorothy down dug em em enough except family farmer farmer's floor
+floor for for four four from garret go great great ground had had henry
+henry hole hole house in in in in in in in into it it its kansas ladder led
+little lived looking lumber made many middle midst mighty miles no no of of
+of one one one or path prairies reached roof room room rusty small small
+small table the the the the the the the the the the the their there there
+this those three to to to trap uncle uncle wagon walls was was was was was
+were where which which whirlwinds who who wife with
+EOD;
+        $word_lists = PhraseParser::extractPhrasesInLists($phrase_string,
+            "en-US", true);
+        $len = strlen($phrase_string);
+        $score = PhraseParser::computeSafeSearchScore($word_lists, $len);
+        $this->assertTrue(($score < 0.012), "Easy Safe Test 1");
+
+        $phrase_string = <<< EOD
+a afraid all and anon baby big boobs but cock crave dicking does
+for from grown has how in is isnt knot lolita matts monster pussies ready
+she she shew slut teens their thom them thought they're tight to to to total
+up use whether
+EOD;
+        $word_lists = PhraseParser::extractPhrasesInLists($phrase_string,
+            "en-US", true);
+        $len = strlen($phrase_string);
+        $score = PhraseParser::computeSafeSearchScore($word_lists, $len);
+        $this->assertTrue(($score > 0.012), "Easy Unsafe Test 1");
+
+        $phrase_string = <<< EOD
+a a a a a adventure after all alotta amazing and and and and and
+and and and and and around as ball ball big body boobies bounce boy
+brunhilda came check check chilled cirque do enjoy ensued exercises
+flap friends fucking fucking give going gorge got got grabbing had
+had had has he hell her her horny i if in it it it it it jog junk
+just know little little loved me mean melons melons my my of on out out
+ploy precious kitties see she she she sought sizzle so so spent spicy
+started stretch sucking swinging that that that the the the then things
+those those those tit titties titty to to to togo today tramp truly
+us was we we we what what when what wild with with with workout wrap yes
+you
+EOD;
+        $word_lists = PhraseParser::extractPhrasesInLists($phrase_string,
+            "en-US", true);
+        $len = strlen($phrase_string);
+        $score = PhraseParser::computeSafeSearchScore($word_lists, $len);
+        $this->assertTrue(($score > 0.012), "Harder Unsafe Test 1");
+
+        $phrase_string = <<< EOD
+amino hog known a a a a an and and
+and and are are as as asymmetry be biology both but can cases cells
+combining combining contain deem distance each early evolved exist
+female female for firm firm from function gametes gametes gametes gametes
+genetic genentech has ideal in in in in information disinherit into intone
+is isopod known large mole mole many mixing motile motile necessary
+non nutrients of of of of offspring often optimized or organism organisms
+over parents process reproduce reproduce result sex sex sexual
+sexual small specialist specialized specific such that that the the the
+the their to to traits traits transport two types variety while young
+EOD;
+        $word_lists = PhraseParser::extractPhrasesInLists($phrase_string,
+            "en-US", true);
+        $len = strlen($phrase_string);
+        $score = PhraseParser::computeSafeSearchScore($word_lists, $len);
+        $this->assertTrue(($score < 0.012), "Harder Safe Test 1");
+
+        $phrase_string = <<< EOD
+a a active adverb an an and are as as as attribute be
+between by caught characterized daft describe describe desire desire deft
+french female female females having homosexuality identify in is language
+lesbian may moist verb object of of or or or others secondary refer relay
+romantic same sex sexual trim the the the them to to to to to used
+used who who wide women ward
+EOD;
+        $word_lists = PhraseParser::extractPhrasesInLists($phrase_string,
+            "en-US", true);
+        $len = strlen($phrase_string);
+        $score = PhraseParser::computeSafeSearchScore($word_lists, $len);
+        $this->assertTrue(($score < 0.012), "Harder Safe Test 2");
+
+    }
+}
+?>
diff --git a/tests/trie_test.php b/tests/trie_test.php
new file mode 100755
index 000000000..095c5cbe0
--- /dev/null
+++ b/tests/trie_test.php
@@ -0,0 +1,119 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @package seek_quarry
+ * @subpackage test
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2012
+ * @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ *  Load the Trie class we'll be testing
+ */
+require_once BASE_DIR."/lib/trie.php";
+/**
+ *  Load the crawlHash function
+ */
+require_once BASE_DIR.'/lib/utility.php';
+
+/**
+ *  Used to test that the Trie class properly stores words that
+ *  could be used for an autosuggest dictionary
+ *
+ *  @author Chris Pollett
+ *  @package seek_quarry
+ *  @subpackage test
+ */
+class TrieTest extends UnitTest
+{
+    /**
+     * We'll set up one Trie for testing purpose
+     */
+    public function setUp()
+    {
+        $this->test_objects["TRIE"] = new Trie();
+    }
+
+    /**
+     * Since a Trie is not a PersistentStructure we don't need to do
+     * anything to tear it down
+     */
+    public function tearDown()
+    {
+
+    }
+
+    /**
+     * Check if we add something into our Trie, add returns the correct
+     * sub-tree or false if does not exists
+     */
+    public function addTestCase()
+    {
+        $this->assertNotEqual(
+            $this->test_objects['TRIE']->add(
+                "hello"), false, "Successful add should not return false");
+        $this->assertEqual(serialize($this->test_objects['TRIE']->add(
+                "hell")), serialize(array("o" => array(" " => " "),
+                    " " => " ")),
+                "Add subsequence of an existing string should return subtree");
+    }
+
+    /**
+     * Check if we look up something in our Trie, that correct subtree
+     * is returned or false if does not exists
+     */
+    public function existsTestCase()
+    {
+        $this->test_objects['TRIE']->add("hello");
+        $this->test_objects['TRIE']->add("hell");
+        $this->assertEqual(serialize($this->test_objects['TRIE']->exists(
+                "hell")), serialize(array("o" => array(" " => " "),
+                    " " => " ")),
+                "Exists should return correct subtree");
+        $this->assertFalse($this->test_objects['TRIE']->exists(
+                "helmut"), "If not in Trie should get false");
+    }
+
+    /**
+     * Check that if we can get all the terms from a trie that begin
+     * with a given prefix
+     */
+    public function getValuesTestCase()
+    {
+        $this->test_objects['TRIE']->add("hello");
+        $this->test_objects['TRIE']->add("hell");
+        $this->test_objects['TRIE']->add("helmut");
+        $this->test_objects['TRIE']->add("handsome");
+        $this->test_objects['TRIE']->add("hen");
+        $this->assertEqual($this->test_objects['TRIE']->getValues("h", 5),
+            array("hello", "hell", "helmut", "hen", "handsome"),
+                "Returns first all in subtree");
+    }
+}
+?>
diff --git a/tests/url_parser_test.php b/tests/url_parser_test.php
index 1b67ffcfd..0ba88615a 100644
--- a/tests/url_parser_test.php
+++ b/tests/url_parser_test.php
@@ -40,7 +40,8 @@ require_once BASE_DIR."/lib/url_parser.php";

 /**
  *  Used to test that the UrlParser class. For now, want to see that the
- *  method canonicalLink is working correctly
+ *  method canonicalLink is working correctly and that
+ *  isPathMemberRegexPaths (used in robot_processor.php) works
  *
  *  @author Chris Pollett
  *  @package seek_quarry
@@ -138,6 +139,8 @@ class UrlParserTest extends UnitTest
                 "Substring Negative 1"),
             array("/bobby/", array("/bobby/bay", "/f/g/h/d", "/yo"), false,
                 "Substring Negative 2"),
+            array("/bay/bobby/", array("/bobby/", "/f/g/h/d", "/yo"), false,
+                "Substring Negative 3 (should match start)"),
             array("/a/bbbb/c/", array("/bobby/bay", "/a/*/c/", "/yo"), true,
                 "Star Positive 1"),
             array("/a/bbbb/d/", array("/bobby/bay", "/a/*/c/", "/yo"), false,
@@ -152,6 +155,9 @@ class UrlParserTest extends UnitTest
                 "Degenerate 1"),
             array("/test.html", array("/bobby/bay", "/**.html$", "/yo"), true,
                 "Degenerate 2"),
+            array("http://www.cs.sjsu.edu/faculty/pollett/",
+                 array("http://www.cs.sjsu.edu/faculty/pollett/*/*/"), false,
+                "URL Case 1"),
         );
         foreach ($tests as $test) {
             list($path, $robot_paths, $result, $description) = $test;
diff --git a/views/admin_view.php b/views/admin_view.php
index 585330e25..d2f1d6783 100755
--- a/views/admin_view.php
+++ b/views/admin_view.php
@@ -54,7 +54,7 @@ class AdminView extends View
     var $elements = array("language", "activity", "signin",
         "managecrawls", "manageaccount", "manageusers", "manageroles",
         "mixcrawls", "managelocales", "editlocales", "crawloptions",
-        "editmix", "pageoptions", "searchfilters",
+        "editmix", "pageoptions", "resultseditor",
         "managemachines", "machinelog", "editstatic", "configure");
     /** Names of helper objects that the view uses to help draw itself
      *  @var array
diff --git a/views/crawlstatus_view.php b/views/crawlstatus_view.php
index f21f06ad9..52df30fb8 100755
--- a/views/crawlstatus_view.php
+++ b/views/crawlstatus_view.php
@@ -240,7 +240,8 @@ class CrawlstatusView extends View
             ?></table>
         <?php
         } else {
-            e("<p class='red'>".tl('crawlstatus_view_no_previous_crawl')."</p>");
+            e("<p class='red'>".
+                tl('crawlstatus_view_no_previous_crawl')."</p>");
         }
         ?>
     <?php
diff --git a/views/elements/configure_element.php b/views/elements/configure_element.php
index d5b04a8bf..15ab7ae8a 100644
--- a/views/elements/configure_element.php
+++ b/views/elements/configure_element.php
@@ -187,7 +187,13 @@ class ConfigureElement extends Element
             </div>
             <div class="topmargin">
             <fieldset><legend><?php
-                e(tl('configure_element_search_results'))?></legend>
+                e(tl('configure_element_search_page'))?></legend>
+                <label for="wd-suggest"><input id='wd-suggest' type="checkbox"
+                    name="WORD_SUGGEST" value="true"
+                    <?php if(isset($data['WORD_SUGGEST']) &&
+                        $data['WORD_SUGGEST']){
+                        e("checked='checked'");}?>
+                    /><?php e(tl('configure_element_wd_suggest')); ?></label>
                 <label for="signin-link"><input id='signin-link' type="checkbox"
                     name="SIGNIN_LINK" value="true"
                     <?php if(isset($data['SIGNIN_LINK']) &&
diff --git a/views/elements/resultseditor_element.php b/views/elements/resultseditor_element.php
new file mode 100644
index 000000000..e7b8efd7a
--- /dev/null
+++ b/views/elements/resultseditor_element.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ *  SeekQuarry/Yioop --
+ *  Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
+ *
+ *  LICENSE:
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  END LICENSE
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @package seek_quarry
+ * @subpackage element
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2012
+ * @filesource
+ */
+
+if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
+
+/**
+ * Element used to control how urls are filtered out of search results
+ * (if desired) after a crawl has already been performed.
+ *
+ * @author Chris Pollett
+ *
+ * @package seek_quarry
+ * @subpackage element
+ */
+
+class ResultsEditorElement extends Element
+{
+
+    /**
+     * Draws the Screen for the Search Filter activity. This activity is
+     * used to filter urls out of the search results
+     *
+     * @param array $data keys used to store disallowed_sites
+     */
+    public function render($data)
+    {
+    ?>
+        <div class="currentactivity">
+        <h2><?php e(tl('resultseditor_element_edit_page'))?></h2>
+        <form id="urlLookupForm" method="post" action=''>
+        <div  class="topmargin"><b><label for="edited-result-pages"><?php
+            e(tl('resultseditor_element_edited_pages'))?></label>
+        <input type="hidden" name="c" value="admin" />
+        <input type="hidden" name="YIOOP_TOKEN" value="<?php
+            e($data['YIOOP_TOKEN']); ?>" />
+        <input type="hidden" name="a" value="resultsEditor" />
+        <input type="hidden" name="arg" value="load_url" />
+        <?php $this->view->optionsHelper->render(
+                "edited-result-pages", "LOAD_URL",
+                $data['URL_LIST'],
+                tl('resultseditor_element_url_list'));
+            ?><button class="buttonbox" type="submit" ><?php
+            e(tl('resultseditor_element_load_page'));
+            ?></button>
+        </div>
+        </form>
+
+        <form id="urlUpdateForm" method="post"
+            action='?c=admin&amp;a=resultsEditor&amp;YIOOP_TOKEN=<?php
+            e($data['YIOOP_TOKEN']); ?>' >
+        <div  class="topmargin">
+        <input type="hidden" name="arg" value="save_page" />
+        <b><label for="urlfield"><?php
+            e(tl('resultseditor_element_page_url'))?></label></b>
+        <input type="text" id="urlfield"
+            name="URL"  class="extrawidefield" value='<?php
+                e($data["URL"]); ?>' />
+        </div>
+        <div  class="topmargin">
+        <b><label for="titlefield"><?php
+            e(tl('resultseditor_element_page_title'))?></label></b>
+        <input type="text" id="titlefield"
+            name="TITLE"  class="extrawidefield" value='<?php
+                e($data["TITLE"]); ?>' />
+        </div>
+        <div class="topmargin"><label for="descriptionfield"><b><?php
+            e(tl('resultseditor_element_description'));
+                ?></b></label></div>
+        <textarea class="talltextarea" id="descriptionfield"
+            name="DESCRIPTION" ><?php e($data['DESCRIPTION']);
+        ?></textarea>
+        <div class="center slightpad"><button class="buttonbox"
+            type="reset"><?php e(tl('resultseditor_element_reset'));
+            ?></button> &nbsp;&nbsp; <button class="buttonbox"
+            type="submit" ><?php
+            e(tl('resultseditor_element_save_page'));
+            ?></button></div>
+        </form>
+        <h2><?php e(tl('resultseditor_element_filter_websites'))?></h2>
+        <form id="searchfiltersForm" method="post" action='?'>
+        <input type="hidden" name="c" value="admin" />
+        <input type="hidden" name="YIOOP_TOKEN" value="<?php
+            e($data['YIOOP_TOKEN']); ?>" />
+        <input type="hidden" name="a" value="resultsEditor" />
+        <input type="hidden" name="arg" value="urlfilter" />
+        <input type="hidden" name="posted" value="posted" />
+
+        <div class="topmargin"><label for="disallowed-sites"><b><?php
+            e(tl('resultseditor_element_sites_to_filter'));
+                ?></b></label></div>
+        <textarea class="talltextarea" id="disallowed-sites"
+            name="disallowed_sites" ><?php e($data['disallowed_sites']);
+        ?></textarea>
+
+        <div class="center slightpad"><button class="buttonbox"
+            type="submit"><?php e(tl('resultseditor_element_save_filter'));
+            ?></button></div>
+        </form>
+        </div>
+
+    <?php
+    }
+}
+?>
diff --git a/views/elements/searchfilters_element.php b/views/elements/searchfilters_element.php
deleted file mode 100644
index 990f96488..000000000
--- a/views/elements/searchfilters_element.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/**
- *  SeekQuarry/Yioop --
- *  Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- *  Copyright (C) 2009 - 2012  Chris Pollett chris@pollett.org
- *
- *  LICENSE:
- *
- *  This program is free software: you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation, either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- *  END LICENSE
- *
- * @author Chris Pollett chris@pollett.org
- * @package seek_quarry
- * @subpackage element
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
- * @copyright 2009 - 2012
- * @filesource
- */
-
-if(!defined('BASE_DIR')) {echo "BAD REQUEST"; exit();}
-
-/**
- * Element used to control how urls are filtered out of search results
- * (if desired) after a crawl has already been performed.
- *
- * @author Chris Pollett
- *
- * @package seek_quarry
- * @subpackage element
- */
-
-class SearchFiltersElement extends Element
-{
-
-    /**
-     * Draws the Screen for the Search Filter activity. This activity is
-     * used to filter urls out of the search results
-     *
-     * @param array $data keys used to store disallowed_sites
-     */
-    public function render($data)
-    {
-    ?>
-        <div class="currentactivity">
-
-        <h2><?php e(tl('searchfilters_element_filter_websites'))?></h2>
-        <form id="searchfiltersForm" method="post" action='?'>
-        <input type="hidden" name="c" value="admin" />
-        <input type="hidden" name="YIOOP_TOKEN" value="<?php
-            e($data['YIOOP_TOKEN']); ?>" />
-        <input type="hidden" name="a" value="searchFilters" />
-        <input type="hidden" name="arg" value="options" />
-        <input type="hidden" name="posted" value="posted" />
-
-        <div class="topmargin"><label for="disallowed-sites"><b><?php
-            e(tl('searchfilters_element_sites_to_filter'));
-                ?></b></label></div>
-        <textarea class="shorttextarea" id="disallowed-sites"
-            name="disallowed_sites" ><?php e($data['disallowed_sites']);
-        ?></textarea>
-
-        <div class="center slightpad"><button class="buttonbox"
-            type="submit"><?php e(tl('searchfilters_element_save_options'));
-            ?></button></div>
-        </form>
-        </div>
-
-    <?php
-    }
-}
-?>
diff --git a/views/layouts/web_layout.php b/views/layouts/web_layout.php
index 11d97a569..ce027c7f7 100755
--- a/views/layouts/web_layout.php
+++ b/views/layouts/web_layout.php
@@ -89,7 +89,8 @@ class WebLayout extends Layout

         </head>
         <body class="html-<?php e($data['BLOCK_PROGRESSION']);?> html-<?php
-            e($data['LOCALE_DIR']);?> html-<?php e($data['WRITING_MODE']);?>">
+            e($data['LOCALE_DIR']);?> html-<?php e($data['WRITING_MODE']);?>"
+            >
             <div id="message" ></div>
             <?php
                 $this->view->renderView($data);
diff --git a/views/search_view.php b/views/search_view.php
index c7c572d20..0d80f846a 100755
--- a/views/search_view.php
+++ b/views/search_view.php
@@ -76,20 +76,26 @@ class SearchView extends View implements CrawlConstants
         $this->signinElement->render($data);
         if(!isset($data['PAGES'])) {
             e('<div class="landing">');
-        }
-        ?>
+        } ?>
         <h1 class="logo"><a href="./?YIOOP_TOKEN=<?php
             e($data['YIOOP_TOKEN'])?>"><img
-            src="resources/yioop.png" alt="<?php e(tl('search_view_title')); ?>"
+            src="resources/yioop.png" alt="<?php e(tl('search_view_title')); ?>"
             /></a></h1>
+        <?php
+        if(isset($data['PAGES'])) {
+            e('<div class="serp">');
+        }
+        ?>
         <div class="searchbox">
-
         <form id="searchForm" method="get" action='?'>
         <p>
         <input type="hidden" name="YIOOP_TOKEN" value="<?php
             e($data['YIOOP_TOKEN']); ?>" />
         <input type="hidden" name="its" value="<?php e($data['its']); ?>" />
-        <input type="text" title="<?php e(tl('search_view_input_label')); ?>"
+        <input type="text" <?php if(WORD_SUGGEST) { ?>
+            autocomplete="off"  onkeyup="askeyup(this)"
+            <?php } ?>
+            title="<?php e(tl('search_view_input_label')); ?>"
             id="search-name" name="q" value="<?php if(isset($data['QUERY'])) {
             e(urldecode($data['QUERY']));} ?>"
             placeholder="<?php e(tl('search_view_input_placeholder')); ?>" />
@@ -97,10 +103,16 @@ class SearchView extends View implements CrawlConstants
             e(tl('search_view_search')); ?></button>
         </p>
         </form>
+            </div>
+        <div class="dropdown">
+            <ul id="aslist" class="autoresult">
+            </ul>
         </div>
         <?php
         if(isset($data['PAGES'])) {
             ?>
+            </div>
+            <div class="serp-results">
             <h2><?php e(tl('search_view_query_results')); ?> (<?php
                 e(tl('search_view_calculated', $data['ELAPSED_TIME']));?> <?php
                 e(tl('search_view_results', $data['LIMIT'],
@@ -208,12 +220,13 @@ class SearchView extends View implements CrawlConstants
             $this->paginationHelper->render(
                 $data['PAGING_QUERY']."&amp;YIOOP_TOKEN=".$data['YIOOP_TOKEN'],
                 $data['LIMIT'], $data['RESULTS_PER_PAGE'], $data['TOTAL_ROWS']);
+            e("</div>");
         }
         ?><div class="landing-footer">
             <div><b><?php e($data['INDEX_INFO']);?></b> <?php
             if(isset($data["HAS_STATISTICS"]) && $data["HAS_STATISTICS"]) { ?>
             [<a href="index.php?YIOOP_TOKEN=<?php e($data['YIOOP_TOKEN']);
-                ?>&amp;c=statistics&its=<?php e($data['its']);?>"><?php
+                ?>&amp;c=statistics&amp;its=<?php e($data['its']);?>"><?php
                 e(tl('search_view_more_statistics')); ?></a>]
             <?php }?>
             </div>
diff --git a/views/static_view.php b/views/static_view.php
index c88b0d356..4ecd063ea 100644
--- a/views/static_view.php
+++ b/views/static_view.php
@@ -48,7 +48,7 @@ class StaticView extends View
     /** This view is makes use of the localized static page overview.thtml
      *  @var array
      */
-    var $pages = array('privacy', 'blog', 'bot', "404");
+    var $pages = array('privacy', 'blog', 'bot', "404", "409");

     /** Names of element objects that the view uses to display itself
      *  @var array
diff --git a/views/view.php b/views/view.php
index 092cb15e2..491598dc5 100755
--- a/views/view.php
+++ b/views/view.php
@@ -117,8 +117,16 @@ abstract class View

         //read in localized static page elements
         foreach($this->pages as $page) {
-            $page_string = file_get_contents(
-                LOCALE_DIR."/".getLocaleTag()."/pages/".$page.".thtml");
+            $page_file = LOCALE_DIR."/".getLocaleTag()."/pages/".$page.".thtml";
+            $fallback = LOCALE_DIR."/".DEFAULT_LOCALE."/pages/".$page.".thtml";
+
+            if(file_exists($page_file)) {
+                $page_string = file_get_contents($page_file);
+            } else if (file_exists($fallback)) {
+                $page_string = file_get_contents($fallback);
+            } else {
+                $page_string = "";
+            }
             $page_parts = explode("END_HEAD_VARS", $page_string);
             $this->head_objects[$page] = array();
             if(count($page_parts) > 1) {
ViewGit