Changes CMS Detectors to Web Scrapers, performs code simplification on previous CMS Detectory code, reworks database version upgrades to reduce file sizes required by default, a=chris

Chris Pollett [2016-09-15 04:Sep:th]
Changes CMS Detectors to Web Scrapers, performs code simplification on previous CMS Detectory code, reworks database version upgrades to reduce file sizes required by default, a=chris
Filename
src/configs/Config.php
src/configs/Createdb.php
src/configs/PublicHelpPages.php
src/controllers/AdminController.php
src/controllers/FetchController.php
src/controllers/components/CrawlComponent.php
src/css/search.css
src/data/default.db
src/executables/Fetcher.php
src/index.php
src/library/CrawlConstants.php
src/library/ScraperManager.php
src/library/UpgradeFunctions.php
src/library/VersionFunctions.php
src/library/cms_detectors/CmsDetector.php
src/library/cms_detectors/DrupalDetector.php
src/library/cms_detectors/UniversalDetector.php
src/library/cms_detectors/WordpressDetector.php
src/library/processors/HtmlProcessor.php
src/locale/ar/configure.ini
src/locale/bn/configure.ini
src/locale/de/configure.ini
src/locale/en_US/configure.ini
src/locale/es/configure.ini
src/locale/fa/configure.ini
src/locale/fr_FR/configure.ini
src/locale/he/configure.ini
src/locale/hi/configure.ini
src/locale/in_ID/configure.ini
src/locale/it/configure.ini
src/locale/ja/configure.ini
src/locale/kn/configure.ini
src/locale/ko/configure.ini
src/locale/nl/configure.ini
src/locale/pl/configure.ini
src/locale/pt/configure.ini
src/locale/ru/configure.ini
src/locale/te/configure.ini
src/locale/th/configure.ini
src/locale/tr/configure.ini
src/locale/vi_VN/configure.ini
src/locale/zh_CN/configure.ini
src/models/CmsModel.php
src/models/ProfileModel.php
src/models/ScraperModel.php
src/views/elements/CmsDetectorsElement.php
src/views/elements/ScrapersElement.php
tests/CmsDetectorTest.php
tests/ScraperManagerTest.php
tests/test_files/cms_detector/Drupal01.txt
tests/test_files/cms_detector/Drupal02.txt
tests/test_files/cms_detector/Drupal03.txt
tests/test_files/cms_detector/Drupal04.txt
tests/test_files/cms_detector/Joomla01.txt
tests/test_files/cms_detector/SiteCore01.txt
tests/test_files/cms_detector/SiteCore02.txt
tests/test_files/cms_detector/Wordpress01.txt
tests/test_files/cms_detector/Wordpress02.txt
tests/test_files/cms_detector/Wordpress03.txt
tests/test_files/cms_detector/Wordpress04.txt
tests/test_files/cms_detector/Yioop01.txt
tests/test_files/cms_detector/cms_detector_input.txt
tests/test_files/cms_detector/cms_detector_results.txt
tests/test_files/scrapers/test.php
tests/test_files/cms_detector/vBulletin01.txt
tests/test_files/cms_detector/vBulletin02.txt
diff --git a/src/configs/Config.php b/src/configs/Config.php
index 2671a0ea2..52a175ffd 100755
--- a/src/configs/Config.php
+++ b/src/configs/Config.php
@@ -112,7 +112,7 @@ function nsconddefine($constant, $value)
  * Version number for upgrade function
  * @var int
  */
-nsdefine('YIOOP_VERSION', 43);
+nsdefine('YIOOP_VERSION', 44);
 /**
  * Minimum Version fo Yioop for which keyword ad script
  * still works with this version
@@ -175,8 +175,6 @@ nsdefine('NS_EXEC', NS . "executables\\");
 nsdefine('NS_LIB', NS . "library\\");
 /** jobs sub-namespace */
 nsdefine('NS_JOBS', NS_LIB . "media_jobs\\");
-/** cms detectors sub-namespace */
-nsdefine('NS_DETECTORS', NS_LIB . "cms_detectors\\");
 /** Models sub-namespace */
 nsdefine('NS_MODELS', NS . "models\\");
 /** datasources sub-namespace */
@@ -910,7 +908,6 @@ nsdefine('ZKP_PASSWORD_LEN', 200);
  *
  /** Truncate length for ad description and keywords*/
 nsdefine('ADVERTISEMENT_TRUNCATE_LEN', 8);
-
 /** Initial bid amount for advertisement keyword */
 nsconddefine('AD_KEYWORD_INIT_BID',1);
 /** Allows the root account to purchase free ad credits. Might
diff --git a/src/configs/Createdb.php b/src/configs/Createdb.php
index 78df219db..dabdd3749 100755
--- a/src/configs/Createdb.php
+++ b/src/configs/Createdb.php
@@ -341,9 +341,9 @@ $activities = [
         [
             "en-US" => 'Manage Advertisements',
         ]],
-    "cmsDetectors" => ['db_activity_cms_detectors',
+    "scrapers" => ['db_activity_scrapers',
         [
-            "en-US" => 'CMS Detectors',
+            "en-US" => 'Web Scrapers',
         ]]
 ];
 $i = 1;
@@ -397,8 +397,8 @@ $db->execute("INSERT INTO MEDIA_SOURCE VALUES ('1342634198',
     'Vimeo', 'video', 'http://player.vimeo.com/video/{}',
     'http://www.yioop.com/resources/blank.png?{}', '')");
 $db->execute("INSERT INTO MEDIA_SOURCE VALUES ('1342634199',
-    'Break.com', 'video', 'http://www.break.com/index/{}',
-    'http://www.yioop.com/resources/blank.png?{}', '')");
+    'Break.com', 'video', 'http://www.break.com/index/{}', '" .
+    NAME_SERVER . "/resources/blank.png?{}', '')");
 $db->execute("INSERT INTO MEDIA_SOURCE VALUES ('1342634200',
     'Yahoo News', 'rss', 'http://news.yahoo.com/rss/',
     '//content/@url', 'en-US')");
@@ -423,48 +423,37 @@ $db->execute("INSERT INTO TRANSLATION VALUES (1003,'db_subsearch_videos')");
 $db->execute("INSERT INTO SUBSEARCH VALUES ('db_subsearch_news',
     'news','m:4',20)");
 $db->execute("INSERT INTO TRANSLATION VALUES (1004,'db_subsearch_news')");
-$db->execute("INSERT INTO TRANSLATION VALUES (1004,'db_subsearch_news')");
-$sql = "INSERT INTO CMS_DETECTORS VALUES (?,?,?,?)";
-$name = "YIOOP!";
-$source_header = "c=resource&a=get&f=css&n=auxiliary\.css";
-$source_importantcontent = "";
-$db->execute($sql, [time(), $name, $source_header, $source_importantcontent]);
-
-$name = "DRUPAL";
-$source_header = "sites\/(?:default|all)\/(?:themes|modules|files)\/";
-$source_importantcontent = "//div[@id=\"content\"]" .
-    "###//div[@id=\"comments\"]" .
-    "###//div[@id=\"respond\"]" .
-    "###//div[@class=\"bottomcontainerBox\"]" .
-    "###//ul[@class=\"post-by\"]" .
-    "###//div[@class=\"entry-meta clear\"]";
-$db->execute($sql, [time(), $name, $source_header, $source_importantcontent]);
-
-$name = "SITECORE";
-$source_header = "\/system\/VisitorIdentification.js";
-$source_importantcontent = "//div[@class=\"container section\"]";
-$db->execute($sql, [time(), $name, $source_header, $source_importantcontent]);
-
-$name = "VBULLETIN";
-$source_header = "vBulletin";
-$source_importantcontent = "//div[@td\s+id=\"content\"]";
-$db->execute($sql, [time(), $name, $source_header, $source_importantcontent]);
-
-$name = "JOOMLA!";
-$source_header = "^\/media";
-$source_importantcontent = "";
-$db->execute($sql, [time(), $name, $source_header, $source_importantcontent]);
-
-$name = "WORDPRESS";
-$source_header = "wp-(?:content|includes)";
-$source_importantcontent = "//div[@id=\"content\"]" .
-    "###//div[@id=\"comments\"]" .
-    "###//div[@id=\"respond\"]" .
-    "###//div[@class=\"bottomcontainerBox\"]" .
-    "###//ul[@class=\"post-by\"]" .
-    "###//div[@class=\"entry-meta clear\"]";
-$db->execute($sql, [time(), $name, $source_header, $source_importantcontent]);
-
+$sql = "INSERT INTO SCRAPER(NAME, SIGNATURE, SCRAPE_RULES) VALUES (?,?,?)";
+$scrapers = [
+    ["YIOOP", "/html/head/*[contains(@href,".
+        "'c=resource&a=get&f=css&n=auxiliary.css')]",
+        ""],
+    ["DRUPAL", "/html/head/*[contains(@href, '/sites/all/themes')" .
+        " or contains(@href, '/sites/default/files')]",
+        "//div[@id=\"content\"]" .
+        "###//div[@id=\"comments\"]" .
+        "###//div[@id=\"respond\"]" .
+        "###//div[@class=\"bottomcontainerBox\"]" .
+        "###//ul[@class=\"post-by\"]" .
+        "###//div[@class=\"entry-meta clear\"]"],
+    ["SITECORE", "/html/head/*[contains(@src,".
+        "'/system/VisitorIdentification.js')]",
+        "//div[@class=\"container section\"]"],
+    ["VBULLETIN", "/html/head/*[contains(@href,'vbulletin')]",
+        "//div[@td\s+id=\"content\"]"],
+    ["JOOMLA!", "/html/head/script[text()[contains(.,'Joomla')]]", ""],
+    ["WORDPRESS", "/html/head/*[contains(@href, 'wp-content')".
+        " or contains(@href, 'wp-includes')]",
+        "//div[@id=\"content\"]" .
+        "###//div[@id=\"comments\"]" .
+        "###//div[@id=\"respond\"]" .
+        "###//div[@class=\"bottomcontainerBox\"]" .
+        "###//ul[@class=\"post-by\"]" .
+        "###//div[@class=\"entry-meta clear\"]"]
+    ];
+foreach ($scrapers as $scraper) {
+    $db->execute($sql, $scraper);
+}
 $subsearch_translations = [
     'db_subsearch_images' => [
         'en-US' => 'Images',
diff --git a/src/configs/PublicHelpPages.php b/src/configs/PublicHelpPages.php
index 301cc9f34..30d9614c7 100644
--- a/src/configs/PublicHelpPages.php
+++ b/src/configs/PublicHelpPages.php
@@ -1804,6 +1804,44 @@ their password on their own;
 * '''Email Link Password Recovery''', a user can specify their login and get emailed a password change link;
 * '''Email Link and Check Questions Recovery''', a user can specify their login and get emailed a password change link. The password change page requires the user correctly answers previously provided recovery questions.
 EOD;
+$help_pages["en-US"]["Scrapers"] = <<< EOD
+page_type=standard
+
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+alternative_path=
+
+page_header=
+
+page_footer=
+
+sort=aname
+
+END_HEAD_VARS&#039;&#039;&#039;Web Scrapers&#039;&#039;&#039; are used to help Yioop get to the most important content on a web page during. When Yioop crawls it tries to extract the most important content of a page into a succinct summary. It then indexes just this summary. Web pages generated by a content management system such as Wordpress have a reasonably standard format and a web scraper can be used to isolated the sub-portion of a web page which is more likely to have useful content. Below we describe how to use Web Scraper activity to make a new scraper or view existing one.
+
+A Web Scraper must have a &#039;&#039;&#039;Name&#039;&#039;&#039;. The Signature and Scrape Rules fields are optional but at least one of them must be present for the web scraper to have effect while crawling.
+
+&#039;&#039;&#039;Signature&#039;&#039;&#039; is used to detect when a particular Web Scraper should be used. It should consist of an XPath query which would evaluate to a non-empty set of elements in the case of a page the scraper might work for. For example,
+
+&#039;&#039;&#039;Scrape Rules&#039;&#039;&#039; are used to specify the most important content for summarization. This field should consist of one or more XPaths, with (###) used to indicate when one XPath ends and the next begins. Yioop will scrape the page by applying the first XPath to locate the important content region of the page and using the remaining XPaths to remove unnecessary sub-content from this region.
+
+&#039;&#039;&#039;Example:&#039;&#039;&#039;
+
+&lt;table border=&#039;1&#039;&gt;
+&lt;th&gt;Setting&lt;/th&gt; &lt;th&gt;Value&lt;/th&gt; &lt;tr&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;Wordpress&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;th&gt;Signature&lt;/th&gt;&lt;td&gt;/html/head/*[contains(@href, &#039;wp-content&#039;) or contains(@href, &#039;wp-includes&#039;)]&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;th&gt;Scrape Rules&lt;/th&gt;&lt;td&gt;//div[@id=&quot;content&quot;]###&lt;br /&gt;//div[@id=&quot;comments&quot;]###&lt;br /&gt;//div[@id=&quot;respond&quot;]&lt;/td&gt;&lt;/tr&gt; &lt;/table&gt; &lt;br /&gt;
+EOD;
 $help_pages["en-US"]["Search_Results_Editor"] = <<< EOD
 page_type=standard

diff --git a/src/controllers/AdminController.php b/src/controllers/AdminController.php
index 2074eccca..1a11dd418 100755
--- a/src/controllers/AdminController.php
+++ b/src/controllers/AdminController.php
@@ -71,8 +71,8 @@ class AdminController extends Controller implements CrawlConstants
     public static $component_activities = [
         "accountaccess" =>
             ["signin", "manageAccount", "manageUsers", "manageRoles"],
-        "crawl" => ["manageCrawls", "manageClassifiers", "pageOptions",
-            "resultsEditor", "searchSources", "cmsDetectors"],
+        "crawl" => ["manageCrawls", "pageOptions", "searchSources",
+            "resultsEditor", "scrapers", "manageClassifiers"],
         "social" => ["manageGroups", "groupFeeds", "mixCrawls", "wiki"],
         "advertisement" => ["manageCredits", "manageAdvertisements"],
         "system" => ["manageMachines", "manageLocales", "serverSettings",
diff --git a/src/controllers/FetchController.php b/src/controllers/FetchController.php
index bfc3d31d2..5ad1748eb 100755
--- a/src/controllers/FetchController.php
+++ b/src/controllers/FetchController.php
@@ -586,6 +586,7 @@ class FetchController extends Controller implements CrawlConstants
                 }
             }
         }
+        $info[self::SCRAPERS] = $this->model("scraper")->getAllScrapers();
         $info[self::QUEUE_SERVERS] =
             $this->model("machine")->getQueueServerUrls();
         $info[self::SAVED_CRAWL_TIMES] = $this->getCrawlTimes();
diff --git a/src/controllers/components/CrawlComponent.php b/src/controllers/components/CrawlComponent.php
index fcf09f39d..c42f6c9c4 100644
--- a/src/controllers/components/CrawlComponent.php
+++ b/src/controllers/components/CrawlComponent.php
@@ -1330,31 +1330,23 @@ class CrawlComponent extends Component implements CrawlConstants
         return $data;
     }
     /**
-     * Handles admin request related to the CMS Detectors activity
+     * Handles admin request related to the Scrapers activity
      *
      * This activity allows a user to specify the configuration for the
-     * ways we detect CMSs
+     * ways we detect Scrapers
      *
-     * @return array $data info about the CMS detectors settings
+     * @return array $data info about the Scraper settings
      */
-    public function cmsDetectors()
+    public function scrapers()
     {
         $parent = $this->parent;
         $crawl_model = $parent->model("crawl");
-        $source_model = $parent->model("cms");
-        $possible_arguments = ["addsource", "deletesource",
-            "editsource"];
+        $scraper_model = $parent->model("scraper");
+        $possible_arguments = ["add", "delete", "edit"];
         $request_fields = ['start_row', 'num_show', 'end_row'];
         $data = [];
-        $data["ELEMENT"] = "cmsDetectors";
+        $data["ELEMENT"] = "scrapers";
         $data['SCRIPT'] = "";
-        if (isset($_SESSION['USER_ID'])) {
-            $user = $_SESSION['USER_ID'];
-        } else {
-            $user = $_SERVER['REMOTE_ADDR'];
-        }
-        $data['CMS_DETECTORS_SETTINGS'] =
-            $source_model->getsCmsDetectorsSettings($user);
         $n = C\NUM_RESULTS_PER_PAGE;
         $data['PER_PAGE'] = [$n => $n, 2*$n => 2*$n, 5*$n=> 5*$n,
             10*$n=>10*$n];
@@ -1364,98 +1356,82 @@ class CrawlComponent extends Component implements CrawlConstants
         } else {
             $data['PER_PAGE_SELECTED'] = C\NUM_RESULTS_PER_PAGE;
         }
-        $locales = $parent->model("locale")->getLocaleList();
-        $data["LANGUAGES"] = [];
-        foreach ($locales as $locale) {
-            $data["LANGUAGES"][$locale['LOCALE_TAG']] = $locale['LOCALE_NAME'];
-        }
-        if (isset($_REQUEST['language']) &&
-            in_array($_REQUEST['language'],
-                array_keys($data["LANGUAGES"]))) {
-            $data['SOURCE_LOCALE_TAG'] =
-                $_REQUEST['language'];
-        } else {
-            $data['SOURCE_LOCALE_TAG'] = C\DEFAULT_LOCALE;
-        }
-        $data["CURRENT_CMS_DETECTORS"] = [
-            "name" => "", "header" => "",
-            "important_content" => ""];
-        $data['SOURCE_FORM_TYPE'] = "addsource";
+        $data["CURRENT_SCRAPER"] = [
+            "name" => "", "signature" => "",
+            "scrape_rules" => ""];
+        $data['FORM_TYPE'] = "add";
         if (isset($_REQUEST['arg']) &&
             in_array($_REQUEST['arg'], $possible_arguments)) {
             switch ($_REQUEST['arg'])
             {
-                case "addsource":
-                    if (! $_REQUEST['name']) {
+                case "add":
+                    if (empty($_REQUEST['name']) ||
+                        empty($_REQUEST['signature']) ||
+                        empty($_REQUEST['scrape_rules'])) {
                         return $parent->redirectWithMessage(
-                            tl('crawl_component_cmsdetectors_no_name'),
+                            tl('crawl_component_scraper_missing fields'),
                             $request_fields);
                     }
-                    $source_model->addCmsDetectors(
-                        $_REQUEST['name'], $_REQUEST['header'],
-                        $_REQUEST['important_content']);
+                    $scraper_model->add(
+                        $parent->clean($_REQUEST['name'], "string"),
+                        $parent->clean($_REQUEST['signature'], "string"),
+                        $parent->clean($_REQUEST['scrape_rules'], "string"));
                     return $parent->redirectWithMessage(
-                        tl('crawl_component_cmsdetectors_added'),
+                        tl('crawl_component_scraper_added'),
                         $request_fields);
                 break;
-                case "deletesource":
-                    if (!isset($_REQUEST['ts'])) {
+                case "delete":
+                    if (empty($_REQUEST['id'])) {
                         return $parent->redirectWithMessage(
-                            tl('crawl_component_no_delete_cmsdetectors'),
+                            tl('crawl_component_no_delete_scraper'),
                             $request_fields);
                     }
-                    $timestamp = $parent->clean($_REQUEST['ts'], "string");
-                    $source_model->deleteCmsDetectors($timestamp);
+                    $scraper_id = $parent->clean($_REQUEST['id'], "string");
+                    $scraper_model->delete($scraper_id);
                     return $parent->redirectWithMessage(
-                        tl('crawl_component_media_cmsdetectors_deleted'),
+                        tl('crawl_component_scraper_deleted'),
                         $request_fields);
                 break;
-                case "editsource":
-                    $data['SOURCE_FORM_TYPE'] = "editsource";
-                    $source = false;
-                    $timestamp = (isset($_REQUEST['ts'])) ?
-                        $parent->clean($_REQUEST['ts'], "string") : "";
-                    if ($timestamp) {
-                        $source = $source_model->getCmsDetectors($timestamp);
+                case "edit":
+                    $data['FORM_TYPE'] = "edit";
+                    $scraper = false;
+                    $scraper_id = (isset($_REQUEST['id'])) ?
+                        $parent->clean($_REQUEST['id'], "string") : "";
+                    if ($scraper_id) {
+                        $scraper = $scraper_model->get($scraper_id);
                     }
-                    if (!$source) {
-                        $data['SOURCE_FORM_TYPE'] = "addsource";
+                    if (!$scraper) {
+                        $data['FORM_TYPE'] = "add";
                         break;
                     }
-                    $data['ts'] = $timestamp;
+                    $data['id'] = $scraper_id;
                     $update = false;
-                    foreach ($data['CURRENT_CMS_DETECTORS']
-                        as $field => $value) {
+                    foreach ($data['CURRENT_SCRAPER'] as $field => $value) {
                         $upper_field = strtoupper($field);
                         if (isset($_REQUEST[$field]) && $field != 'name') {
-                            $source[$upper_field] = $parent->clean(
+                            $scraper[$upper_field] = $parent->clean(
                                 $_REQUEST[$field], "string");
-                            $data['CURRENT_CMS_DETECTORS'][$field] =
-                                $source[$upper_field];
+                            $data['CURRENT_SCRAPER'][$field] =
+                                $scraper[$upper_field];
                             $update = true;
-                        } else if (isset($source[$upper_field])){
-                            $data['CURRENT_CMS_DETECTORS'][$field] =
-                                $source[$upper_field];
+                        } else if (!empty($scraper[$upper_field])){
+                            $data['CURRENT_SCRAPER'][$field] =
+                                $scraper[$upper_field];
                         }
                     }
                     if ($update) {
-                        $source_model->updateCmsDetectors($source);
-                        $fields = array_merge(array("arg", "ts"),
+                        $scraper_model->update($scraper);
+                        $fields = array_merge(["arg", "id"],
                             $request_fields);
                         return $parent->redirectWithMessage(
-                            tl('crawl_component_cmsdetectors_updated'),
+                            tl('crawl_component_scraper_updated'),
                             $fields);
                     }
                 break;
             }
         }
-        $data['CAN_LOCALIZE'] = $parent->model("user")->isAllowedUserActivity(
-            $_SESSION['USER_ID'], "manageLocales");
-        $parent->pagingLogic($data, $source_model, "CMS_DETETCTORS",
+        $parent->pagingLogic($data, $scraper_model, "SCRAPERS",
             C\DEFAULT_ADMIN_PAGING_NUM/5, [["NAME", "", "", "ASC"]]);
-        $data['SCRIPT'] .= "source_type = elt('source-type');".
-            "source_type.onchange = switchSourceType;".
-            "switchSourceType()";
         return $data;
     }
     /**
@@ -1876,4 +1852,4 @@ class CrawlComponent extends Component implements CrawlConstants
             "switchSourceType()";
         return $data;
     }
-}
\ No newline at end of file
+}
diff --git a/src/css/search.css b/src/css/search.css
index 00e63e583..f500c0f82 100755
--- a/src/css/search.css
+++ b/src/css/search.css
@@ -2417,21 +2417,39 @@ div.group-result
     border: 1px ridge black;
     padding: 2px;
 }
-.cms-detectors-table
+.scrapers-table
 {
     border: 1px ridge black;
     padding: 2px;
-    width: 100%;
-    table-layout: fixed;
+    max-width: 6.5in;
 }
-.cms-detectors-table td,
-.cms-detectors-table th
+.scrapers-table td,
+.scrapers-table th
 {
     border: 1px ridge black;
+    max-width:2.5in;
     overflow-wrap: break-word;
     padding: 2px;
     word-wrap: break-word;
 }
+
+.mobile .scrapers-table
+{
+    border: 1px ridge black;
+    padding: 2px;
+    max-width: 340px;
+}
+.mobile .scrapers-table td,
+.mobile .scrapers-table th
+{
+    border: 1px ridge black;
+    font-size: 11px;
+    max-width:50px;
+    overflow-wrap: break-word;
+    padding: 2px;
+    word-wrap: break-word;
+}
+
 .mixes-table td
 {
     font-size:12pt;
diff --git a/src/data/default.db b/src/data/default.db
index 23a3b6084..97504fcc2 100644
Binary files a/src/data/default.db and b/src/data/default.db differ
diff --git a/src/executables/Fetcher.php b/src/executables/Fetcher.php
index 43cf02d0d..0ab471e81 100755
--- a/src/executables/Fetcher.php
+++ b/src/executables/Fetcher.php
@@ -342,6 +342,13 @@ class Fetcher implements CrawlConstants
      * @var array
      */
     public $active_classifiers;
+    /**
+     * Contains an array of scrapers used to extract the import content
+     * from particular kind of HTML pages, for example, pages generated by
+     * a particular content management system.
+     * @var array
+     */
+    public $scrapers;
     /**
      * Contains which classifiers to use for the current crawl
      * that are being used to rank web documents. The score that the
@@ -420,6 +427,7 @@ class Fetcher implements CrawlConstants
         $this->page_processors = PageProcessor::$mime_processor;
         $this->indexed_file_types = PageProcessor::$indexed_file_types;
         $this->all_file_types = PageProcessor::$indexed_file_types;
+        $this->scrapers = [];
         $this->plugin_hash = "";
         $this->restrict_sites_by_url = false;
         $this->allowed_sites = [];
@@ -497,6 +505,9 @@ class Fetcher implements CrawlConstants
             $processor_cache[$type] = new $page_processor([],
                 $this->max_description_len,
                 $this->summarizer_option);
+        }
+        if ($page_processor == "HtmlProcessor") {
+
         }
         if (L\generalIsA($page_processor, $text_processor)) {
             $processor_cache[$type]->text_data = true;
@@ -1441,6 +1452,9 @@ class Fetcher implements CrawlConstants
                 $this->plugin_processors[$processor] = array_values($plugins);
             }
         }
+        if (isset($info[self::SCRAPERS]) ) {
+            $this->scrapers = $info[self::SCRAPERS];
+        }
         if (isset($info[self::POST_MAX_SIZE]) && ($this->post_max_size >
             $info[self::POST_MAX_SIZE] || !$this->post_max_size) ) {
             $this->post_max_size = $info[self::POST_MAX_SIZE];
@@ -1745,6 +1759,9 @@ class Fetcher implements CrawlConstants
                     $tmp_url_store = $site[self::URL];
                     $site[self::URL] = $site[self::FILE_NAME];
                 }
+                if (L\generalIsA($page_processor, "HtmlProcessor")) {
+                    $processor->scrapers = $this->scrapers;
+                }
                 $doc_info = $processor->handle($site[self::PAGE],
                     $site[self::URL]);
                 if (isset($site[self::REPOSITORY_TYPE]) &&
diff --git a/src/index.php b/src/index.php
index 4496d1329..6b85259ee 100755
--- a/src/index.php
+++ b/src/index.php
@@ -134,6 +134,11 @@ function bootstrap()
     }
     $locale_tag = L\getLocaleTag();
     if (L\upgradeDatabaseWorkDirectoryCheck()) {
+        /**
+         * Load global functions needed to upgrade between versions
+         * (note only do this if need to upgrade)
+         */
+        require_once C\BASE_DIR."/library/VersionFunctions.php";
         L\upgradeDatabaseWorkDirectory();
     }
     if (L\upgradeLocalesCheck($locale_tag)) {
diff --git a/src/library/CrawlConstants.php b/src/library/CrawlConstants.php
index d1a49bc24..dab8b7bb0 100755
--- a/src/library/CrawlConstants.php
+++ b/src/library/CrawlConstants.php
@@ -229,5 +229,6 @@ interface CrawlConstants
     const IMAGE_LINK = "dr";
     const GRAPH_BASED_SUMMARIZER = 'ds';
     const CENTROID_WEIGHTED_SUMMARIZER = 'dt';
-    const CMS_SYSTEM = 'du';
+    const SCRAPER_LABEL = 'du';
+    const SCRAPERS = 'dv';
 }
diff --git a/src/library/ScraperManager.php b/src/library/ScraperManager.php
new file mode 100644
index 000000000..f468c5ea7
--- /dev/null
+++ b/src/library/ScraperManager.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2016  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 Charles Bocage (charles.bocage@sjsu.edu)
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2016
+ * @filesource
+ */
+namespace seekquarry\yioop\library;
+
+/**
+ * Class used by html processors to detect if a page was made by a content
+ * management system, and also to provide scraping mechanisms for the content
+ * of such a page
+ *
+ * @author Charles Bocage (charles.bocage@sjsu.edu)
+ */
+class ScraperManager
+{
+    /**
+     * Method used to check a page against a supplied list of scrapers
+     * for a matching signature. If a match is found that scraper is returned.
+     *
+     * @param string $page the html page to check
+     * @param array $scrapers an array of scrapers to check against
+     * @return array an associative array of scraper properties if a matching
+     *      scraper signature found; otherwise, the empty array
+     */
+    public static function getScraper($page, $scrapers)
+    {
+        $out_scraper = [];
+        foreach ($scrapers as $scraper) {
+            $out_scraper['SIGNATURE'] = html_entity_decode(
+                $scraper['SIGNATURE'], ENT_QUOTES);
+            if (self::checkSignature($page, $out_scraper['SIGNATURE'])) {
+                $out_scraper['ID'] = $scraper['ID'];
+                $out_scraper['SCRAPE_RULES'] = $scraper['SCRAPE_RULES'];
+                $out_scraper['NAME'] = $scraper['NAME'];
+                break;
+            }
+        }
+        return $out_scraper;
+    }
+    /**
+     * Applies scrape rules to a given page. A scrape rule consists of
+     * a sequence of xpaths delimited by ###. The first path is used
+     * extract content from the page, the remaining xpaths are used
+     * to delete content from the result.
+     *
+     * @param string $page the html page to operate on
+     * @param string $scrape_rules_string a string of xpaths with ###
+     *  used as a delimeter
+     * @return string the result of extracting first xpath content and
+     *  deleting from it according to the remaining xpath rules
+     */
+    public static function applyScraperRules($page, $scrape_rules_string)
+    {
+        $scrape_rules = preg_split('/###/u',
+            $scrape_rules_string, 0, PREG_SPLIT_NO_EMPTY);
+        if (count($scrape_rules) > 0) {
+            $temp_page = self::getContentByXquery($page,
+                $scrape_rules[0]);
+            unset($scrape_rules[0]);
+            if (!empty($temp_page)) {
+                foreach ($scrape_rules as $tag_to_remove) {
+                    $temp_content_to_remove =
+                        self::getContentByXquery($page, $tag_to_remove);
+                    $temp_page =
+                        str_replace($temp_content_to_remove, "", $temp_page);
+                }
+            }
+        }
+        return empty($temp_page) ? $page : $temp_page;
+    }
+    /**
+     * Checks to see if applying the xpath in $signature to $page results
+     * in a non-empty dom node list.
+     *
+     * @var string $page a web document to check
+     * @var string $signature an xpath to check against
+     * @return boolean true if the given xpath return a non empty dom node list
+     */
+    public static function checkSignature($page, $signature)
+    {
+        $dom = new \DOMDocument();
+        @$dom->loadHTML($page);
+        $xpath = new \DOMXpath($dom);
+        $results = $xpath->query($signature);
+        return !empty($results->length) || $results->length > 0;
+    }
+    /**
+     * Get the contents of a document via an xpath
+     * @param string $page a document to apply the xpath query against
+     * @param string $query the xpath query to run
+     *
+     * @return string the content found as a string, otherwise an empty string
+     */
+    public static function getContentByXquery($page, $query)
+    {
+        $result = "";
+        $dom = new \DOMDocument();
+        if (@$dom->loadHTML($page)) {
+            $xpath = new \DOMXPath($dom);
+            $tempResult = $xpath->query($query);
+            if ($tempResult->length > 0) {
+                $result = $dom->saveHTML($tempResult->item(0));
+            }
+        }
+        return $result;
+    }
+}
diff --git a/src/library/UpgradeFunctions.php b/src/library/UpgradeFunctions.php
index f04fc93f1..5c52bf607 100644
--- a/src/library/UpgradeFunctions.php
+++ b/src/library/UpgradeFunctions.php
@@ -22,8 +22,10 @@
  *
  * END LICENSE
  *
- * This file contains global functions connected to upgrading the database
- * and locales between different versions of Yioop!
+ * This file contains global functions to check whether
+ * upgrading the database or locales is needed as wells as auxiliary functions
+ * to be used by the VersionFunctions.php code to actually carry out
+ * upgrades between versions
  *
  * @author Chris Pollett chris@pollett.org
  * @license http://www.gnu.org/licenses/ GPL3
@@ -172,1167 +174,7 @@ function upgradeDatabaseWorkDirectory()
     }
     updateVersionNumber($model->db, C\YIOOP_VERSION);
 }
-/**
- * Upgrades a Version 0 version of the Yioop! database to a Version 1 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion1(&$db)
-{
-    $db->execute("CREATE TABLE VERSION (ID INTEGER PRIMARY KEY)");
-    $db->execute("INSERT INTO VERSION VALUES (1)");
-    $db->execute("CREATE TABLE USER_SESSION( USER_ID INTEGER PRIMARY KEY, ".
-        "SESSION VARCHAR(".C\MAX_GROUP_POST_LEN."))");
-}
-/**
- * Upgrades a Version 1 version of the Yioop! database to a Version 2 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion2(&$db)
-{
-    $db->execute("ALTER TABLE USERS ADD UNIQUE ( USER_NAME )" );
-    $db->execute("INSERT INTO LOCALE VALUES (
-        17, 'kn', 'ಕನ್ನಡ', 'lr-tb')");
-    $db->execute("INSERT INTO LOCALE VALUES (
-        18, 'hi', 'हिन्दी', 'lr-tb')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (3, 5,
-        'Modifier les rôles')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (4, 5,
-        'Modifier les indexes')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (5, 5,
-        'Mélanger les indexes')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (6, 5,
-        'Les filtres de recherche')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (7, 5,
-        'Modifier les lieux')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (8, 5,
-        'Configurer')");
-}
-/**
- * Upgrades a Version 2 version of the Yioop! database to a Version 3 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion3(&$db)
-{
-    $db->execute("INSERT INTO LOCALE VALUES (19, 'tr', 'Türkçe', 'lr-tb')");
-    $db->execute("INSERT INTO ROLE_ACTIVITY VALUES (1, 10)");
-    $db->execute("CREATE TABLE MACHINE (
-        NAME VARCHAR(16) PRIMARY KEY, URL VARCHAR(".C\MAX_URL_LEN.") UNIQUE,
-        HAS_QUEUE_SERVER BOOLEAN, NUM_FETCHERS INTEGER)");
-    $db->execute("DELETE FROM ACTIVITY WHERE ACTIVITY_ID>5 AND " .
-        "ACTIVITY_ID<11");
-    $db->execute(
-        "DELETE FROM TRANSLATION WHERE TRANSLATION_ID>5 AND " .
-        "TRANSLATION_ID<11");
-    $db->execute("DELETE FROM TRANSLATION_LOCALE ".
-        "WHERE TRANSLATION_ID>5 AND TRANSLATION_ID<11");
-    $db->execute("INSERT INTO ACTIVITY VALUES (6, 6, 'pageOptions')");
-    $db->execute("INSERT INTO ACTIVITY VALUES (7, 7, 'searchFilters')");
-    $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')");
-    $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(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')");
-
-    $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 (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')");
-
-    $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')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (8, 5,
-        'Modifier les ordinateurs')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (9, 5,
-        'Modifier les lieux')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 5,
-        'Configurer')");
-
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (
-        9, 9, 'ローケル管理')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 9, '設定')");
-
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (
-        9, 10, '로케일 관리')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 10, '구성')");
-
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (9, 15,
-        'Quản lý miền địa phương')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 15,
-        'Sắp xếp hoạt động dựa theo hoạch định')");
-}
-/**
- * Upgrades a Version 3 version of the Yioop! database to a Version 4 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion4(&$db)
-{
-    $db->execute("ALTER TABLE MACHINE ADD COLUMN PARENT VARCHAR(".
-        C\NAME_LEN.")");
-}
-/**
- * Upgrades a Version 4 version of the Yioop! database to a Version 5 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion5(&$db)
-{
-    $static_page_path = C\LOCALE_DIR."/". C\DEFAULT_LOCALE."/pages";
-    if (!file_exists($static_page_path)) {
-        mkdir($static_page_path);
-    }
-    $default_bot_txt_path = "$static_page_path/bot.thtml";
-    $old_bot_txt_path = C\WORK_DIRECTORY."/bot.txt";
-    if (file_exists($old_bot_txt_path) && !file_exists($default_bot_txt_path)){
-        rename($old_bot_txt_path, $default_bot_txt_path);
-    }
-    $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)
-{
-    if (!file_exists(C\PREP_DIR)) {
-        mkdir(C\PREP_DIR);
-    }
-    $db->setWorldPermissionsRecursive(C\PREP_DIR);
-}
-/**
- * Upgrades a Version 6 version of the Yioop! database to a Version 7 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion7(&$db)
-{
-    $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')");
-}
-/**
- * Upgrades a Version 7 version of the Yioop! database to a Version 8 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion8(&$db)
-{
-    $db->execute("INSERT INTO LOCALE VALUES (20, 'fa', 'فارسی', 'rl-tb')");
-    $db->execute("CREATE TABLE ACTIVE_FETCHER (NAME VARCHAR(".C\NAME_LEN."),".
-        " FETCHER_ID INTEGER)");
-    $db->execute("CREATE TABLE CRON_TIME " .
-        "(TIMESTAMP INT(".C\TIMESTAMP_LEN."))");
-    $db->execute("INSERT INTO CRON_TIME VALUES ('".time()."')");
-    upgradeLocales();
-}
-/**
- * Upgrades a Version 8 version of the Yioop! database to a Version 9 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion9(&$db)
-{
-    $db->execute("INSERT INTO ROLE_ACTIVITY VALUES (1, 11)");
-    $db->execute("DELETE FROM ACTIVITY WHERE ACTIVITY_ID >= 8");
-    $db->execute("DELETE FROM TRANSLATION WHERE TRANSLATION_ID >= 8");
-    $db->execute("DELETE FROM TRANSLATION_LOCALE WHERE TRANSLATION_ID >= 8");
-    $db->execute("INSERT INTO ACTIVITY VALUES (8, 8, 'searchSources')");
-    $db->execute("INSERT INTO ACTIVITY VALUES (9, 9, 'manageMachines')");
-    $db->execute("INSERT INTO ACTIVITY VALUES (10, 10, 'manageLocales')");
-    $db->execute("INSERT INTO ACTIVITY VALUES (11, 11, 'configure')");
-    $db->execute("INSERT INTO TRANSLATION VALUES(8,
-        'db_activity_search_services')");
-    $db->execute("INSERT INTO TRANSLATION VALUES(9,
-        'db_activity_manage_machines')");
-    $db->execute("INSERT INTO TRANSLATION VALUES (10,
-        'db_activity_manage_locales')");
-    $db->execute("INSERT INTO TRANSLATION VALUES (11,
-        'db_activity_configure')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (8, 1,
-        'Search Sources')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (9, 1,
-        'Manage Machines')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 1,
-        'Manage Locales')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (11, 1,
-        'Configure')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (8, 5,
-        'Sources de recherche')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (9, 5,
-        'Modifier les ordinateurs')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 5,
-        'Modifier les lieux')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (11, 5,
-        'Configurer')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 9,
-        'ローケル管理')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (11, 9,
-        '設定')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10,
-        10, '로케일 관리')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (11,
-        10, '구성')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 15,
-        'Quản lý miền địa phương')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (11, 15,
-        'Sắp xếp hoạt động dựa theo hoạch định')");
-}
-/**
- * Upgrades a Version 9 version of the Yioop! database to a Version 10 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion10(&$db)
-{
-    $db->execute("CREATE TABLE MEDIA_SOURCE (TIMESTAMP INT(11) PRIMARY KEY,
-        NAME VARCHAR(16) UNIQUE, TYPE VARCHAR(16),
-        SOURCE_URL VARCHAR(256), THUMB_URL VARCHAR(256)
-        )");
-    $db->execute("INSERT INTO MEDIA_SOURCE VALUES ('1342634195',
-        'YouTube', 'video', 'http://www.youtube.com/watch?v={}&',
-        'http://img.youtube.com/vi/{}/2.jpg')");
-    $db->execute("INSERT INTO MEDIA_SOURCE VALUES ('1342634196',
-        'MetaCafe', 'video', 'http://www.metacafe.com/watch/{}/',
-        'http://www.metacafe.com/thumb/{}.jpg')");
-    $db->execute("INSERT INTO MEDIA_SOURCE VALUES ('1342634197',
-        'DailyMotion', 'video', 'http://www.dailymotion.com/video/{}',
-        'http://www.dailymotion.com/thumbnail/video/{}')");
-}
-/**
- * Upgrades a Version 10 version of the Yioop! database to a Version 11 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion11(&$db)
-{
-    $db->execute("DROP TABLE CRON_TIME");
-    $db->execute("ALTER TABLE ROLE_ACTIVITY ADD CONSTRAINT
-        PK_RA PRIMARY KEY(ROLE_ID, ACTIVITY_ID)");
-    $db->execute("CREATE TABLE SUBSEARCH (LOCALE_STRING VARCHAR(16) " .
-        "PRIMARY KEY, FOLDER_NAME VARCHAR(16), INDEX_IDENTIFIER CHAR(13))");
-}
-/**
- * Upgrades a Version 11 version of the Yioop! database to a Version 12 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion12(&$db)
-{
-    $db->execute("INSERT INTO CRAWL_MIXES VALUES (2, 'images')");
-    $db->execute("INSERT INTO MIX_GROUPS VALUES(2, 0, 1)");
-    $db->execute("INSERT INTO MIX_COMPONENTS VALUES(2, 0, 1, 1,
-        'media:image')");
-    $db->execute("INSERT INTO CRAWL_MIXES VALUES (3, 'videos')");
-    $db->execute("INSERT INTO MIX_GROUPS VALUES(3, 0, 1)");
-    $db->execute("INSERT INTO MIX_COMPONENTS VALUES(3, 0, 1, 1,
-        'media:video')");
-    $db->execute("INSERT INTO SUBSEARCH VALUES('db_subsearch_images',
-        'images','m:2',50)");
-    $db->execute("INSERT INTO TRANSLATION VALUES " .
-        "(1002,'db_subsearch_images')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES
-            (1002, 1, 'Images' )");
-
-    $db->execute("INSERT INTO SUBSEARCH VALUES ('db_subsearch_videos',
-        'videos','m:3',10)");
-    $db->execute("INSERT INTO TRANSLATION VALUES " .
-        "(1003,'db_subsearch_videos')");
-    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES
-            (1003, 1, 'Videos' )");
-}
-/**
- * Upgrades a Version 12 version of the Yioop! database to a Version 13 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion13(&$db)
-{
-    $db->execute("CREATE TABLE FEED_ITEM (GUID VARCHAR(11) PRIMARY KEY,
-        TITLE VARCHAR(512), LINK VARCHAR(256), DESCRIPTION VARCHAR(4096),
-        PUBDATE INT, SOURCE_NAME VARCHAR(16))");
-    if (!file_exists(C\WORK_DIRECTORY."/feeds")) {
-        mkdir(C\WORK_DIRECTORY."/feeds");
-    }
-    upgradeLocales(); //force locale upgrade
-}
-/**
- * Upgrades a Version 13 version of the Yioop! database to a Version 14 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion14(&$db)
-{
-    $db->execute("ALTER TABLE MEDIA_SOURCE ADD LANGUAGE VARCHAR(7)");
-}
-/**
- * Upgrades a Version 14 version of the Yioop! database to a Version 15 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion15(&$db)
-{
-    $db->execute("DELETE FROM MIX_COMPONENTS WHERE MIX_TIMESTAMP=2
-        AND GROUP_ID=0");
-    $db->execute("INSERT INTO MIX_COMPONENTS VALUES(
-        2, 0, 1, 1, 'media:image site:doc')");
-    $db->execute("DELETE FROM MIX_COMPONENTS WHERE MIX_TIMESTAMP=3
-        AND GROUP_ID=0");
-    $db->execute("INSERT INTO MIX_COMPONENTS VALUES(
-        3, 0, 1, 1, 'media:video site:doc')");
-    $db->execute("INSERT INTO LOCALE VALUES (21, 'te',
-        'తెలుగు', 'lr-tb')");
-    upgradeLocales();
-}
-/**
- * Upgrades a Version 15 version of the Yioop! database to a Version 16 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion16(&$db)
-{
-    addActivityAtId($db, 'db_activity_manage_classifiers',
-        "manageClassifiers", 4);
-    updateTranslationForStringId($db, 'db_activity_manage_classifiers',
-        'en-US', 'Manage Classifiers');
-    updateTranslationForStringId($db, 'db_activity_manage_classifiers',
-        'fr-FR', 'Manage Classifiers');
-    updateTranslationForStringId($db, 'db_activity_manage_groups', 'fr-FR',
-        'Classificateurs');
-
-    $old_archives_path = C\WORK_DIRECTORY."/cache/archives";
-    $new_archives_path = C\WORK_DIRECTORY."/archives";
-    if (file_exists($old_archives_path)) {
-        rename($old_archives_path, $new_archives_path);
-    } else if (!file_exists($new_archives_path)) {
-        mkdir($new_archives_path);
-    }
-    $db->setWorldPermissionsRecursive($new_archives_path);
-
-    $new_classifiers_path = C\WORK_DIRECTORY."/classifiers";
-    if (!file_exists($new_classifiers_path)) {
-        mkdir($new_classifiers_path);
-    }
-    $db->setWorldPermissionsRecursive($new_classifiers_path);
-    upgradeLocales();
-}
-/**
- * Upgrades a Version 16 version of the Yioop! database to a Version 17 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion17(&$db)
-{
-    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
-        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
-    $auto_increment = $db->autoIncrement($dbinfo);
-    $db->execute("CREATE TABLE GROUPS (GROUP_ID INTEGER PRIMARY KEY
-        $auto_increment ,GROUP_NAME VARCHAR(128), CREATED_TIME INT(11),
-           CREATOR_ID INT(11))");
-    $db->execute("CREATE TABLE USER_GROUP (USER_ID INTEGER ,
-        GROUP_ID INTEGER,PRIMARY KEY (GROUP_ID, USER_ID) )");
-    addActivityAtId($db, 'db_activity_manage_groups', "manageGroups", 4);
-    updateTranslationForStringId($db, 'db_activity_manage_groups', 'en-US',
-        'Manage Groups');
-    updateTranslationForStringId($db, 'db_activity_manage_groups', 'fr-FR',
-        'Modifier les groupes');
-    upgradeLocales();
-}
-/**
- * Upgrades a Version 17 version of the Yioop! database to a Version 18 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion18(&$db)
-{
-    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
-        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
-    $auto_increment = $db->autoIncrement($dbinfo);
-    $db->execute("CREATE TABLE ACCESS (NAME VARCHAR(16), ID INTEGER,
-                TYPE VARCHAR(16))");
-    $db->execute("CREATE TABLE BLOG_DESCRIPTION (TIMESTAMP INT(11) UNIQUE,
-                DESCRIPTION VARCHAR(4096))");
-    addActivityAtId($db, 'db_activity_blogs_pages', "blogPages", 6);
-    updateTranslationForStringId($db, 'db_activity_blogs_pages', 'en-US',
-        'Blogs and Pages');
-    updateTranslationForStringId($db, 'db_activity_blogs_pages', 'fr-FR',
-        'les blogs et les pages');
-    upgradeLocales();
-}
-/**
- * Upgrades a Version 18 version of the Yioop! database to a Version 19 version
- * This update has been superseded by the Version20 update and so its contents
- * have been eliminated.
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion19(&$db)
-{
-}
-/**
- * Upgrades a Version 19 version of the Yioop! database to a Version 20 version
- * This is a major upgrade as the user table have changed. This also acts
- * as a cumulative since version 0.98. It involves a web form that has only
- * been localized to English
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion20(&$db)
-{
-    if (!isset($_REQUEST['v20step'])) {
-        $_REQUEST['v20step'] = 1;
-    }
-    $upgrade_check_file = C\WORK_DIRECTORY."/v20check.txt";
-    if (!file_exists($upgrade_check_file)) {
-        $upgrade_password = substr(sha1(microtime(true).C\AUTH_KEY), 0, 8);
-        file_put_contents($upgrade_check_file, $upgrade_password);
-    } else {
-        $v20check = trim(file_get_contents($upgrade_check_file));
-        if (isset($_REQUEST['v20step']) && $_REQUEST['v20step'] == 2 &&
-            (!isset($_REQUEST['upgrade_code'])||
-            $v20check != trim($_REQUEST['upgrade_code']))) {
-            $_REQUEST['v20step'] = 1;
-            $data['SCRIPT'] = "doMessage('<h1 class=\"red\" >".
-                "v20check.txt not typed in correctly!</h1>')";
-        }
-    }
-    switch ($_REQUEST['v20step']) {
-        case "2":
-            $profile_model = new M\ProfileModel(C\DB_NAME, false);
-            $profile_model->db = $db;
-            $save_tables = ["ACTIVE_FETCHER", "CURRENT_WEB_INDEX",
-                "FEED_ITEM", "MACHINE", "MEDIA_SOURCE", "SUBSEARCH",
-                "VERSION"];
-            $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
-                "DB_USER" => C\DB_USER, "DB_PASSWORD" => C\DB_PASSWORD,
-                "DB_NAME" => C\DB_NAME];
-            $creation_time = microTimestamp();
-            $profile = $profile_model->getProfile(C\WORK_DIRECTORY);
-            $new_profile = $profile;
-            $new_profile['AUTHENTICATION_MODE'] = C\NORMAL_AUTHENTICATION;
-            $new_profile['FIAT_SHAMIR_MODULUS'] = generateFiatShamirModulus();
-            $new_profile['MAIL_SERVER']= "";
-            $new_profile['MAIL_PORT']= "";
-            $new_profile['MAIL_USERNAME']= "";
-            $new_profile['MAIL_PASSWORD']= "";
-            $new_profile['MAIL_SECURITY']= "";
-            $new_profile['REGISTRATION_TYPE'] = 'disable_registration';
-            $new_profile['USE_MAIL_PHP'] = true;
-            $new_profile['WORD_SUGGEST'] = true;
-            $profile_model->updateProfile(C\WORK_DIRECTORY, $new_profile,
-                $profile);
-            //get current users
-            //(assume can fit in memory and doesn't take long)
-            $users = [];
-            $sha1_of_upgrade_code = bchexdec(sha1($v20check));
-            $temp = bcpow($sha1_of_upgrade_code . '', '2');
-            $zkp_password = bcmod($temp, $new_profile['FIAT_SHAMIR_MODULUS']);
-            $user_tables_sql = ["SELECT USER_NAME FROM USER",
-                "SELECT USER_NAME, FIRST_NAME, LAST_NAME, EMAIL FROM USERS"];
-            $i = 0;
-            foreach ($user_tables_sql as $sql) {
-                $result = $db->execute($sql);
-                if ($result) {
-                    while($users[$i] = $db->fetchArray($result)) {
-                        $setup_user_fields = [];
-                        if ($users[$i]["USER_NAME"] == "root" ||
-                            $users[$i]["USER_NAME"] == "public") { continue; }
-                        $users[$i]["FIRST_NAME"] =
-                            (isset($users[$i]["FIRST_NAME"])) ?
-                            $users[$i]["FIRST_NAME"] : "FIRST_$i";
-                        $users[$i]["LAST_NAME"] =
-                            (isset($users[$i]["LAST_NAME"])) ?
-                            $users[$i]["LAST_NAME"] : "LAST_$i";
-                        $users[$i]["EMAIL"] =
-                            (isset($users[$i]["EMAIL"])) ?
-                            $users[$i]["EMAIL"] : "user$i@dev.null";
-                        /* although not by default using zkp set up so
-                           accounts would work on switch
-                        */
-                        $users[$i]["PASSWORD"] = $v20check;
-                        $users[$i]["STATUS"] = C\INACTIVE_STATUS;
-                        $users[$i]["CREATION_TIME"] = $creation_time;
-                        $users[$i]["UPS"] = 0;
-                        $users[$i]["DOWNS"] = 0;
-                        $users[$i]["ZKP_PASSWORD"] = $zkp_password;
-                        $i++;
-                    }
-                    unset($users[$i]);
-                    $result = null;
-                }
-            }
-            $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
-                "DB_USER" => C\DB_USER, "DB_PASSWORD" => C\DB_PASSWORD,
-                "DB_NAME" => C\DB_NAME];
-            $profile_model->initializeSql($db, $dbinfo);
-            $database_tables = array_diff(
-                array_keys($profile_model->create_statements),
-                $save_tables);
-            $database_tables = array_merge($database_tables,
-                ["BLOG_DESCRIPTION", "USER_OLD", "ACCESS"]);
-            foreach ($database_tables as $table) {
-                if (!in_array($table, $save_tables)){
-                    $db->execute("DROP TABLE ".$table);
-                }
-            }
-            if ($profile_model->migrateDatabaseIfNecessary(
-                $dbinfo, $save_tables)) {
-                $user_model = new M\UserModel(C\DB_NAME, false);
-                $user_model->db = $db;
-                foreach ($users as $user) {
-                    $user_model->addUser($user["USER_NAME"], $user["PASSWORD"],
-                        $user["FIRST_NAME"], $user["LAST_NAME"],
-                        $user["EMAIL"], $user["STATUS"],
-                        $user["ZKP_PASSWORD"]);
-                }
-                $user = [];
-                $user['USER_ID'] = C\ROOT_ID;
-                $user['PASSWORD'] = $v20check;
-                $user["ZKP_PASSWORD"] = $zkp_password;
-                $user_model->updateUser($user);
-                $db->execute("DELETE FROM VERSION WHERE ID < 19");
-                $db->execute("UPDATE VERSION SET ID=20 WHERE ID=19");
-                return;
-            }
-            $data['SCRIPT'] = "doMessage('<h1 class=\"red\" >".
-                "Couldn't migrate database tables from defaults!</h1>')";
-            // no break
-        case "1":
-            // no break
-        default:
-            ?>
-            <!DOCTYPE html>
-            <html lang='en-US'>
-            <head>
-            <title>Yioop Upgrade Detected</title>
-            <meta name="ROBOTS" content="NOINDEX,NOFOLLOW" />
-            <meta name="Author" content="Christopher Pollett" />
-            <meta charset="utf-8" />
-            <?php if (C\MOBILE) {?>
-            <meta name="viewport" content="width=device-width,initial-scale=1">
-            <?php } ?>
-            <link rel="stylesheet" type="text/css"
-                 href="<?= C\BASE_URL ?>/css/search.css" />
-            </head>
-            <body class="html-ltr <?php if (C\MOBILE) {e('mobile'); } ?>" >
-            <div id="message" ></div>
-            <div class='small-margin-current-activity'>
-            <h1 class='center green'>Yioop Upgrade Detected!</h1>
-            <p>Upgrading to Version 1 of Yioop from an earlier version
-            is a major upgrade. The way passwords are stored and the
-            organization of the Yioop database has changed. Here is
-            what is preserved by this upgrade:</p>
-            <ol>
-            <li>Existing crawls and archive data.</li>
-            <li>Machines known if this instance is a name server.</li>
-            <li>Media sources and subsearches.</li>
-            <li>Feed items.</li>
-            </ol>
-            <p>Here is what happens during the upgrade which might
-            result in data loss:</p>
-            <ol>
-            <li>Root and user account passwords are changed to the contents of
-            v20check.txt.</li>
-            <li>User accounts other than root are marked as inactived,
-            so will have tobe activated under Manage Users before that person
-            can sign in.</li>
-            <li>All roles except Admin and User are deleted. Root
-            will be given Admin role, all other users will receive
-            User role.</li>
-            <li>All existing groups are deleted.</li>
-            <li>Existing crawl mixes will be deleted.</li>
-            <li>Any customized translations that begin with the prefix db_.
-            Other still in use translations will be preserved.</li>
-            </ol>
-            <p>If given the above you don't want to upgrade, merely replace
-            this folder with the contents of your old Yioop instance and
-            you should be able to continue to use Yioop as before.</p>
-            <p>If you decide to proceed with the upgrade, please back up
-            both your existing database and work directory.</p>
-            <form method="post" action="?">
-            <p><label for="upgrade-code">
-            <b>In the field below enter the string found in the file:<br />
-            <span class="green"><?= C\WORK_DIRECTORY."/v20check.txt"?></span>
-            </b></label></p>
-            <input id='upgrade-code' class="extra-wide-field"
-                name="upgrade_code" type="text" />
-            <input type="hidden" name="v20step" value="2" />
-            <button class="button-box" type="submit">Upgrade</button>
-            </form>
-            <?php
-        break;
-    }
-    ?>
-    </div>
-    <script type="text/javascript" src="<?= C\BASE_URL
-        ?>/scripts/basic.js" ></script>
-    <script type="text/javascript" >
-    <?php
-    if (isset($data['SCRIPT'])) {
-        e($data['SCRIPT']);
-    }
-    ?></script>
-    </body>
-    </html>
-   <?php
-   exit();
-}
-/**
- * Upgrades a Version 20 version of the Yioop! database to a Version 21 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion21(&$db)
-{
-    $db->execute("CREATE TABLE GROUP_THREAD_VIEWS(
-        THREAD_ID INTEGER PRIMARY KEY, NUM_VIEWS INTEGER)");
-    $db->execute("ALTER TABLE MEDIA_SOURCE RENAME TO MEDIA_SOURCE_OLD");
-    $db->execute("CREATE TABLE MEDIA_SOURCE (TIMESTAMP NUMERIC(11) PRIMARY KEY,
-        NAME VARCHAR(64) UNIQUE, TYPE VARCHAR(16), SOURCE_URL VARCHAR(256),
-        AUX_INFO VARCHAR(512), LANGUAGE VARCHAR(7))");
-    D\DatasourceManager::copyTable("MEDIA_SOURCE_OLD", $db, "MEDIA_SOURCE",
-        $db);
-    $db->execute("DROP TABLE MEDIA_SOURCE_OLD");
-}
-/**
- * Upgrades a Version 21 version of the Yioop! database to a Version 22 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion22(&$db)
-{
-    $db->execute("INSERT INTO GROUP_THREAD_VIEWS
-        SELECT DISTINCT PARENT_ID, 1 FROM GROUP_ITEM WHERE
-        NOT EXISTS (SELECT THREAD_ID
-        FROM GROUP_THREAD_VIEWS WHERE THREAD_ID=PARENT_ID)");
-    $db->execute("ALTER TABLE LOCALE ADD ACTIVE INTEGER DEFAULT 1");
-}
-/**
- * Upgrades a Version 22 version of the Yioop! database to a Version 23 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion23(&$db)
-{
-    $db->execute("ALTER TABLE GROUPS ADD POST_LIFETIME INTEGER DEFAULT ".
-        FOREVER);
-}
-/**
- * Upgrades a Version 23 version of the Yioop! database to a Version 24 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion24(&$db)
-{
-    $profile_model = new M\ProfileModel(C\DB_NAME, false);
-    $profile_model->db = $db;
-    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
-        "DB_USER" => C\DB_USER, "DB_PASSWORD" => C\DB_PASSWORD,
-        "DB_NAME" => C\DB_NAME];
-    $profile_model->initializeSql($db, $dbinfo);
-    foreach ($profile_model->create_statements as $object_name => $statement) {
-        if (stristr($object_name, "_INDEX")) {
-            if (!$db->execute($statement)) {
-                echo $statement." ERROR!";
-                exit();
-            }
-        } else {
-            if (!$db->execute("ALTER TABLE $object_name RENAME TO " .
-                $object_name . "_OLD")) {
-                echo "RENAME $object_name ERROR!";
-                exit();
-            }
-            if (!$db->execute($statement)) {
-                echo $statement." ERROR!";
-                exit();
-            }
-            D\DatasourceManager::copyTable($object_name."_OLD", $db,
-                $object_name, $db);
-            $db->execute("DROP TABLE ".$object_name."_OLD");
-        }
-    }
-}
-/**
- * Upgrades a Version 24 version of the Yioop! database to a Version 25 version
- * This version upgrade includes creation of Help group that holds help pages.
- * Help Group is created with GROUP_ID=HELP_GROUP_ID. If a Group with
- * Group_ID=HELP_GROUP_ID already exists,
- * then that GROUP is moved to the end of the GROUPS table(Max group id is
- * used).
- *
- * @param object $db data source to use to upgrade
- */
-function upgradeDatabaseVersion25(&$db)
-{
-    /** For reading HELP_GROUP_ID**/
-    $sql = "SELECT COUNT(*) AS NUM FROM GROUPS WHERE GROUP_ID=" .
-        C\HELP_GROUP_ID;
-    $result = $db->execute($sql);
-    $row = ($db->fetchArray($result));
-    $is_taken = intval($row['NUM']);
-    if ($is_taken > 0) {
-        //Get the max group Id , increment it to push the old group
-        $sql = "SELECT MAX(GROUP_ID) AS MAX_GROUP_ID FROM GROUPS";
-        $result = $db->execute($sql);
-        $row = $db->fetchArray($result);
-        $max_group_id = $row['MAX_GROUP_ID'] + 1;
-        $tables_to_update_group_id = ["GROUPS", "GROUP_ITEM",
-            "GROUP_PAGE", "GROUP_PAGE_HISTORY", "USER_GROUP"];
-        foreach ($tables_to_update_group_id as $table) {
-            $sql = "UPDATE $table "
-                . "Set GROUP_ID=$max_group_id "
-                . "WHERE "
-                . "GROUP_ID=" . C\HELP_GROUP_ID;
-            $db->execute($sql);
-        }
-    }
-    //Insert the Help Group
-    $creation_time = microTimestamp();
-    $sql = "INSERT INTO GROUPS VALUES(" . C\HELP_GROUP_ID . ",'Help','"
-        . $creation_time . "','" . C\ROOT_ID . "',
-        '" . C\PUBLIC_BROWSE_REQUEST_JOIN . "', '" . C\GROUP_READ_WIKI . "',
-        " . C\UP_DOWN_VOTING_GROUP . ", " . C\FOREVER . ")";
-    $db->execute($sql);
-    $now = time();
-    $db->execute("INSERT INTO USER_GROUP VALUES (" . C\ROOT_ID . ", " .
-        C\HELP_GROUP_ID . ", " . ACTIVE_STATUS . ", $now)");
-    $db->execute("INSERT INTO USER_GROUP VALUES (" . C\PUBLIC_USER_ID . ", " .
-        C\HELP_GROUP_ID . ", " . C\ACTIVE_STATUS . ", $now)");
-    //Insert into Groups
-    $help_pages = getWikiHelpPages();
-    foreach ($help_pages as $page_name => $page_content) {
-        $page_content = str_replace("&amp;", "&", $page_content);
-        $page_content = @htmlentities($page_content, ENT_QUOTES, "UTF-8");
-        $group_model = new M\GroupModel(C\DB_NAME, false);
-        $group_model->db = $db;
-        $group_model->setPageName(C\ROOT_ID, C\HELP_GROUP_ID, $page_name,
-            $page_content, "en-US", "Creating Default Pages", "$page_name "
-            . "Help Page Created!", "Discuss the page in this thread!");
-    }
-}
-/**
- * Upgrades a Version 25 version of the Yioop! database to a Version 26 version
- * This version upgrade includes updation fo the Help pages in the database to
- * work with the changes to the way Hyperlinks are specified in wiki markup.
- * The changes were implemented to point all articles with page names
- * containing %20 to be able to work with '_' and vice versa.
- * @param object $db data source to use to upgrade
- */
-function upgradeDatabaseVersion26(&$db)
-{
-    //Delete all existing pages in Help group
-    $params = [C\HELP_GROUP_ID];
-    $sql = "DELETE FROM GROUP_PAGE WHERE GROUP_ID=?";
-    $db->execute($sql, $params);
-    $sql = "DELETE FROM GROUP_PAGE_HISTORY WHERE GROUP_ID=?";
-    $db->execute($sql, $params);
-    //Insert the Help Group pages with corrected titles
-    $creation_time = microTimestamp();
-    $sql = "INSERT INTO GROUPS VALUES(" . C\HELP_GROUP_ID . ",'Help','"
-        . $creation_time . "','" . C\ROOT_ID . "',
-        '" . C\PUBLIC_BROWSE_REQUEST_JOIN . "', '" . C\GROUP_READ_WIKI . "',
-        " . C\UP_DOWN_VOTING_GROUP . ", " . C\FOREVER . ")";
-    $db->execute($sql);
-    $now = time();
-    $db->execute("INSERT INTO USER_GROUP VALUES (" . C\ROOT_ID . ", " .
-        C\HELP_GROUP_ID . ", " . C\ACTIVE_STATUS . ", $now)");
-    $db->execute("INSERT INTO USER_GROUP VALUES (" . C\PUBLIC_USER_ID . ", " .
-        C\HELP_GROUP_ID . ", " . C\ACTIVE_STATUS . ", $now)");
-    //Insert into Groups
-    $help_pages = getWikiHelpPages();
-    foreach ($help_pages as $page_name => $page_content) {
-        $page_content = str_replace("&amp;", "&", $page_content);
-        $page_content = @htmlentities($page_content, ENT_QUOTES, "UTF-8");
-        $group_model = new M\GroupModel(C\DB_NAME, false);
-        $group_model->db = $db;
-        $group_model->setPageName(C\ROOT_ID, C\HELP_GROUP_ID, $page_name,
-            $page_content, "en-US", "Creating Default Pages", "$page_name "
-            . "Help Page Created!", "Discuss the page in this thread!");
-    }
-}
-/**
- * Upgrades a Version 26 version of the Yioop! database to a Version 27 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion27(&$db)
-{
-    $db->execute("ALTER TABLE GROUP_ITEM ADD COLUMN EDIT_DATE
-        NUMERIC(".C\TIMESTAMP_LEN.")");
-}
-/**
- * Upgrades a Version 27 version of the Yioop! database to a Version 28 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion28(&$db)
-{
-    $db->execute("ALTER TABLE FEED_ITEM ADD COLUMN IMAGE_LINK
-        VARCHAR(".C\MAX_URL_LEN.")");
-}
-/**
- * Upgrades a Version 28 version of the Yioop! database to a Version 29 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion29(&$db)
-{
-    $sql = "INSERT INTO LOCALE (LOCALE_NAME, LOCALE_TAG,
-        WRITING_MODE, ACTIVE) VALUES (?, ?, ?, ?)";
-    $db->execute($sql, ["Nederlands", "nl", "lr-tb", 1]);
-    $nl_translations = [
-        'db_activity_manage_account' => 'Account Beheren',
-        'db_activity_manage_users' => 'Gebruikers beheren',
-        'db_activity_manage_roles' => 'Rollen beheren',
-        'db_activity_manage_groups' => 'Groepen beheren',
-        'db_activity_manage_crawl' => 'Beheer Crawl',
-        'db_activity_mix_crawls' => 'Mix Crawls',
-        'db_activity_group_feeds' => 'Feeds en Wikis',
-        'db_activity_manage_classifiers' => 'Beheer Classifiers',
-        'db_activity_file_options' => 'Opties voor de pagina',
-        'db_activity_results_editor' => 'Resultaten Editor',
-        'db_activity_search_services' => 'Zoek Bronnen',
-        'db_activity_manage_machines' => 'Beheer Machines',
-        'db_activity_manage_locales' => 'Beheer varianten',
-        'db_activity_server_settings' => 'Server Settings',
-        'db_activity_security' => 'Veiligheid',
-        'db_activity_configure' => 'Configureren',
-        'db_subsearch_images' => 'Beelden',
-        'db_subsearch_videos' => 'Videos',
-        'db_subsearch_news' => 'Nieuws',
-    ];
-    foreach ($nl_translations as $identifier => $translation) {
-        updateTranslationForStringId($db, $identifier, 'nl', $translation);
-    }
-}
-/**
- * Upgrades a Version 29 version of the Yioop! database to a Version 30 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion30(&$db)
-{
-    $db->execute("CREATE TABLE MEDIA_UPDATER_PROPERTIES(
-        NAME VARCHAR(". C\NAME_LEN .") NOT NULL, VALUE VARCHAR(".
-        C\NAME_LEN.") NOT NULL)");
-    $db->execute("INSERT INTO MEDIA_UPDATER_PROPERTIES
-        VALUES ('PRESENT_ON_NAME_SERVER','true')");
-}
-/**
- * Upgrades a Version 30 version of the Yioop! database to a Version 31 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion31(&$db)
-{
-    $db->execute("DROP TABLE MEDIA_UPDATER_PROPERTIES");
-    $db->execute("DROP TABLE ACTIVE_FETCHER");
-    $db->execute("CREATE TABLE ACTIVE_PROCESS (NAME VARCHAR(". C\NAME_LEN.
-        "), ID INTEGER, TYPE VARCHAR(" . C\NAME_LEN . "))");
-    $profile_model = new M\ProfileModel(C\DB_NAME, false);
-    $profile['MEDIA_MODE'] = "name_server";
-    $profile_model->updateProfile(C\WORK_DIRECTORY, [], $profile);
-}
-/**
- * Upgrades a Version 31 version of the Yioop! database to a Version 32 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion32(&$db)
-{
-    $role_model = new M\RoleModel(C\DB_NAME, false);
-    $role_model->db = $db;
-    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
-        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
-    $auto_increment = $db->autoIncrement($dbinfo);
-    $db->execute("ALTER TABLE USERS ADD COLUMN IS_ADVERTISER INTEGER");
-    $db->execute("CREATE TABLE ADVERTISEMENTS(ADV_ID INTEGER
-        PRIMARY KEY $auto_increment, USER_ID INTEGER,
-        ADV_NAME VARCHAR(". C\ADVERTISEMENT_NAME_LEN ."),
-        ADV_DESCRIPTION VARCHAR(". C\ADVERTISEMENT_TEXT_LEN ."),
-        ADV_DESTINATION VARCHAR(". C\ADVERTISEMENT_DESTINATION_LEN ."),
-        ADV_KEYWORDS VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN ."),
-        STATUS INTEGER, ADV_BUDGET INTEGER,
-        ADV_DATE VARCHAR(". C\ADVERTISEMENT_DATE_LEN ."))");
-    $db->execute("CREATE TABLE ADVERTISEMENT_KEYWORD
-        (ID INTEGER PRIMARY KEY $auto_increment,
-        KEYWORD VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN ."),
-        BID_AMOUNT INTEGER,
-        BID_DATE VARCHAR(". C\ADVERTISEMENT_DATE_LEN ."))");
-    $db->execute("CREATE TABLE ADVERTISEMENT_METADATA
-        (ADV_ID INTEGER, CLICKS INTEGER, IMPRESSIONS INTEGER)");
-    addActivityAtId($db, 'db_activity_manage_advertisements',
-        "manageAdvertisements", 17);
-    updateTranslationForStringId($db, 'db_activity_manage_advertisements',
-        'en-US', 'Manage Advertisements');
-    $role_model->addRole('Business User');
-    $role_id = $role_model->getRoleId('Business User');
-    $role_model->addActivityRole($role_id, 17);
-}
-/**
- * Upgrades a Version 32 version of the Yioop! database to a Version 33 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion33(&$db)
-{
-    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
-        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
-    $auto_increment = $db->autoIncrement($dbinfo);
-    $db->execute("DROP TABLE ADVERTISEMENTS");
-    $db->execute("DROP TABLE ADVERTISEMENT_KEYWORD");
-    $db->execute("DROP TABLE ADVERTISEMENT_METADATA");
-    $db->execute("CREATE TABLE ADVERTISEMENT(AD_ID INTEGER
-        PRIMARY KEY $auto_increment, USER_ID INTEGER,
-        AD_NAME VARCHAR(". C\ADVERTISEMENT_NAME_LEN ."),
-        AD_DESCRIPTION VARCHAR(". C\ADVERTISEMENT_TEXT_LEN ."),
-        AD_DESTINATION VARCHAR(". C\ADVERTISEMENT_DESTINATION_LEN ."),
-        AD_KEYWORDS VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN ."),
-        STATUS INTEGER, AD_BUDGET INTEGER,
-        AD_DATE VARCHAR(". C\ADVERTISEMENT_DATE_LEN ."))");
-    $db->execute("CREATE TABLE ADVERTISEMENT_KEYWORD
-        (ID INTEGER PRIMARY KEY $auto_increment,
-        KEYWORD VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN ."),
-        BID_AMOUNT INTEGER,
-        BID_DATE VARCHAR(". C\ADVERTISEMENT_DATE_LEN ."))");
-    $db->execute("CREATE TABLE ADVERTISEMENT_METADATA
-        (AD_ID INTEGER, CLICKS INTEGER, IMPRESSIONS INTEGER)");
-}
-/**
- * Upgrades a Version 33 version of the Yioop! database to a Version 34 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion34(&$db)
-{
-    addActivityAtId($db, 'db_activity_appearance',
-        "appearance", 16);
-    updateTranslationForStringId($db, 'db_activity_appearance',
-        'en-US', 'Appearance');
-    updateTranslationForStringId($db, 'db_activity_appearance',
-        'fr-FR', 'Aspect');
-    updateTranslationForStringId($db, 'db_activity_appearance',
-        'nl', 'Verschijning');
-}
-/**
- * Upgrades a Version 34 version of the Yioop! database to a Version 35 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion35(&$db)
-{
-    $db->execute("CREATE TABLE CREDIT_LEDGER
-        (USER_ID INTEGER, AMOUNT INTEGER, TYPE VARCHAR(" .
-        C\NAME_LEN . "), BALANCE INTEGER, TIMESTAMP NUMERIC(" .
-        C\TIMESTAMP_LEN . "))");
-    addActivityAtId($db, 'db_activity_manage_credits',
-        "manageCredits", 18);
-    updateTranslationForStringId($db, 'db_activity_manage_credits',
-        'en-US', 'Manage Credits');
-    $role_model = new M\RoleModel(C\DB_NAME, false);
-    $role_model->db = $db;
-    $activity_model = new M\ActivityModel(C\DB_NAME, false);
-    $activity_model->db = $db;
-    $role_id = $role_model->getRoleId('Business User');
-    $activity_id = $activity_model->getActivityIdFromMethodName(
-        "manageCredits");
-    $role_model->addActivityRole($role_id, $activity_id);
-    $activity_id = $activity_model->getActivityIdFromMethodName(
-        "manageAdvertisements");
-    $role_model->addActivityRole($role_id, $activity_id);
-}
-/**
- * Upgrades a Version 35 version of the Yioop! database to a Version 36 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion36(&$db)
-{
-    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
-        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
-    $auto_increment = $db->autoIncrement($dbinfo);
-    $db->execute("DROP TABLE ADVERTISEMENT");
-    $db->execute("DROP TABLE ADVERTISEMENT_KEYWORD");
-    $db->execute("DROP TABLE ADVERTISEMENT_METADATA");
-    $db->execute("DELETE FROM CREDIT_LEDGER");
-    $db->execute("CREATE TABLE ADVERTISEMENT (ID INTEGER
-        PRIMARY KEY $auto_increment, USER_ID INTEGER,
-        NAME VARCHAR(". C\ADVERTISEMENT_NAME_LEN ."),
-        DESCRIPTION VARCHAR(". C\ADVERTISEMENT_TEXT_LEN ."),
-        DESTINATION VARCHAR(". C\ADVERTISEMENT_DESTINATION_LEN ."),
-        KEYWORDS VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN ."),
-        STATUS INTEGER, BUDGET INTEGER, CLICKS INTEGER,
-        IMPRESSIONS INTEGER, START_DATE VARCHAR(".
-        C\ADVERTISEMENT_DATE_LEN ."), END_DATE VARCHAR(".
-        C\ADVERTISEMENT_DATE_LEN ."))");
-    $db->execute("CREATE TABLE ACCEPTED_AD_BIDS
-        (AD_ID INTEGER, KEYWORD VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN
-        ."), BID_AMOUNT INTEGER, BID_DATE VARCHAR(".
-        C\ADVERTISEMENT_DATE_LEN ."))");
-}
-/**
- * Upgrades a Version 36 version of the Yioop! database to a Version 37 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion37(&$db)
-{
-    $db->execute("CREATE TABLE ITEM_IMPRESSION(
-        USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
-        VIEW_DATE NUMERIC(" . C\TIMESTAMP_LEN . "))");
-    $db->execute("CREATE TABLE ITEM_IMPRESSION_SUMMARY(
-        USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
-        NUM_ALL_TIME INTEGER, NUM_YEAR INTEGER, NUM_MONTH INTEGER,
-        NUM_DAY INTEGER, PRIMARY KEY(USER_ID, ITEM_ID, ITEM_TYPE))");
-    $db->execute("CREATE TABLE GROUP_PAGE_LINK(
-        LINK_TYPE_ID INTEGER, FROM_ID INTEGER,
-        TO_ID INTEGER)");
-    $db->execute("INSERT INTO ITEM_IMPRESSION_SUMMARY
-        SELECT ".C\PUBLIC_USER_ID.", THREAD_ID, ".C\THREAD_IMPRESSION.",
-        NUM_VIEWS, 0, 0, 0 FROM GROUP_THREAD_VIEWS");
-}

-/**
- * Upgrades a Version 37 version of the Yioop! database to a Version 38 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion38(&$db)
-{
-    $db->execute("DROP TABLE GROUP_THREAD_VIEWS");
-    $db->execute("CREATE TABLE ITEM_IMPRESSION_SUMMARY_OLD(
-        USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
-        NUM_ALL_TIME INTEGER, NUM_YEAR INTEGER, NUM_MONTH INTEGER,
-        NUM_DAY INTEGER, PRIMARY KEY(USER_ID, ITEM_ID, ITEM_TYPE,
-        UPDATE_TIMESTAMP))");
-    D\DatasourceManager::copyTable("ITEM_IMPRESSION_SUMMARY", $db,
-        "ITEM_IMPRESSION_SUMMARY_OLD", $db);
-    $db->execute("DROP TABLE ITEM_IMPRESSION_SUMMARY");
-    $db->execute("CREATE TABLE ITEM_IMPRESSION_SUMMARY(
-        USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
-        UPDATE_PERIOD INTEGER,
-        UPDATE_TIMESTAMP  NUMERIC(" . C\TIMESTAMP_LEN . "),
-        NUM_VIEWS INTEGER, PRIMARY KEY(USER_ID, ITEM_ID, ITEM_TYPE,
-        UPDATE_PERIOD))");
-    $db->execute("INSERT INTO ITEM_IMPRESSION_SUMMARY
-        SELECT USER_ID, ITEM_ID, ITEM_TYPE, ".C\FOREVER.", 0, NUM_ALL_TIME AS
-        NUM_VIEWS FROM ITEM_IMPRESSION_SUMMARY_OLD");
-}
-/**
- * Upgrades a Version 38 version of the Yioop! database to a Version 39 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion39(&$db)
-{
-    $role_model = new M\RoleModel(C\DB_NAME, false);
-    $role_model->db = $db;
-    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
-        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
-    $db->execute("CREATE TABLE CMS_DETECTORS (TIMESTAMP NUMERIC(" .
-        C\TIMESTAMP_LEN . ") PRIMARY KEY NOT NULL, NAME VARCHAR(" .
-        C\TITLE_LEN . "), HEADER VARCHAR(" . C\TITLE_LEN . ")," .
-        "IMPORTANT_CONTENT VARCHAR(" . C\TITLE_LEN . "))");
-    addActivityAtId($db, 'db_activity_cms_detectors',
-        "cmsDetectors", 20);
-    updateTranslationForStringId($db, 'db_activity_cms_detectors',
-        'en-US', 'CMS Detectors');
-    $role_id = $role_model->getRoleId('Admin');
-    $role_model->addActivityRole($role_id, 20);
-    $sql = "INSERT INTO CMS_DETECTORS VALUES (?,?,?,?)";
-    $name = "YIOOP!";
-    $source_header = "c=resource&amp;a=get&amp;f=css&amp;n=auxiliary\.css";
-    $source_importantcontent = "";
-    $db->execute($sql, [time(), $name, $source_header,
-        $source_importantcontent]);
-    $name = "DRUPAL";
-    $source_header = "sites\/(?:default|all)\/(?:themes|modules|files)\/";
-    $source_importantcontent = "//div[@id=\&quot;content\&quot;]" .
-        "###//div[@id=\&quot;comments\&quot;]" .
-        "###//div[@id=\&quot;respond\&quot;]" .
-        "###//div[@class=\&quot;bottomcontainerBox\&quot;]" .
-        "###//ul[@class=\&quot;post-by\&quot;]" .
-        "###//div[@class=\&quot;entry-meta clear\&quot;]";
-    $db->execute($sql, [time(), $name, $source_header,
-        $source_importantcontent]);
-    $name = "SITECORE";
-    $source_header = "\/system\/VisitorIdentification.js";
-    $source_importantcontent = "//div[@class=\&quot;container section\&quot;]";
-    $db->execute($sql, [time(), $name, $source_header,
-        $source_importantcontent]);
-    $name = "VBULLETIN";
-    $source_header = "vBulletin";
-    $source_importantcontent = "//div[@td\s+id=\&quot;content\&quot;]";
-    $db->execute($sql, [time(), $name, $source_header,
-        $source_importantcontent]);
-    $name = "JOOMLA!";
-    $source_header = "^\/media";
-    $source_importantcontent = "";
-    $db->execute($sql, [time(), $name, $source_header,
-        $source_importantcontent]);
-    $name = "WORDPRESS";
-    $source_header = "wp-(?:content|includes)";
-    $source_importantcontent = "//div[@id=\&quot;content\&quot;]" .
-        "###//div[@id=\&quot;comments\&quot;]" .
-        "###//div[@id=\&quot;respond\&quot;]" .
-        "###//div[@class=\&quot;bottomcontainerBox\&quot;]" .
-        "###//ul[@class=\&quot;post-by\&quot;]" .
-        "###//div[@class=\&quot;entry-meta clear\&quot;]";
-    $db->execute($sql, [time(), $name, $source_header,
-        $source_importantcontent]);
-}
-/**
- * Upgrades a Version 39 version of the Yioop! database to a Version 40 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion40(&$db)
-{
-    $db->execute("CREATE TABLE GROUP_PAGE_PRE_LINK(
-        LINK_TYPE_ID INTEGER, FROM_ID INTEGER,
-        TO_GROUP_ID INTEGER, TO_PAGE_NAME VARCHAR(" . C\TITLE_LEN .
-        "))");
-    $db->execute("CREATE INDEX GP_PRE_INDEX ON GROUP_PAGE_PRE_LINK
-        (TO_GROUP_ID, TO_PAGE_NAME)");
-}
-/**
- * Upgrades a Version 41 version of the Yioop! database to a Version 40 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion41(&$db)
-{
-    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
-        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
-    $auto_increment = $db->autoIncrement($dbinfo);
-    $serial = $db->serialType($dbinfo);
-    $db->execute("CREATE TABLE QUERY_ITEM (ID $serial PRIMARY KEY
-        $auto_increment, QUERY_HASH CHAR(".
-        C\TIMESTAMP_LEN . ") UNIQUE, QUERY VARCHAR(" . C\MAX_QUERY_LEN
-        ."), CREATION NUMERIC(" . C\TIMESTAMP_LEN . "))");
-    $db->execute("CREATE INDEX QI_QUERY_HASH_INDEX ON
-        QUERY_ITEM (QUERY_HASH)");
-}
-/**
- * Upgrades a Version 42 version of the Yioop! database to a Version 41 version
- * @param object $db datasource to use to upgrade
- */
-function upgradeDatabaseVersion42(&$db)
-{
-    $db->execute("DROP TABLE ITEM_IMPRESSION_SUMMARY");
-    $db->execute("CREATE TABLE ITEM_IMPRESSION_SUMMARY(
-        USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
-        UPDATE_PERIOD INTEGER,
-        UPDATE_TIMESTAMP NUMERIC(" . C\TIMESTAMP_LEN . "),
-        NUM_VIEWS INTEGER, PRIMARY KEY(USER_ID, ITEM_ID, ITEM_TYPE,
-        UPDATE_PERIOD, UPDATE_TIMESTAMP))");
-}
-/**
- * Upgrades a Version 43 version of the Yioop! database to a Version 41 version
- * @param object $db datasource to use to upgrade.
- */
-function upgradeDatabaseVersion43(&$db)
-{
-    $db->execute("INSERT INTO ITEM_IMPRESSION_SUMMARY
-        SELECT DISTINCT I.USER_ID AS USER_ID,
-            I.ITEM_ID AS ITEM_ID, I.ITEM_TYPE AS ITEM_TYPE,
-            " . C\FOREVER . " AS UPDATE_PERIOD,
-            0 AS UPDATE_TIMESTAMP,
-            0 AS NUM_VIEWS
-        FROM ITEM_IMPRESSION I WHERE I.ITEM_ID > 0 AND NOT EXISTS
-           (SELECT * FROM ITEM_IMPRESSION_SUMMARY IIS
-            WHERE IIS.USER_ID = I.USER_ID AND
-            IIS.ITEM_TYPE= I.ITEM_TYPE AND IIS.ITEM_ID= I.ITEM_ID
-            AND IIS.UPDATE_PERIOD = ".C\FOREVER."
-        )");
-}
 /**
  * Update the database version number to a new number
  * @param object $db datasource for Yioop database
diff --git a/src/library/VersionFunctions.php b/src/library/VersionFunctions.php
new file mode 100644
index 000000000..ed2044260
--- /dev/null
+++ b/src/library/VersionFunctions.php
@@ -0,0 +1,1247 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2016  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
+ *
+ * This file contains global functions connected to upgrading the database
+ * between different versions of Yioop!
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2016
+ * @filesource
+ */
+namespace seekquarry\yioop\library;
+
+use seekquarry\yioop\configs as C;
+use seekquarry\yioop\models as M;
+use seekquarry\yioop\models\datasources as D;
+
+
+/**
+ * Upgrades a Version 0 version of the Yioop! database to a Version 1 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion1(&$db)
+{
+    $db->execute("CREATE TABLE VERSION (ID INTEGER PRIMARY KEY)");
+    $db->execute("INSERT INTO VERSION VALUES (1)");
+    $db->execute("CREATE TABLE USER_SESSION( USER_ID INTEGER PRIMARY KEY, ".
+        "SESSION VARCHAR(".C\MAX_GROUP_POST_LEN."))");
+}
+/**
+ * Upgrades a Version 1 version of the Yioop! database to a Version 2 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion2(&$db)
+{
+    $db->execute("ALTER TABLE USERS ADD UNIQUE ( USER_NAME )" );
+    $db->execute("INSERT INTO LOCALE VALUES (
+        17, 'kn', 'ಕನ್ನಡ', 'lr-tb')");
+    $db->execute("INSERT INTO LOCALE VALUES (
+        18, 'hi', 'हिन्दी', 'lr-tb')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (3, 5,
+        'Modifier les rôles')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (4, 5,
+        'Modifier les indexes')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (5, 5,
+        'Mélanger les indexes')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (6, 5,
+        'Les filtres de recherche')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (7, 5,
+        'Modifier les lieux')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (8, 5,
+        'Configurer')");
+}
+/**
+ * Upgrades a Version 2 version of the Yioop! database to a Version 3 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion3(&$db)
+{
+    $db->execute("INSERT INTO LOCALE VALUES (19, 'tr', 'Türkçe', 'lr-tb')");
+    $db->execute("INSERT INTO ROLE_ACTIVITY VALUES (1, 10)");
+    $db->execute("CREATE TABLE MACHINE (
+        NAME VARCHAR(16) PRIMARY KEY, URL VARCHAR(".C\MAX_URL_LEN.") UNIQUE,
+        HAS_QUEUE_SERVER BOOLEAN, NUM_FETCHERS INTEGER)");
+    $db->execute("DELETE FROM ACTIVITY WHERE ACTIVITY_ID>5 AND " .
+        "ACTIVITY_ID<11");
+    $db->execute(
+        "DELETE FROM TRANSLATION WHERE TRANSLATION_ID>5 AND " .
+        "TRANSLATION_ID<11");
+    $db->execute("DELETE FROM TRANSLATION_LOCALE ".
+        "WHERE TRANSLATION_ID>5 AND TRANSLATION_ID<11");
+    $db->execute("INSERT INTO ACTIVITY VALUES (6, 6, 'pageOptions')");
+    $db->execute("INSERT INTO ACTIVITY VALUES (7, 7, 'searchFilters')");
+    $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')");
+    $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(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')");
+
+    $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 (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')");
+
+    $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')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (8, 5,
+        'Modifier les ordinateurs')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (9, 5,
+        'Modifier les lieux')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 5,
+        'Configurer')");
+
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (
+        9, 9, 'ローケル管理')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 9, '設定')");
+
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (
+        9, 10, '로케일 관리')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 10, '구성')");
+
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (9, 15,
+        'Quản lý miền địa phương')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 15,
+        'Sắp xếp hoạt động dựa theo hoạch định')");
+}
+/**
+ * Upgrades a Version 3 version of the Yioop! database to a Version 4 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion4(&$db)
+{
+    $db->execute("ALTER TABLE MACHINE ADD COLUMN PARENT VARCHAR(".
+        C\NAME_LEN.")");
+}
+/**
+ * Upgrades a Version 4 version of the Yioop! database to a Version 5 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion5(&$db)
+{
+    $static_page_path = C\LOCALE_DIR."/". C\DEFAULT_LOCALE."/pages";
+    if (!file_exists($static_page_path)) {
+        mkdir($static_page_path);
+    }
+    $default_bot_txt_path = "$static_page_path/bot.thtml";
+    $old_bot_txt_path = C\WORK_DIRECTORY."/bot.txt";
+    if (file_exists($old_bot_txt_path) && !file_exists($default_bot_txt_path)){
+        rename($old_bot_txt_path, $default_bot_txt_path);
+    }
+    $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)
+{
+    if (!file_exists(C\PREP_DIR)) {
+        mkdir(C\PREP_DIR);
+    }
+    $db->setWorldPermissionsRecursive(C\PREP_DIR);
+}
+/**
+ * Upgrades a Version 6 version of the Yioop! database to a Version 7 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion7(&$db)
+{
+    $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')");
+}
+/**
+ * Upgrades a Version 7 version of the Yioop! database to a Version 8 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion8(&$db)
+{
+    $db->execute("INSERT INTO LOCALE VALUES (20, 'fa', 'فارسی', 'rl-tb')");
+    $db->execute("CREATE TABLE ACTIVE_FETCHER (NAME VARCHAR(".C\NAME_LEN."),".
+        " FETCHER_ID INTEGER)");
+    $db->execute("CREATE TABLE CRON_TIME " .
+        "(TIMESTAMP INT(".C\TIMESTAMP_LEN."))");
+    $db->execute("INSERT INTO CRON_TIME VALUES ('".time()."')");
+    upgradeLocales();
+}
+/**
+ * Upgrades a Version 8 version of the Yioop! database to a Version 9 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion9(&$db)
+{
+    $db->execute("INSERT INTO ROLE_ACTIVITY VALUES (1, 11)");
+    $db->execute("DELETE FROM ACTIVITY WHERE ACTIVITY_ID >= 8");
+    $db->execute("DELETE FROM TRANSLATION WHERE TRANSLATION_ID >= 8");
+    $db->execute("DELETE FROM TRANSLATION_LOCALE WHERE TRANSLATION_ID >= 8");
+    $db->execute("INSERT INTO ACTIVITY VALUES (8, 8, 'searchSources')");
+    $db->execute("INSERT INTO ACTIVITY VALUES (9, 9, 'manageMachines')");
+    $db->execute("INSERT INTO ACTIVITY VALUES (10, 10, 'manageLocales')");
+    $db->execute("INSERT INTO ACTIVITY VALUES (11, 11, 'configure')");
+    $db->execute("INSERT INTO TRANSLATION VALUES(8,
+        'db_activity_search_services')");
+    $db->execute("INSERT INTO TRANSLATION VALUES(9,
+        'db_activity_manage_machines')");
+    $db->execute("INSERT INTO TRANSLATION VALUES (10,
+        'db_activity_manage_locales')");
+    $db->execute("INSERT INTO TRANSLATION VALUES (11,
+        'db_activity_configure')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (8, 1,
+        'Search Sources')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (9, 1,
+        'Manage Machines')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 1,
+        'Manage Locales')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (11, 1,
+        'Configure')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (8, 5,
+        'Sources de recherche')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (9, 5,
+        'Modifier les ordinateurs')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 5,
+        'Modifier les lieux')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (11, 5,
+        'Configurer')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 9,
+        'ローケル管理')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (11, 9,
+        '設定')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10,
+        10, '로케일 관리')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (11,
+        10, '구성')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (10, 15,
+        'Quản lý miền địa phương')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES (11, 15,
+        'Sắp xếp hoạt động dựa theo hoạch định')");
+}
+/**
+ * Upgrades a Version 9 version of the Yioop! database to a Version 10 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion10(&$db)
+{
+    $db->execute("CREATE TABLE MEDIA_SOURCE (TIMESTAMP INT(11) PRIMARY KEY,
+        NAME VARCHAR(16) UNIQUE, TYPE VARCHAR(16),
+        SOURCE_URL VARCHAR(256), THUMB_URL VARCHAR(256)
+        )");
+    $db->execute("INSERT INTO MEDIA_SOURCE VALUES ('1342634195',
+        'YouTube', 'video', 'http://www.youtube.com/watch?v={}&',
+        'http://img.youtube.com/vi/{}/2.jpg')");
+    $db->execute("INSERT INTO MEDIA_SOURCE VALUES ('1342634196',
+        'MetaCafe', 'video', 'http://www.metacafe.com/watch/{}/',
+        'http://www.metacafe.com/thumb/{}.jpg')");
+    $db->execute("INSERT INTO MEDIA_SOURCE VALUES ('1342634197',
+        'DailyMotion', 'video', 'http://www.dailymotion.com/video/{}',
+        'http://www.dailymotion.com/thumbnail/video/{}')");
+}
+/**
+ * Upgrades a Version 10 version of the Yioop! database to a Version 11 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion11(&$db)
+{
+    $db->execute("DROP TABLE CRON_TIME");
+    $db->execute("ALTER TABLE ROLE_ACTIVITY ADD CONSTRAINT
+        PK_RA PRIMARY KEY(ROLE_ID, ACTIVITY_ID)");
+    $db->execute("CREATE TABLE SUBSEARCH (LOCALE_STRING VARCHAR(16) " .
+        "PRIMARY KEY, FOLDER_NAME VARCHAR(16), INDEX_IDENTIFIER CHAR(13))");
+}
+/**
+ * Upgrades a Version 11 version of the Yioop! database to a Version 12 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion12(&$db)
+{
+    $db->execute("INSERT INTO CRAWL_MIXES VALUES (2, 'images')");
+    $db->execute("INSERT INTO MIX_GROUPS VALUES(2, 0, 1)");
+    $db->execute("INSERT INTO MIX_COMPONENTS VALUES(2, 0, 1, 1,
+        'media:image')");
+    $db->execute("INSERT INTO CRAWL_MIXES VALUES (3, 'videos')");
+    $db->execute("INSERT INTO MIX_GROUPS VALUES(3, 0, 1)");
+    $db->execute("INSERT INTO MIX_COMPONENTS VALUES(3, 0, 1, 1,
+        'media:video')");
+    $db->execute("INSERT INTO SUBSEARCH VALUES('db_subsearch_images',
+        'images','m:2',50)");
+    $db->execute("INSERT INTO TRANSLATION VALUES " .
+        "(1002,'db_subsearch_images')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES
+            (1002, 1, 'Images' )");
+
+    $db->execute("INSERT INTO SUBSEARCH VALUES ('db_subsearch_videos',
+        'videos','m:3',10)");
+    $db->execute("INSERT INTO TRANSLATION VALUES " .
+        "(1003,'db_subsearch_videos')");
+    $db->execute("INSERT INTO TRANSLATION_LOCALE VALUES
+            (1003, 1, 'Videos' )");
+}
+/**
+ * Upgrades a Version 12 version of the Yioop! database to a Version 13 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion13(&$db)
+{
+    $db->execute("CREATE TABLE FEED_ITEM (GUID VARCHAR(11) PRIMARY KEY,
+        TITLE VARCHAR(512), LINK VARCHAR(256), DESCRIPTION VARCHAR(4096),
+        PUBDATE INT, SOURCE_NAME VARCHAR(16))");
+    if (!file_exists(C\WORK_DIRECTORY."/feeds")) {
+        mkdir(C\WORK_DIRECTORY."/feeds");
+    }
+    upgradeLocales(); //force locale upgrade
+}
+/**
+ * Upgrades a Version 13 version of the Yioop! database to a Version 14 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion14(&$db)
+{
+    $db->execute("ALTER TABLE MEDIA_SOURCE ADD LANGUAGE VARCHAR(7)");
+}
+/**
+ * Upgrades a Version 14 version of the Yioop! database to a Version 15 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion15(&$db)
+{
+    $db->execute("DELETE FROM MIX_COMPONENTS WHERE MIX_TIMESTAMP=2
+        AND GROUP_ID=0");
+    $db->execute("INSERT INTO MIX_COMPONENTS VALUES(
+        2, 0, 1, 1, 'media:image site:doc')");
+    $db->execute("DELETE FROM MIX_COMPONENTS WHERE MIX_TIMESTAMP=3
+        AND GROUP_ID=0");
+    $db->execute("INSERT INTO MIX_COMPONENTS VALUES(
+        3, 0, 1, 1, 'media:video site:doc')");
+    $db->execute("INSERT INTO LOCALE VALUES (21, 'te',
+        'తెలుగు', 'lr-tb')");
+    upgradeLocales();
+}
+/**
+ * Upgrades a Version 15 version of the Yioop! database to a Version 16 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion16(&$db)
+{
+    addActivityAtId($db, 'db_activity_manage_classifiers',
+        "manageClassifiers", 4);
+    updateTranslationForStringId($db, 'db_activity_manage_classifiers',
+        'en-US', 'Manage Classifiers');
+    updateTranslationForStringId($db, 'db_activity_manage_classifiers',
+        'fr-FR', 'Manage Classifiers');
+    updateTranslationForStringId($db, 'db_activity_manage_groups', 'fr-FR',
+        'Classificateurs');
+
+    $old_archives_path = C\WORK_DIRECTORY."/cache/archives";
+    $new_archives_path = C\WORK_DIRECTORY."/archives";
+    if (file_exists($old_archives_path)) {
+        rename($old_archives_path, $new_archives_path);
+    } else if (!file_exists($new_archives_path)) {
+        mkdir($new_archives_path);
+    }
+    $db->setWorldPermissionsRecursive($new_archives_path);
+
+    $new_classifiers_path = C\WORK_DIRECTORY."/classifiers";
+    if (!file_exists($new_classifiers_path)) {
+        mkdir($new_classifiers_path);
+    }
+    $db->setWorldPermissionsRecursive($new_classifiers_path);
+    upgradeLocales();
+}
+/**
+ * Upgrades a Version 16 version of the Yioop! database to a Version 17 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion17(&$db)
+{
+    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
+    $auto_increment = $db->autoIncrement($dbinfo);
+    $db->execute("CREATE TABLE GROUPS (GROUP_ID INTEGER PRIMARY KEY
+        $auto_increment ,GROUP_NAME VARCHAR(128), CREATED_TIME INT(11),
+           CREATOR_ID INT(11))");
+    $db->execute("CREATE TABLE USER_GROUP (USER_ID INTEGER ,
+        GROUP_ID INTEGER,PRIMARY KEY (GROUP_ID, USER_ID) )");
+    addActivityAtId($db, 'db_activity_manage_groups', "manageGroups", 4);
+    updateTranslationForStringId($db, 'db_activity_manage_groups', 'en-US',
+        'Manage Groups');
+    updateTranslationForStringId($db, 'db_activity_manage_groups', 'fr-FR',
+        'Modifier les groupes');
+    upgradeLocales();
+}
+/**
+ * Upgrades a Version 17 version of the Yioop! database to a Version 18 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion18(&$db)
+{
+    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
+    $auto_increment = $db->autoIncrement($dbinfo);
+    $db->execute("CREATE TABLE ACCESS (NAME VARCHAR(16), ID INTEGER,
+                TYPE VARCHAR(16))");
+    $db->execute("CREATE TABLE BLOG_DESCRIPTION (TIMESTAMP INT(11) UNIQUE,
+                DESCRIPTION VARCHAR(4096))");
+    addActivityAtId($db, 'db_activity_blogs_pages', "blogPages", 6);
+    updateTranslationForStringId($db, 'db_activity_blogs_pages', 'en-US',
+        'Blogs and Pages');
+    updateTranslationForStringId($db, 'db_activity_blogs_pages', 'fr-FR',
+        'les blogs et les pages');
+    upgradeLocales();
+}
+/**
+ * Upgrades a Version 18 version of the Yioop! database to a Version 19 version
+ * This update has been superseded by the Version20 update and so its contents
+ * have been eliminated.
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion19(&$db)
+{
+}
+/**
+ * Upgrades a Version 19 version of the Yioop! database to a Version 20 version
+ * This is a major upgrade as the user table have changed. This also acts
+ * as a cumulative since version 0.98. It involves a web form that has only
+ * been localized to English
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion20(&$db)
+{
+    if (!isset($_REQUEST['v20step'])) {
+        $_REQUEST['v20step'] = 1;
+    }
+    $upgrade_check_file = C\WORK_DIRECTORY."/v20check.txt";
+    if (!file_exists($upgrade_check_file)) {
+        $upgrade_password = substr(sha1(microtime(true).C\AUTH_KEY), 0, 8);
+        file_put_contents($upgrade_check_file, $upgrade_password);
+    } else {
+        $v20check = trim(file_get_contents($upgrade_check_file));
+        if (isset($_REQUEST['v20step']) && $_REQUEST['v20step'] == 2 &&
+            (!isset($_REQUEST['upgrade_code'])||
+            $v20check != trim($_REQUEST['upgrade_code']))) {
+            $_REQUEST['v20step'] = 1;
+            $data['SCRIPT'] = "doMessage('<h1 class=\"red\" >".
+                "v20check.txt not typed in correctly!</h1>')";
+        }
+    }
+    switch ($_REQUEST['v20step']) {
+        case "2":
+            $profile_model = new M\ProfileModel(C\DB_NAME, false);
+            $profile_model->db = $db;
+            $save_tables = ["ACTIVE_FETCHER", "CURRENT_WEB_INDEX",
+                "FEED_ITEM", "MACHINE", "MEDIA_SOURCE", "SUBSEARCH",
+                "VERSION"];
+            $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+                "DB_USER" => C\DB_USER, "DB_PASSWORD" => C\DB_PASSWORD,
+                "DB_NAME" => C\DB_NAME];
+            $creation_time = microTimestamp();
+            $profile = $profile_model->getProfile(C\WORK_DIRECTORY);
+            $new_profile = $profile;
+            $new_profile['AUTHENTICATION_MODE'] = C\NORMAL_AUTHENTICATION;
+            $new_profile['FIAT_SHAMIR_MODULUS'] = generateFiatShamirModulus();
+            $new_profile['MAIL_SERVER']= "";
+            $new_profile['MAIL_PORT']= "";
+            $new_profile['MAIL_USERNAME']= "";
+            $new_profile['MAIL_PASSWORD']= "";
+            $new_profile['MAIL_SECURITY']= "";
+            $new_profile['REGISTRATION_TYPE'] = 'disable_registration';
+            $new_profile['USE_MAIL_PHP'] = true;
+            $new_profile['WORD_SUGGEST'] = true;
+            $profile_model->updateProfile(C\WORK_DIRECTORY, $new_profile,
+                $profile);
+            //get current users
+            //(assume can fit in memory and doesn't take long)
+            $users = [];
+            $sha1_of_upgrade_code = bchexdec(sha1($v20check));
+            $temp = bcpow($sha1_of_upgrade_code . '', '2');
+            $zkp_password = bcmod($temp, $new_profile['FIAT_SHAMIR_MODULUS']);
+            $user_tables_sql = ["SELECT USER_NAME FROM USER",
+                "SELECT USER_NAME, FIRST_NAME, LAST_NAME, EMAIL FROM USERS"];
+            $i = 0;
+            foreach ($user_tables_sql as $sql) {
+                $result = $db->execute($sql);
+                if ($result) {
+                    while($users[$i] = $db->fetchArray($result)) {
+                        $setup_user_fields = [];
+                        if ($users[$i]["USER_NAME"] == "root" ||
+                            $users[$i]["USER_NAME"] == "public") { continue; }
+                        $users[$i]["FIRST_NAME"] =
+                            (isset($users[$i]["FIRST_NAME"])) ?
+                            $users[$i]["FIRST_NAME"] : "FIRST_$i";
+                        $users[$i]["LAST_NAME"] =
+                            (isset($users[$i]["LAST_NAME"])) ?
+                            $users[$i]["LAST_NAME"] : "LAST_$i";
+                        $users[$i]["EMAIL"] =
+                            (isset($users[$i]["EMAIL"])) ?
+                            $users[$i]["EMAIL"] : "user$i@dev.null";
+                        /* although not by default using zkp set up so
+                           accounts would work on switch
+                        */
+                        $users[$i]["PASSWORD"] = $v20check;
+                        $users[$i]["STATUS"] = C\INACTIVE_STATUS;
+                        $users[$i]["CREATION_TIME"] = $creation_time;
+                        $users[$i]["UPS"] = 0;
+                        $users[$i]["DOWNS"] = 0;
+                        $users[$i]["ZKP_PASSWORD"] = $zkp_password;
+                        $i++;
+                    }
+                    unset($users[$i]);
+                    $result = null;
+                }
+            }
+            $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+                "DB_USER" => C\DB_USER, "DB_PASSWORD" => C\DB_PASSWORD,
+                "DB_NAME" => C\DB_NAME];
+            $profile_model->initializeSql($db, $dbinfo);
+            $database_tables = array_diff(
+                array_keys($profile_model->create_statements),
+                $save_tables);
+            $database_tables = array_merge($database_tables,
+                ["BLOG_DESCRIPTION", "USER_OLD", "ACCESS"]);
+            foreach ($database_tables as $table) {
+                if (!in_array($table, $save_tables)){
+                    $db->execute("DROP TABLE ".$table);
+                }
+            }
+            if ($profile_model->migrateDatabaseIfNecessary(
+                $dbinfo, $save_tables)) {
+                $user_model = new M\UserModel(C\DB_NAME, false);
+                $user_model->db = $db;
+                foreach ($users as $user) {
+                    $user_model->addUser($user["USER_NAME"], $user["PASSWORD"],
+                        $user["FIRST_NAME"], $user["LAST_NAME"],
+                        $user["EMAIL"], $user["STATUS"],
+                        $user["ZKP_PASSWORD"]);
+                }
+                $user = [];
+                $user['USER_ID'] = C\ROOT_ID;
+                $user['PASSWORD'] = $v20check;
+                $user["ZKP_PASSWORD"] = $zkp_password;
+                $user_model->updateUser($user);
+                $db->execute("DELETE FROM VERSION WHERE ID < 19");
+                $db->execute("UPDATE VERSION SET ID=20 WHERE ID=19");
+                return;
+            }
+            $data['SCRIPT'] = "doMessage('<h1 class=\"red\" >".
+                "Couldn't migrate database tables from defaults!</h1>')";
+            // no break
+        case "1":
+            // no break
+        default:
+            ?>
+            <!DOCTYPE html>
+            <html lang='en-US'>
+            <head>
+            <title>Yioop Upgrade Detected</title>
+            <meta name="ROBOTS" content="NOINDEX,NOFOLLOW" />
+            <meta name="Author" content="Christopher Pollett" />
+            <meta charset="utf-8" />
+            <?php if (C\MOBILE) {?>
+            <meta name="viewport" content="width=device-width,initial-scale=1">
+            <?php } ?>
+            <link rel="stylesheet" type="text/css"
+                 href="<?= C\BASE_URL ?>/css/search.css" />
+            </head>
+            <body class="html-ltr <?php if (C\MOBILE) {e('mobile'); } ?>" >
+            <div id="message" ></div>
+            <div class='small-margin-current-activity'>
+            <h1 class='center green'>Yioop Upgrade Detected!</h1>
+            <p>Upgrading to Version 1 of Yioop from an earlier version
+            is a major upgrade. The way passwords are stored and the
+            organization of the Yioop database has changed. Here is
+            what is preserved by this upgrade:</p>
+            <ol>
+            <li>Existing crawls and archive data.</li>
+            <li>Machines known if this instance is a name server.</li>
+            <li>Media sources and subsearches.</li>
+            <li>Feed items.</li>
+            </ol>
+            <p>Here is what happens during the upgrade which might
+            result in data loss:</p>
+            <ol>
+            <li>Root and user account passwords are changed to the contents of
+            v20check.txt.</li>
+            <li>User accounts other than root are marked as inactived,
+            so will have tobe activated under Manage Users before that person
+            can sign in.</li>
+            <li>All roles except Admin and User are deleted. Root
+            will be given Admin role, all other users will receive
+            User role.</li>
+            <li>All existing groups are deleted.</li>
+            <li>Existing crawl mixes will be deleted.</li>
+            <li>Any customized translations that begin with the prefix db_.
+            Other still in use translations will be preserved.</li>
+            </ol>
+            <p>If given the above you don't want to upgrade, merely replace
+            this folder with the contents of your old Yioop instance and
+            you should be able to continue to use Yioop as before.</p>
+            <p>If you decide to proceed with the upgrade, please back up
+            both your existing database and work directory.</p>
+            <form method="post" action="?">
+            <p><label for="upgrade-code">
+            <b>In the field below enter the string found in the file:<br />
+            <span class="green"><?= C\WORK_DIRECTORY."/v20check.txt"?></span>
+            </b></label></p>
+            <input id='upgrade-code' class="extra-wide-field"
+                name="upgrade_code" type="text" />
+            <input type="hidden" name="v20step" value="2" />
+            <button class="button-box" type="submit">Upgrade</button>
+            </form>
+            <?php
+        break;
+    }
+    ?>
+    </div>
+    <script type="text/javascript" src="<?= C\BASE_URL
+        ?>/scripts/basic.js" ></script>
+    <script type="text/javascript" >
+    <?php
+    if (isset($data['SCRIPT'])) {
+        e($data['SCRIPT']);
+    }
+    ?></script>
+    </body>
+    </html>
+   <?php
+   exit();
+}
+/**
+ * Upgrades a Version 20 version of the Yioop! database to a Version 21 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion21(&$db)
+{
+    $db->execute("CREATE TABLE GROUP_THREAD_VIEWS(
+        THREAD_ID INTEGER PRIMARY KEY, NUM_VIEWS INTEGER)");
+    $db->execute("ALTER TABLE MEDIA_SOURCE RENAME TO MEDIA_SOURCE_OLD");
+    $db->execute("CREATE TABLE MEDIA_SOURCE (TIMESTAMP NUMERIC(11) PRIMARY KEY,
+        NAME VARCHAR(64) UNIQUE, TYPE VARCHAR(16), SOURCE_URL VARCHAR(256),
+        AUX_INFO VARCHAR(512), LANGUAGE VARCHAR(7))");
+    D\DatasourceManager::copyTable("MEDIA_SOURCE_OLD", $db, "MEDIA_SOURCE",
+        $db);
+    $db->execute("DROP TABLE MEDIA_SOURCE_OLD");
+}
+/**
+ * Upgrades a Version 21 version of the Yioop! database to a Version 22 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion22(&$db)
+{
+    $db->execute("INSERT INTO GROUP_THREAD_VIEWS
+        SELECT DISTINCT PARENT_ID, 1 FROM GROUP_ITEM WHERE
+        NOT EXISTS (SELECT THREAD_ID
+        FROM GROUP_THREAD_VIEWS WHERE THREAD_ID=PARENT_ID)");
+    $db->execute("ALTER TABLE LOCALE ADD ACTIVE INTEGER DEFAULT 1");
+}
+/**
+ * Upgrades a Version 22 version of the Yioop! database to a Version 23 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion23(&$db)
+{
+    $db->execute("ALTER TABLE GROUPS ADD POST_LIFETIME INTEGER DEFAULT ".
+        FOREVER);
+}
+/**
+ * Upgrades a Version 23 version of the Yioop! database to a Version 24 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion24(&$db)
+{
+    $profile_model = new M\ProfileModel(C\DB_NAME, false);
+    $profile_model->db = $db;
+    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+        "DB_USER" => C\DB_USER, "DB_PASSWORD" => C\DB_PASSWORD,
+        "DB_NAME" => C\DB_NAME];
+    $profile_model->initializeSql($db, $dbinfo);
+    foreach ($profile_model->create_statements as $object_name => $statement) {
+        if (stristr($object_name, "_INDEX")) {
+            if (!$db->execute($statement)) {
+                echo $statement." ERROR!";
+                exit();
+            }
+        } else {
+            if (!$db->execute("ALTER TABLE $object_name RENAME TO " .
+                $object_name . "_OLD")) {
+                echo "RENAME $object_name ERROR!";
+                exit();
+            }
+            if (!$db->execute($statement)) {
+                echo $statement." ERROR!";
+                exit();
+            }
+            D\DatasourceManager::copyTable($object_name."_OLD", $db,
+                $object_name, $db);
+            $db->execute("DROP TABLE ".$object_name."_OLD");
+        }
+    }
+}
+/**
+ * Upgrades a Version 24 version of the Yioop! database to a Version 25 version
+ * This version upgrade includes creation of Help group that holds help pages.
+ * Help Group is created with GROUP_ID=HELP_GROUP_ID. If a Group with
+ * Group_ID=HELP_GROUP_ID already exists,
+ * then that GROUP is moved to the end of the GROUPS table(Max group id is
+ * used).
+ *
+ * @param object $db data source to use to upgrade
+ */
+function upgradeDatabaseVersion25(&$db)
+{
+    /** For reading HELP_GROUP_ID**/
+    $sql = "SELECT COUNT(*) AS NUM FROM GROUPS WHERE GROUP_ID=" .
+        C\HELP_GROUP_ID;
+    $result = $db->execute($sql);
+    $row = ($db->fetchArray($result));
+    $is_taken = intval($row['NUM']);
+    if ($is_taken > 0) {
+        //Get the max group Id , increment it to push the old group
+        $sql = "SELECT MAX(GROUP_ID) AS MAX_GROUP_ID FROM GROUPS";
+        $result = $db->execute($sql);
+        $row = $db->fetchArray($result);
+        $max_group_id = $row['MAX_GROUP_ID'] + 1;
+        $tables_to_update_group_id = ["GROUPS", "GROUP_ITEM",
+            "GROUP_PAGE", "GROUP_PAGE_HISTORY", "USER_GROUP"];
+        foreach ($tables_to_update_group_id as $table) {
+            $sql = "UPDATE $table "
+                . "Set GROUP_ID=$max_group_id "
+                . "WHERE "
+                . "GROUP_ID=" . C\HELP_GROUP_ID;
+            $db->execute($sql);
+        }
+    }
+    //Insert the Help Group
+    $creation_time = microTimestamp();
+    $sql = "INSERT INTO GROUPS VALUES(" . C\HELP_GROUP_ID . ",'Help','"
+        . $creation_time . "','" . C\ROOT_ID . "',
+        '" . C\PUBLIC_BROWSE_REQUEST_JOIN . "', '" . C\GROUP_READ_WIKI . "',
+        " . C\UP_DOWN_VOTING_GROUP . ", " . C\FOREVER . ")";
+    $db->execute($sql);
+    $now = time();
+    $db->execute("INSERT INTO USER_GROUP VALUES (" . C\ROOT_ID . ", " .
+        C\HELP_GROUP_ID . ", " . ACTIVE_STATUS . ", $now)");
+    $db->execute("INSERT INTO USER_GROUP VALUES (" . C\PUBLIC_USER_ID . ", " .
+        C\HELP_GROUP_ID . ", " . C\ACTIVE_STATUS . ", $now)");
+    //Insert into Groups
+    $help_pages = getWikiHelpPages();
+    foreach ($help_pages as $page_name => $page_content) {
+        $page_content = str_replace("&amp;", "&", $page_content);
+        $page_content = @htmlentities($page_content, ENT_QUOTES, "UTF-8");
+        $group_model = new M\GroupModel(C\DB_NAME, false);
+        $group_model->db = $db;
+        $group_model->setPageName(C\ROOT_ID, C\HELP_GROUP_ID, $page_name,
+            $page_content, "en-US", "Creating Default Pages", "$page_name "
+            . "Help Page Created!", "Discuss the page in this thread!");
+    }
+}
+/**
+ * Upgrades a Version 25 version of the Yioop! database to a Version 26 version
+ * This version upgrade includes updation fo the Help pages in the database to
+ * work with the changes to the way Hyperlinks are specified in wiki markup.
+ * The changes were implemented to point all articles with page names
+ * containing %20 to be able to work with '_' and vice versa.
+ * @param object $db data source to use to upgrade
+ */
+function upgradeDatabaseVersion26(&$db)
+{
+    //Delete all existing pages in Help group
+    $params = [C\HELP_GROUP_ID];
+    $sql = "DELETE FROM GROUP_PAGE WHERE GROUP_ID=?";
+    $db->execute($sql, $params);
+    $sql = "DELETE FROM GROUP_PAGE_HISTORY WHERE GROUP_ID=?";
+    $db->execute($sql, $params);
+    //Insert the Help Group pages with corrected titles
+    $creation_time = microTimestamp();
+    $sql = "INSERT INTO GROUPS VALUES(" . C\HELP_GROUP_ID . ",'Help','"
+        . $creation_time . "','" . C\ROOT_ID . "',
+        '" . C\PUBLIC_BROWSE_REQUEST_JOIN . "', '" . C\GROUP_READ_WIKI . "',
+        " . C\UP_DOWN_VOTING_GROUP . ", " . C\FOREVER . ")";
+    $db->execute($sql);
+    $now = time();
+    $db->execute("INSERT INTO USER_GROUP VALUES (" . C\ROOT_ID . ", " .
+        C\HELP_GROUP_ID . ", " . C\ACTIVE_STATUS . ", $now)");
+    $db->execute("INSERT INTO USER_GROUP VALUES (" . C\PUBLIC_USER_ID . ", " .
+        C\HELP_GROUP_ID . ", " . C\ACTIVE_STATUS . ", $now)");
+    //Insert into Groups
+    $help_pages = getWikiHelpPages();
+    foreach ($help_pages as $page_name => $page_content) {
+        $page_content = str_replace("&amp;", "&", $page_content);
+        $page_content = @htmlentities($page_content, ENT_QUOTES, "UTF-8");
+        $group_model = new M\GroupModel(C\DB_NAME, false);
+        $group_model->db = $db;
+        $group_model->setPageName(C\ROOT_ID, C\HELP_GROUP_ID, $page_name,
+            $page_content, "en-US", "Creating Default Pages", "$page_name "
+            . "Help Page Created!", "Discuss the page in this thread!");
+    }
+}
+/**
+ * Upgrades a Version 26 version of the Yioop! database to a Version 27 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion27(&$db)
+{
+    $db->execute("ALTER TABLE GROUP_ITEM ADD COLUMN EDIT_DATE
+        NUMERIC(".C\TIMESTAMP_LEN.")");
+}
+/**
+ * Upgrades a Version 27 version of the Yioop! database to a Version 28 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion28(&$db)
+{
+    $db->execute("ALTER TABLE FEED_ITEM ADD COLUMN IMAGE_LINK
+        VARCHAR(".C\MAX_URL_LEN.")");
+}
+/**
+ * Upgrades a Version 28 version of the Yioop! database to a Version 29 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion29(&$db)
+{
+    $sql = "INSERT INTO LOCALE (LOCALE_NAME, LOCALE_TAG,
+        WRITING_MODE, ACTIVE) VALUES (?, ?, ?, ?)";
+    $db->execute($sql, ["Nederlands", "nl", "lr-tb", 1]);
+    $nl_translations = [
+        'db_activity_manage_account' => 'Account Beheren',
+        'db_activity_manage_users' => 'Gebruikers beheren',
+        'db_activity_manage_roles' => 'Rollen beheren',
+        'db_activity_manage_groups' => 'Groepen beheren',
+        'db_activity_manage_crawl' => 'Beheer Crawl',
+        'db_activity_mix_crawls' => 'Mix Crawls',
+        'db_activity_group_feeds' => 'Feeds en Wikis',
+        'db_activity_manage_classifiers' => 'Beheer Classifiers',
+        'db_activity_file_options' => 'Opties voor de pagina',
+        'db_activity_results_editor' => 'Resultaten Editor',
+        'db_activity_search_services' => 'Zoek Bronnen',
+        'db_activity_manage_machines' => 'Beheer Machines',
+        'db_activity_manage_locales' => 'Beheer varianten',
+        'db_activity_server_settings' => 'Server Settings',
+        'db_activity_security' => 'Veiligheid',
+        'db_activity_configure' => 'Configureren',
+        'db_subsearch_images' => 'Beelden',
+        'db_subsearch_videos' => 'Videos',
+        'db_subsearch_news' => 'Nieuws',
+    ];
+    foreach ($nl_translations as $identifier => $translation) {
+        updateTranslationForStringId($db, $identifier, 'nl', $translation);
+    }
+}
+/**
+ * Upgrades a Version 29 version of the Yioop! database to a Version 30 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion30(&$db)
+{
+    $db->execute("CREATE TABLE MEDIA_UPDATER_PROPERTIES(
+        NAME VARCHAR(". C\NAME_LEN .") NOT NULL, VALUE VARCHAR(".
+        C\NAME_LEN.") NOT NULL)");
+    $db->execute("INSERT INTO MEDIA_UPDATER_PROPERTIES
+        VALUES ('PRESENT_ON_NAME_SERVER','true')");
+}
+/**
+ * Upgrades a Version 30 version of the Yioop! database to a Version 31 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion31(&$db)
+{
+    $db->execute("DROP TABLE MEDIA_UPDATER_PROPERTIES");
+    $db->execute("DROP TABLE ACTIVE_FETCHER");
+    $db->execute("CREATE TABLE ACTIVE_PROCESS (NAME VARCHAR(". C\NAME_LEN.
+        "), ID INTEGER, TYPE VARCHAR(" . C\NAME_LEN . "))");
+    $profile_model = new M\ProfileModel(C\DB_NAME, false);
+    $profile['MEDIA_MODE'] = "name_server";
+    $profile_model->updateProfile(C\WORK_DIRECTORY, [], $profile);
+}
+/**
+ * Upgrades a Version 31 version of the Yioop! database to a Version 32 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion32(&$db)
+{
+    $role_model = new M\RoleModel(C\DB_NAME, false);
+    $role_model->db = $db;
+    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
+    $auto_increment = $db->autoIncrement($dbinfo);
+    $db->execute("ALTER TABLE USERS ADD COLUMN IS_ADVERTISER INTEGER");
+    $db->execute("CREATE TABLE ADVERTISEMENTS(ADV_ID INTEGER
+        PRIMARY KEY $auto_increment, USER_ID INTEGER,
+        ADV_NAME VARCHAR(". C\ADVERTISEMENT_NAME_LEN ."),
+        ADV_DESCRIPTION VARCHAR(". C\ADVERTISEMENT_TEXT_LEN ."),
+        ADV_DESTINATION VARCHAR(". C\ADVERTISEMENT_DESTINATION_LEN ."),
+        ADV_KEYWORDS VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN ."),
+        STATUS INTEGER, ADV_BUDGET INTEGER,
+        ADV_DATE VARCHAR(". C\ADVERTISEMENT_DATE_LEN ."))");
+    $db->execute("CREATE TABLE ADVERTISEMENT_KEYWORD
+        (ID INTEGER PRIMARY KEY $auto_increment,
+        KEYWORD VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN ."),
+        BID_AMOUNT INTEGER,
+        BID_DATE VARCHAR(". C\ADVERTISEMENT_DATE_LEN ."))");
+    $db->execute("CREATE TABLE ADVERTISEMENT_METADATA
+        (ADV_ID INTEGER, CLICKS INTEGER, IMPRESSIONS INTEGER)");
+    addActivityAtId($db, 'db_activity_manage_advertisements',
+        "manageAdvertisements", 17);
+    updateTranslationForStringId($db, 'db_activity_manage_advertisements',
+        'en-US', 'Manage Advertisements');
+    $role_model->addRole('Business User');
+    $role_id = $role_model->getRoleId('Business User');
+    $role_model->addActivityRole($role_id, 17);
+}
+/**
+ * Upgrades a Version 32 version of the Yioop! database to a Version 33 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion33(&$db)
+{
+    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
+    $auto_increment = $db->autoIncrement($dbinfo);
+    $db->execute("DROP TABLE ADVERTISEMENTS");
+    $db->execute("DROP TABLE ADVERTISEMENT_KEYWORD");
+    $db->execute("DROP TABLE ADVERTISEMENT_METADATA");
+    $db->execute("CREATE TABLE ADVERTISEMENT(AD_ID INTEGER
+        PRIMARY KEY $auto_increment, USER_ID INTEGER,
+        AD_NAME VARCHAR(". C\ADVERTISEMENT_NAME_LEN ."),
+        AD_DESCRIPTION VARCHAR(". C\ADVERTISEMENT_TEXT_LEN ."),
+        AD_DESTINATION VARCHAR(". C\ADVERTISEMENT_DESTINATION_LEN ."),
+        AD_KEYWORDS VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN ."),
+        STATUS INTEGER, AD_BUDGET INTEGER,
+        AD_DATE VARCHAR(". C\ADVERTISEMENT_DATE_LEN ."))");
+    $db->execute("CREATE TABLE ADVERTISEMENT_KEYWORD
+        (ID INTEGER PRIMARY KEY $auto_increment,
+        KEYWORD VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN ."),
+        BID_AMOUNT INTEGER,
+        BID_DATE VARCHAR(". C\ADVERTISEMENT_DATE_LEN ."))");
+    $db->execute("CREATE TABLE ADVERTISEMENT_METADATA
+        (AD_ID INTEGER, CLICKS INTEGER, IMPRESSIONS INTEGER)");
+}
+/**
+ * Upgrades a Version 33 version of the Yioop! database to a Version 34 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion34(&$db)
+{
+    addActivityAtId($db, 'db_activity_appearance',
+        "appearance", 16);
+    updateTranslationForStringId($db, 'db_activity_appearance',
+        'en-US', 'Appearance');
+    updateTranslationForStringId($db, 'db_activity_appearance',
+        'fr-FR', 'Aspect');
+    updateTranslationForStringId($db, 'db_activity_appearance',
+        'nl', 'Verschijning');
+}
+/**
+ * Upgrades a Version 34 version of the Yioop! database to a Version 35 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion35(&$db)
+{
+    $db->execute("CREATE TABLE CREDIT_LEDGER
+        (USER_ID INTEGER, AMOUNT INTEGER, TYPE VARCHAR(" .
+        C\NAME_LEN . "), BALANCE INTEGER, TIMESTAMP NUMERIC(" .
+        C\TIMESTAMP_LEN . "))");
+    addActivityAtId($db, 'db_activity_manage_credits',
+        "manageCredits", 18);
+    updateTranslationForStringId($db, 'db_activity_manage_credits',
+        'en-US', 'Manage Credits');
+    $role_model = new M\RoleModel(C\DB_NAME, false);
+    $role_model->db = $db;
+    $activity_model = new M\ActivityModel(C\DB_NAME, false);
+    $activity_model->db = $db;
+    $role_id = $role_model->getRoleId('Business User');
+    $activity_id = $activity_model->getActivityIdFromMethodName(
+        "manageCredits");
+    $role_model->addActivityRole($role_id, $activity_id);
+    $activity_id = $activity_model->getActivityIdFromMethodName(
+        "manageAdvertisements");
+    $role_model->addActivityRole($role_id, $activity_id);
+}
+/**
+ * Upgrades a Version 35 version of the Yioop! database to a Version 36 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion36(&$db)
+{
+    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
+    $auto_increment = $db->autoIncrement($dbinfo);
+    $db->execute("DROP TABLE ADVERTISEMENT");
+    $db->execute("DROP TABLE ADVERTISEMENT_KEYWORD");
+    $db->execute("DROP TABLE ADVERTISEMENT_METADATA");
+    $db->execute("DELETE FROM CREDIT_LEDGER");
+    $db->execute("CREATE TABLE ADVERTISEMENT (ID INTEGER
+        PRIMARY KEY $auto_increment, USER_ID INTEGER,
+        NAME VARCHAR(". C\ADVERTISEMENT_NAME_LEN ."),
+        DESCRIPTION VARCHAR(". C\ADVERTISEMENT_TEXT_LEN ."),
+        DESTINATION VARCHAR(". C\ADVERTISEMENT_DESTINATION_LEN ."),
+        KEYWORDS VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN ."),
+        STATUS INTEGER, BUDGET INTEGER, CLICKS INTEGER,
+        IMPRESSIONS INTEGER, START_DATE VARCHAR(".
+        C\ADVERTISEMENT_DATE_LEN ."), END_DATE VARCHAR(".
+        C\ADVERTISEMENT_DATE_LEN ."))");
+    $db->execute("CREATE TABLE ACCEPTED_AD_BIDS
+        (AD_ID INTEGER, KEYWORD VARCHAR(". C\ADVERTISEMENT_KEYWORD_LEN
+        ."), BID_AMOUNT INTEGER, BID_DATE VARCHAR(".
+        C\ADVERTISEMENT_DATE_LEN ."))");
+}
+/**
+ * Upgrades a Version 36 version of the Yioop! database to a Version 37 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion37(&$db)
+{
+    $db->execute("CREATE TABLE ITEM_IMPRESSION(
+        USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
+        VIEW_DATE NUMERIC(" . C\TIMESTAMP_LEN . "))");
+    $db->execute("CREATE TABLE ITEM_IMPRESSION_SUMMARY(
+        USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
+        NUM_ALL_TIME INTEGER, NUM_YEAR INTEGER, NUM_MONTH INTEGER,
+        NUM_DAY INTEGER, PRIMARY KEY(USER_ID, ITEM_ID, ITEM_TYPE))");
+    $db->execute("CREATE TABLE GROUP_PAGE_LINK(
+        LINK_TYPE_ID INTEGER, FROM_ID INTEGER,
+        TO_ID INTEGER)");
+    $db->execute("INSERT INTO ITEM_IMPRESSION_SUMMARY
+        SELECT ".C\PUBLIC_USER_ID.", THREAD_ID, ".C\THREAD_IMPRESSION.",
+        NUM_VIEWS, 0, 0, 0 FROM GROUP_THREAD_VIEWS");
+}
+
+/**
+ * Upgrades a Version 37 version of the Yioop! database to a Version 38 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion38(&$db)
+{
+    $db->execute("DROP TABLE GROUP_THREAD_VIEWS");
+    $db->execute("CREATE TABLE ITEM_IMPRESSION_SUMMARY_OLD(
+        USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
+        NUM_ALL_TIME INTEGER, NUM_YEAR INTEGER, NUM_MONTH INTEGER,
+        NUM_DAY INTEGER, PRIMARY KEY(USER_ID, ITEM_ID, ITEM_TYPE,
+        UPDATE_TIMESTAMP))");
+    D\DatasourceManager::copyTable("ITEM_IMPRESSION_SUMMARY", $db,
+        "ITEM_IMPRESSION_SUMMARY_OLD", $db);
+    $db->execute("DROP TABLE ITEM_IMPRESSION_SUMMARY");
+    $db->execute("CREATE TABLE ITEM_IMPRESSION_SUMMARY(
+        USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
+        UPDATE_PERIOD INTEGER,
+        UPDATE_TIMESTAMP  NUMERIC(" . C\TIMESTAMP_LEN . "),
+        NUM_VIEWS INTEGER, PRIMARY KEY(USER_ID, ITEM_ID, ITEM_TYPE,
+        UPDATE_PERIOD))");
+    $db->execute("INSERT INTO ITEM_IMPRESSION_SUMMARY
+        SELECT USER_ID, ITEM_ID, ITEM_TYPE, ".C\FOREVER.", 0, NUM_ALL_TIME AS
+        NUM_VIEWS FROM ITEM_IMPRESSION_SUMMARY_OLD");
+}
+/**
+ * Upgrades a Version 38 version of the Yioop! database to a Version 39 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion39(&$db)
+{
+    $role_model = new M\RoleModel(C\DB_NAME, false);
+    $role_model->db = $db;
+    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
+    $db->execute("CREATE TABLE CMS_DETECTORS (TIMESTAMP NUMERIC(" .
+        C\TIMESTAMP_LEN . ") PRIMARY KEY NOT NULL, NAME VARCHAR(" .
+        C\TITLE_LEN . "), HEADER VARCHAR(" . C\TITLE_LEN . ")," .
+        "IMPORTANT_CONTENT VARCHAR(" . C\TITLE_LEN . "))");
+    addActivityAtId($db, 'db_activity_cms_detectors',
+        "cmsDetectors", 20);
+    updateTranslationForStringId($db, 'db_activity_cms_detectors',
+        'en-US', 'CMS Detectors');
+    $role_id = $role_model->getRoleId('Admin');
+    $role_model->addActivityRole($role_id, 20);
+}
+/**
+ * Upgrades a Version 39 version of the Yioop! database to a Version 40 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion40(&$db)
+{
+    $db->execute("CREATE TABLE GROUP_PAGE_PRE_LINK(
+        LINK_TYPE_ID INTEGER, FROM_ID INTEGER,
+        TO_GROUP_ID INTEGER, TO_PAGE_NAME VARCHAR(" . C\TITLE_LEN .
+        "))");
+    $db->execute("CREATE INDEX GP_PRE_INDEX ON GROUP_PAGE_PRE_LINK
+        (TO_GROUP_ID, TO_PAGE_NAME)");
+}
+/**
+ * Upgrades a Version 40 version of the Yioop! database to a Version 41 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion41(&$db)
+{
+    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
+    $auto_increment = $db->autoIncrement($dbinfo);
+    $serial = $db->serialType($dbinfo);
+    $db->execute("CREATE TABLE QUERY_ITEM (ID $serial PRIMARY KEY
+        $auto_increment, QUERY_HASH CHAR(".
+        C\TIMESTAMP_LEN . ") UNIQUE, QUERY VARCHAR(" . C\MAX_QUERY_LEN
+        ."), CREATION NUMERIC(" . C\TIMESTAMP_LEN . "))");
+    $db->execute("CREATE INDEX QI_QUERY_HASH_INDEX ON
+        QUERY_ITEM (QUERY_HASH)");
+}
+/**
+ * Upgrades a Version 41 version of the Yioop! database to a Version 42 version
+ * @param object $db datasource to use to upgrade
+ */
+function upgradeDatabaseVersion42(&$db)
+{
+    $db->execute("DROP TABLE ITEM_IMPRESSION_SUMMARY");
+    $db->execute("CREATE TABLE ITEM_IMPRESSION_SUMMARY(
+        USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
+        UPDATE_PERIOD INTEGER,
+        UPDATE_TIMESTAMP NUMERIC(" . C\TIMESTAMP_LEN . "),
+        NUM_VIEWS INTEGER, PRIMARY KEY(USER_ID, ITEM_ID, ITEM_TYPE,
+        UPDATE_PERIOD, UPDATE_TIMESTAMP))");
+}
+/**
+ * Upgrades a Version 42 version of the Yioop! database to a Version 43 version
+ * @param object $db datasource to use to upgrade.
+ */
+function upgradeDatabaseVersion43(&$db)
+{
+    $db->execute("INSERT INTO ITEM_IMPRESSION_SUMMARY
+        SELECT DISTINCT I.USER_ID AS USER_ID,
+            I.ITEM_ID AS ITEM_ID, I.ITEM_TYPE AS ITEM_TYPE,
+            " . C\FOREVER . " AS UPDATE_PERIOD,
+            0 AS UPDATE_TIMESTAMP,
+            0 AS NUM_VIEWS
+        FROM ITEM_IMPRESSION I WHERE I.ITEM_ID > 0 AND NOT EXISTS
+           (SELECT * FROM ITEM_IMPRESSION_SUMMARY IIS
+            WHERE IIS.USER_ID = I.USER_ID AND
+            IIS.ITEM_TYPE= I.ITEM_TYPE AND IIS.ITEM_ID= I.ITEM_ID
+            AND IIS.UPDATE_PERIOD = ".C\FOREVER."
+        )");
+}
+/**
+ * Upgrades a Version 43 version of the Yioop! database to a Version 44 version
+ * @param object $db datasource to use to upgrade.
+ */
+function upgradeDatabaseVersion44(&$db)
+{
+    $role_model = new M\RoleModel(C\DB_NAME, false);
+    $role_model->db = $db;
+    $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
+        "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD];
+    $auto_increment = $db->autoIncrement($dbinfo);
+    $serial = $db->serialType($dbinfo);
+    $sql = "SELECT ACTIVITY_ID FROM ACTIVITY ".
+        "WHERE METHOD_NAME = 'cmsDetectors'";
+    $result = $db->execute($sql, []);
+    if ($result) {
+        $row = $db->fetchArray($result);
+        if (!empty($row['ACTIVITY_ID'])) {
+            $sql = "DELETE FROM ROLE_ACTIVITY WHERE ACTIVITY_ID=?";
+            $db->execute($sql, [$row['ACTIVITY_ID']]);
+            $sql = "DELETE FROM ACTIVITY WHERE ACTIVITY_ID=?";
+            $db->execute($sql, [$row['ACTIVITY_ID']]);
+        }
+    }
+    $sql = "SELECT TRANSLATION_ID FROM TRANSLATION ".
+        "WHERE IDENTIFIER_STRING = 'db_activity_cms_detectors' " .
+        $db->limitOffset(1);
+    $result = $db->execute($sql, []);
+    if ($result) {
+        $row = $db->fetchArray($result);
+        $translate_id = $row['TRANSLATION_ID'];
+        $sql = "DELETE FROM TRANSLATION WHERE TRANSLATION_ID=?";
+        $db->execute($sql, [$translate_id]);
+        $sql = "DELETE FROM TRANSLATION_LOCALE WHERE TRANSLATION_ID=?";
+        $db->execute($sql, [$translate_id]);
+    }
+    $sql = "SELECT ACTIVITY_ID FROM ACTIVITY ".
+        "WHERE METHOD_NAME = 'scrapers'";
+    $result = $db->execute($sql, []);
+    if ($result) {
+        $row = $db->fetchArray($result);
+        if  ($row) { //activity already exists
+            return;
+        }
+    }
+    $db->execute("CREATE TABLE SCRAPER (ID $serial PRIMARY KEY
+        $auto_increment, NAME VARCHAR(" .
+        C\TITLE_LEN . ") UNIQUE, SIGNATURE VARCHAR("
+        . C\TITLE_LEN . ")");
+    addActivityAtId($db, 'db_activity_scrapers',
+        "scrapers", 20);
+    updateTranslationForStringId($db, 'db_activity_scrapers',
+        'en-US', 'Web Scrapers');
+    $role_id = $role_model->getRoleId('Admin');
+    $role_model->addActivityRole($role_id, 20);
+    $sql = "INSERT INTO SCRAPER(NAME, SIGNATURE, SCRAPE_RULES) VALUES (?,?,?)";
+    $scrapers = [
+        ["YIOOP", "/html/head/*[contains(@href,".
+            "'c=resource&amp;a=get&amp;f=css&amp;n=auxiliary.css')]",
+            ""],
+        ["DRUPAL", "/html/head/*[contains(@href, '/sites/all/themes')" .
+            " or contains(@href, '/sites/default/files')]",
+            "//div[@id=\&quot;content\&quot;]" .
+            "###//div[@id=\&quot;comments\&quot;]" .
+            "###//div[@id=\&quot;respond\&quot;]" .
+            "###//div[@class=\&quot;bottomcontainerBox\&quot;]" .
+            "###//ul[@class=\&quot;post-by\&quot;]" .
+            "###//div[@class=\&quot;entry-meta clear\&quot;]"],
+        ["SITECORE", "/html/head/*[contains(@src,".
+            "'/system/VisitorIdentification.js')]",
+            "//div[@class=\&quot;container section\&quot;]"],
+        ["VBULLETIN", "/html/head/*[contains(@href,'vbulletin')]",
+            "//div[@td\s+id=\&quot;content\&quot;]"],
+        ["JOOMLA!", "/html/head/script[text()[contains(.,'Joomla')]]", ""],
+        ["WORDPRESS", "/html/head/*[contains(@href, 'wp-content')".
+            " or contains(@href, 'wp-includes')]",
+            "//div[@id=\&quot;content\&quot;]" .
+            "###//div[@id=\&quot;comments\&quot;]" .
+            "###//div[@id=\&quot;respond\&quot;]" .
+            "###//div[@class=\&quot;bottomcontainerBox\&quot;]" .
+            "###//ul[@class=\&quot;post-by\&quot;]" .
+            "###//div[@class=\&quot;entry-meta clear\&quot;]"]
+        ];
+    foreach ($scrapers as $scraper) {
+        $db->execute($sql, $scraper);
+    }
+}
diff --git a/src/library/cms_detectors/CmsDetector.php b/src/library/cms_detectors/CmsDetector.php
deleted file mode 100644
index 4c3d2d86f..000000000
--- a/src/library/cms_detectors/CmsDetector.php
+++ /dev/null
@@ -1,133 +0,0 @@
-<?php
-/**
- * SeekQuarry/Yioop --
- * Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- * Copyright (C) 2009 - 2016  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)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
- * @copyright 2009 - 2016
- * @filesource
- */
-namespace seekquarry\yioop\library\cms_detectors;
-
-/**
- * Class which is used to be the base for all framework detectors.  It holds
- * the required methods as well as some common methods.
- * @author Charles Bocage (charles.bocage@sjsu.edu)
- */
-abstract class CmsDetector
-{
-    /**
-     * Method used to check for a CMS match or not.
-     *
-     * @return string True if it finds a match, otherwise false.
-     */
-    public abstract function check($page);
-    /**
-     * Return the name of the CMS it is used to detect.
-     *
-     * @return string The name of the CMS it is used to detect.
-     */
-    public abstract function getName();
-    /**
-     * Return the important section of the document.  Say the content
-     * is stored in a div tag with id of content, it should return that
-     * content from this method.
-     *
-     * @return string The important section of the document.
-     */
-    public abstract function getImportantContent($page);
-    /**
-     * Return an array of tags found in the header of the document.
-     *
-     * @param string $Page
-     * @return array Array of tags found in the header of the document
-     */
-    public function getHeadTags($page)
-    {
-        $result = [];
-        $dom = new \DOMDocument();
-        //this hack modified from php.net
-        @$dom->loadHTML($page);
-        $xpath_doc = new \DOMXpath($dom);
-        $elements = $xpath_doc->query("/html/head/*");
-        if (!is_null($elements)) {
-            foreach ($elements as $head) {
-                $temp_result = [];
-                $temp_arr_result = [];
-                $temp_result["tag"] = $head->nodeName;
-                if($head->hasAttributes()) {
-                    $attributes = $head->attributes;
-                    if(!is_null($attributes)) {
-                        foreach ($attributes as $index => $attr) {
-                            $temp_arr_result[$attr->name] = $attr->value;
-                        }
-                    }
-                }
-                $temp_result["attr"] = $temp_arr_result;
-                $result[] = $temp_result;
-            }
-        }
-        return $result;
-    }
-    /**
-     * Check if a tag's name match and its value match the given regex.
-     * @param string $attribute_name the name of the attribute found
-     * @param string $attribute_name_to_match the name of the attribute to
-     *      match to
-     * @param string $attribute_value_regex the regex the value should match to
-     * @param string $attribute_value the attribute's actual value
-     *
-     * @return boolean true if a match, otherwise false
-     */
-    public function isTagMatch($attribute_name, $attribute_name_to_match,
-        $attribute_value_regex, $attribute_value)
-    {
-        $result = false;
-        if (strcasecmp($attribute_name, $attribute_name_to_match) == 0) {
-            preg_match_all($attribute_value_regex, $attribute_value, $matches);
-            $result = count($matches[0]) > 0 ? true : false;
-        }
-        return $result;
-    }
-    /**
-     * Get the contents of a document via an XPath
-     * @param string $page
-     * @param string $query the XPath query to run
-     *
-     * @return string the content found, otherwise an empty string
-     */
-    public function getContentByXquery($page, $query)
-    {
-        $result = "";
-        $dom = new \DOMDocument();
-        if (@$dom->loadHTML($page)) {
-            $xpath = new \DOMXPath($dom);
-            $tempResult = $xpath->query($query);
-            if ($tempResult->length > 0) {
-                $result = $dom->saveHTML($tempResult->item(0));
-            }
-        }
-        return $result;
-    }
-}
diff --git a/src/library/cms_detectors/DrupalDetector.php b/src/library/cms_detectors/DrupalDetector.php
deleted file mode 100644
index 12e6afbe9..000000000
--- a/src/library/cms_detectors/DrupalDetector.php
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-/**
- * SeekQuarry/Yioop --
- * Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- * Copyright (C) 2009 - 2016  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 Charles Bocage (charles.bocage@sjsu.edu)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
- * @copyright 2009 - 2016
- * @filesource
- */
-namespace seekquarry\yioop\library\cms_detectors;
-
-/**
- *
- */
-class DrupalDetector extends CmsDetector
-{
-    /**
-     * Method used to check for a CMS match or not.  It uses what is in the
-     * head tags to determine if there is a match or not.
-     *
-     * @return string True if it finds a match, otherwise false
-     */
-    public function check($page)
-    {
-        return $this->checkHeadTags($page);
-    }
-    /**
-     * Return the name of the CMS it is used to detect.
-     *
-     * @return string The name of the CMS it is used to detect.
-     */
-    public function getName()
-    {
-        return "DRUPAL";
-    }
-    /**
-     * Return the important section of the document.  Say the content
-     * is stored in a div tag with id of content, it should return that
-     * content from this method. It also strips out irrelavent tags that are
-     * sometimes contained in the subsection.
-     *
-     * @return string The important section of the document.
-     */
-    public function getImportantContent($page)
-    {
-        $temp_page = $this->
-            getContentByXquery($page, "//div[@class=\"entry-content\"]");
-        if (!empty($temp_page)) {
-            $tags_to_remove = [];
-            foreach ($tags_to_remove as $tag_to_remove) {
-                $temp_content_to_remove = $this->
-                    getContentByXquery($tag_to_remove);
-                $temp_page =
-                    str_replace($temp_content_to_remove, "", $temp_page);
-            }
-        }
-        return empty($temp_page) ? $page : $temp_page;
-    }
-    /**
-     * Check the header tags for Drupal information.
-     *
-     * @return boolean true if there is more than one stylesheet found,
-     *      otherwise false.
-     */
-    private function checkHeadTags($page)
-    {
-        $matches = 0;
-        $rel_tag_match = 0;
-        $rel_tag_match_minimum = 1;
-        $script_tag_match = 0;
-        $script_tag_match_minimum = 0;
-        $head_tags_regex =
-            "/sites\/(?:default|all)\/(?:themes|modules|files)\//iu";
-        $head_tags = $this->getHeadTags($page);
-        if ($head_tags) {
-            foreach ($head_tags as $head_tag) {
-                if (@$relType = $head_tag['attr']['rel']) {
-                    if (@$attributeSubValue = $head_tag['attr']['href']) {
-                        $tempResult = $this->isTagMatch($relType,
-                            "stylesheet", $head_tags_regex,
-                            $attributeSubValue) ? 1 : 0;
-                        $rel_tag_match = $rel_tag_match + $tempResult;
-                    }
-                } elseif (@$scriptType = $head_tag['attr']['type']) {
-                    if (@$attributeSubValue = $head_tag['attr']['src']) {
-                        $tempResult = $this->isTagMatch($scriptType,
-                            "text/javascript", $head_tags_regex,
-                            $attributeSubValue) ? 1 : 0;
-                        $script_tag_match = $script_tag_match + $tempResult;
-                    }
-                }
-            }
-        }
-        return $rel_tag_match >= $rel_tag_match_minimum &&
-            $script_tag_match >= $script_tag_match_minimum;
-    }
-}
diff --git a/src/library/cms_detectors/UniversalDetector.php b/src/library/cms_detectors/UniversalDetector.php
deleted file mode 100644
index b9b6045c4..000000000
--- a/src/library/cms_detectors/UniversalDetector.php
+++ /dev/null
@@ -1,191 +0,0 @@
-<?php
-/**
- * SeekQuarry/Yioop --
- * Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- * Copyright (C) 2009 - 2016  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 Charles Bocage (charles.bocage@sjsu.edu)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
- * @copyright 2009 - 2016
- * @filesource
- */
-namespace seekquarry\yioop\library\cms_detectors;
-
-use seekquarry\yioop\models as M;
-/**
- *
- */
-class UniversalDetector extends CmsDetector
-{
-    /**
-     * The important content XPath to use for finding the important content
-     */
-    public $important_content_xpath = "";
-    /**
-     * The header regex to use for searching the page's header
-     */
-    public $header_Regex = "";
-    /**
-     * The name of the CMS found is one is found
-     */
-    public $cms_name = "";
-    /**
-     * The head tags found in the page
-     */
-    public $head_tags = "";
-    /**
-     * The constructor for the class
-     *
-     * @param string $page the html page to check
-     * @return string True if it finds a match, otherwise false
-     */
-    public function __construct($page)
-    {
-        $this->head_tags = $this->getHeadTags($page);
-    }
-    /**
-     * Method used to check for a CMS match or not.  It uses what is in the
-     * head tags to determine if there is a match or not.
-     *
-     * @param string $page the html page to check
-     * @return string True if it finds a match, otherwise false
-     */
-    public function check($page)
-    {
-        $result = false;
-        $detectorSettings = $this->getSystems();
-        foreach ($detectorSettings as $detectorSetting) {
-            $this->header_Regex =
-                html_entity_decode($detectorSetting['HEADER'],
-                ENT_QUOTES, 'UTF-8');
-            if ($this->checkHeadTags()) {
-                $this->timestamp =
-                    html_entity_decode($detectorSetting['TIMESTAMP'],
-                    ENT_QUOTES, 'UTF-8');
-                $this->important_content_xpath =
-                    html_entity_decode($detectorSetting['IMPORTANT_CONTENT'],
-                    ENT_QUOTES, 'UTF-8');
-                $this->cms_name = $detectorSetting['NAME'];
-                $result = true;
-                break;
-            }
-        }
-        return $result;
-    }
-    /**
-     * Return the name of the CMS it is used to detect.
-     *
-     * @return string The name of the CMS it is used to detect.
-     */
-    public function getName()
-    {
-        return $this->cms_name;
-    }
-    /**
-     * Return the name of the CMS it is used to detect.
-     *
-     * @return string The name of the CMS it is used to detect.
-     */
-    public function frameworkName()
-    {
-        return "UNIVERSAL";
-    }
-    /**
-     * Return the important section of the document.  Say the content
-     * is stored in a div tag with id of content, it should return that
-     * content from this method. It also strips out irrelavent tags that are
-     * sometimes contained in the subsection.
-     *
-     * @param string $page the html page to check
-     * @return string The important section of the document.
-     */
-    public function getImportantContent($page)
-    {
-        $important_content_xpaths = preg_split('/###/u',
-            $this->important_content_xpath, 0, PREG_SPLIT_NO_EMPTY);
-        if (count($important_content_xpaths) > 0) {
-            $important_content_xpath = $important_content_xpaths[0];
-            unset($important_content_xpaths[0]);
-            $temp_page = $this->getContentByXquery($page,
-                $important_content_xpath);
-            if (!empty($temp_page)) {
-                foreach ($important_content_xpaths as $tag_to_remove) {
-                    $temp_content_to_remove =
-                        $this->getContentByXquery($page, $tag_to_remove);
-                    $temp_page =
-                        str_replace($temp_content_to_remove, "", $temp_page);
-                }
-            }
-        }
-        return empty($temp_page) ? $page : $temp_page;
-    }
-    /**
-     * Get the framework detectors from the database.
-     *
-     * @return array The array of detectors found in the database.
-     */
-    public function getSystems()
-    {
-        $result = [];
-        $cmsModel = new M\CmsModel();
-        $result = $cmsModel->getsCmsDetectorsSettings();
-        return $result;
-    }
-    /**
-     * Check the header tags to see if we find a rel tag that is a stylesheet
-     * and has the CMS content in its value.  There is code to check
-     * that it has scripts in there too but not all Wordpress sites have them.
-     *
-     * @return boolean True if there is more than one stylesheet found,
-     *      otherwise false.
-     */
-    private function checkHeadTags()
-    {
-        $matches = 0;
-        $rel_tag_match = 0;
-        $rel_tag_match_minimum = 0;
-        $script_tag_match = 0;
-        $script_tag_match_minimum = 0;
-        $head_tags_regex = "/" . $this->header_Regex . "/iu";
-        if ($this->head_tags) {
-            foreach ($this->head_tags as $head_tag) {
-                if (@$relType = $head_tag['attr']['rel']) {
-                    if (@$attributeSubValue = $head_tag['attr']['href']) {
-                        $tempResult = $this->isTagMatch($relType,
-                            "stylesheet", $head_tags_regex,
-                            $attributeSubValue) ? 1 : 0;
-                        $rel_tag_match = $rel_tag_match + $tempResult;
-                    }
-                } elseif (@$scriptType = $head_tag['attr']['type']) {
-                    if (@$attributeSubValue = $head_tag['attr']['src']) {
-                        $tempResult = $this->isTagMatch($scriptType,
-                            "text/javascript", $head_tags_regex,
-                            $attributeSubValue) ? 1 : 0;
-                        $script_tag_match = $script_tag_match + $tempResult;
-                    }
-                }
-            }
-        }
-        return $rel_tag_match > $rel_tag_match_minimum ||
-            $script_tag_match > $script_tag_match_minimum;
-    }
-}
\ No newline at end of file
diff --git a/src/library/cms_detectors/WordpressDetector.php b/src/library/cms_detectors/WordpressDetector.php
deleted file mode 100644
index 6d5e6cc9c..000000000
--- a/src/library/cms_detectors/WordpressDetector.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-/**
- * SeekQuarry/Yioop --
- * Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- * Copyright (C) 2009 - 2016  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 Charles Bocage (charles.bocage@sjsu.edu)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
- * @copyright 2009 - 2016
- * @filesource
- */
-namespace seekquarry\yioop\library\cms_detectors;
-
-/**
- *
- */
-class WordpressDetector extends CmsDetector
-{
-    /**
-     * Method used to check for a CMS match or not.  It uses what is in the
-     * head tags to determine if there is a match or not.
-     *
-     * @return string True if it finds a match, otherwise false
-     */
-    public function check($page)
-    {
-        return $this->checkHeadTags($page);
-    }
-    /**
-     * Return the name of the CMS it is used to detect.
-     *
-     * @return string The name of the CMS it is used to detect.
-     */
-    public function getName()
-    {
-        return "WORDPRESS";
-    }
-    /**
-     * Return the important section of the document.  Say the content
-     * is stored in a div tag with id of content, it should return that
-     * content from this method. It also strips out irrelavent tags that are
-     * sometimes contained in the subsection.
-     *
-     * @return string The important section of the document.
-     */
-    public function getImportantContent($page)
-    {
-        $temp_page = $this->getContentByXquery($page,
-            "//div[@id=\"content\"]");
-        if (!empty($temp_page)) {
-            $tags_to_remove = ["//div[@id=\"comments\"]",
-                "//div[@id=\"respond\"]",
-                "//div[@class=\"bottomcontainerBox\"]",
-                "//ul[@class=\"post-by\"]",
-                "//div[@class=\"entry-meta clear\"]"];
-            foreach ($tags_to_remove as $tag_to_remove) {
-                $temp_content_to_remove =
-                    $this->getContentByXquery($page, $tag_to_remove);
-                $temp_page =
-                    str_replace($temp_content_to_remove, "", $temp_page);
-            }
-        }
-        return empty($temp_page) ? $page : $temp_page;
-    }
-    /**
-     * Check the header tags to see if we find a rel tag that is a stylesheet
-     * and has wp-content or wp-includes in its value.  There is code to check
-     * that it has scripts in there too but not all Wordpress sites have them.
-     *
-     * @return boolean True if there is more than one stylesheet found,
-     *      otherwise false.
-     */
-    private function checkHeadTags($page)
-    {
-        $matches = 0;
-        $rel_tag_match = 0;
-        $rel_tag_match_minimum = 1;
-        $script_tag_match = 0;
-        $script_tag_match_minimum = 0;
-        $head_tags_regex = "/wp-(?:content|includes)/iu";
-        $head_tags = $this->getHeadTags($page);
-        if ($head_tags) {
-            foreach ($head_tags as $head_tag) {
-                if (@$relType = $head_tag['attr']['rel']) {
-                    if (@$attributeSubValue = $head_tag['attr']['href']) {
-                        $tempResult = $this->isTagMatch($relType,
-                            "stylesheet", $head_tags_regex,
-                            $attributeSubValue) ? 1 : 0;
-                        $rel_tag_match = $rel_tag_match + $tempResult;
-                    }
-                } elseif (@$scriptType = $head_tag['attr']['type']) {
-                    if (@$attributeSubValue = $head_tag['attr']['src']) {
-                        $tempResult = $this->isTagMatch($scriptType,
-                            "text/javascript", $head_tags_regex,
-                            $attributeSubValue) ? 1 : 0;
-                        $script_tag_match = $script_tag_match + $tempResult;
-                    }
-                }
-            }
-        }
-        return $rel_tag_match >= $rel_tag_match_minimum &&
-            $script_tag_match >= $script_tag_match_minimum;
-    }
-}
diff --git a/src/library/processors/HtmlProcessor.php b/src/library/processors/HtmlProcessor.php
index 520abddbc..1b4ea6866 100755
--- a/src/library/processors/HtmlProcessor.php
+++ b/src/library/processors/HtmlProcessor.php
@@ -33,7 +33,7 @@ namespace seekquarry\yioop\library\processors;
 use seekquarry\yioop\configs as C;
 use seekquarry\yioop\library as L;
 use seekquarry\yioop\library\UrlParser;
-use seekquarry\yioop\library\cms_detectors\UniversalDetector;
+use seekquarry\yioop\library\ScraperManager;
 /**
  * Used to create crawl summary information
  * for HTML files
@@ -43,9 +43,10 @@ use seekquarry\yioop\library\cms_detectors\UniversalDetector;
 class HtmlProcessor extends TextProcessor
 {
     /**
+     * An array of scrapers to be used by this HtmlProcessor
      * @var array
      */
-    public $cms_detector_list;
+    public $scrapers;
     /**
      * Maximum number of characters in a title
      */
@@ -68,7 +69,7 @@ class HtmlProcessor extends TextProcessor
     {
         parent::__construct($plugins, $max_description_len,
             $summarizer_option);
-        /** Register File Types We Handle*/
+        /** Register file types we handle */
         $add_extensions = ["asp", "aspx", "cgi", "cfm", "cfml", "do", "htm",
             "html", "jsp", "php", "pl", "py", "shtml"];
         self::$indexed_file_types = array_merge(self::$indexed_file_types,
@@ -77,20 +78,6 @@ class HtmlProcessor extends TextProcessor
         self::$mime_processor["text/asp"] = "HtmlProcessor";
         self::$mime_processor["application/xhtml+xml"] = "HtmlProcessor";
     }
-    /**
-     * @param string $page the html page to check
-     *
-     * @return object a cms detector suitable for handling the page content;
-     *      null if can't find one
-     */
-    public function checkForCMSContent($page)
-    {
-        $cms_detector = new UniversalDetector($page);
-            if ($cms_detector->check($page)) {
-                return $cms_detector;
-            }
-        return null;
-    }
     /**
      * Used to extract the title, description and links from
      * a string consisting of webpage data.
@@ -108,9 +95,11 @@ class HtmlProcessor extends TextProcessor
             /*check to see if we have a page from a CMS we recognize
               if so we will extract the important content and only
                summarize the important content */
-            if ($detector = $this->checkForCMSContent($page)) {
-                $summary[self::CMS_SYSTEM] = $detector->getName();
-                $page = $detector->getImportantContent($page);
+            if ($scraper =
+                ScrapeManager::getScraper($page, $this->scrapers)) {
+                $summary[self::SCRAPER_LABEL] = $scraper->getName();
+                $page = ScrapeManager::applyScraperRules($page,
+                    $scraper['SCRAPE_RULES']);
             }
             $page = preg_replace('/\&nbsp\;|\&rdquo\;|\&ldquo\;|\&mdash\;/si',
                 ' ',$page);
@@ -597,4 +586,4 @@ class HtmlProcessor extends TextProcessor
         $text = preg_replace('/\</', ' <', $text);
         return strip_tags($text);
     }
-}
\ No newline at end of file
+}
diff --git a/src/locale/ar/configure.ini b/src/locale/ar/configure.ini
index c588eb11a..6005a6c77 100755
--- a/src/locale/ar/configure.ini
+++ b/src/locale/ar/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "تسجيل الدخول الناجحة!!"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "اسم المستخدم أو كلمة المرور غير صحيحة!"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "Login to continue configuration (default: u=root, p=)"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = "توقفت عن تحديثات الحالة."
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = "خيارات الصفحة تحديث!"
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = "تصفية تحديث الصفحات!"
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = "حدد عنوان URL تم تحريرها مسبقاً"
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = "نتيجة تحديث الصفحة يحتاج إلى تحديد عنوان URL!"
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = "تحديث الصفحة النتيجة!"
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = "تحميل الصفحة!"
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = "نوع الوسائط"
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = "فيديو"
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = "RSS"
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = "مؤشر/ميكس للاستخدام"
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = "مصدر الوسائط المضافة!"
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = "وأضاف سوبسيرتش!"
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = "مصدر الوسائط المحذوفة!"
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = "حذف سوبسيرتش!"
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = "دليل عمل محرك البحث"
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = "مواقع لعامل التصفية"
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = "حفظ عامل التصفية"
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/bn/configure.ini b/src/locale/bn/configure.ini
index 24d9d2611..e3db19ab5 100755
--- a/src/locale/bn/configure.ini
+++ b/src/locale/bn/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = ""
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = ""
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = ""
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/de/configure.ini b/src/locale/de/configure.ini
index 526b9b06f..3a2eb879d 100755
--- a/src/locale/de/configure.ini
+++ b/src/locale/de/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = ""
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = ""
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = ""
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/en_US/configure.ini b/src/locale/en_US/configure.ini
index c053b3c83..2f374bc47 100644
--- a/src/locale/en_US/configure.ini
+++ b/src/locale/en_US/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = "Cookies needed to login!!"
 ; AdminController.php line: 164
 admin_controller_account_not_active = "Account not active. Maybe request password reset?"
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "Login Successful!!"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = "No Back Button During Login!"
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "Username or Password Incorrect!"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "Login to continue configuration (default: u=root, p=)"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = "Status updates have stopped."
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = "Account Access"
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = "Social"
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = "Crawls"
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = "System Settings"
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = "Advertisements"
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = "Equals"
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = "Not equals"
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = "Contains"
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = "Begins with"
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = "Ends with"
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = "Equals"
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = "Not equals"
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = "No sort"
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = "Ascending"
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = "Descending"
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = "Page Options Updated!"
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = "Running Tests!"
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = "Name Not Set!"
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = "Missing Scraper Fields!"
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = "CMS Detector Added!"
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = "Scraper added!"
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = "CMS Detector Was Not Deleted!"
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = "Scraper not deleted!"
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = "CMS Detector Deleted!"
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = "Scraper deleted!"
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = "CMS Detector Updated!"
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = "Scraper Updated!"
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = "Filter Pages Updated!"
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = "Select a Previously Edited URL"
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = "Result Page Update needs to Specify the URL!"
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = "Result Page Updated!"
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = "Page Loaded!"
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = "Media Kind"
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = "Video"
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = "RSS"
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = "JSON Feed"
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = "Html Feed"
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = "Index/Mix to Use"
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = "Type of Source Not Set!"
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = "Must set media type!"
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = "Invalid URL!"
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = "All Fields Need to be Filled!"
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = "Media Source Added!"
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = "All Fields Need to be Filled!"
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = "Subsearch Added!"
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = "Source Was Not Deleted!"
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = "Media Source Deleted!"
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = "Source Was Not Deleted!"
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = "Subsearch Deleted!"
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = "Subsearch Updated!"
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = "Media Source Updated!"
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = "Reset Customizations"
 ; AppearanceElement.php line: 199
 appearance_element_save = "Save"
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = "Add CMS Detector Form"
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = "Edit CMS Detector"
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = "Add CMS Detector"
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = "Name:"
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = "Header Regex:"
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = "Important Content XPath:"
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = "Submit"
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = "CMS Detectors"
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = "Name"
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = "Header Regex"
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = "Important Content XPath"
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = "Actions"
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = "Edit"
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = "Are you sure you want to delete?"
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = "Delete"
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = "Search Engine Work Directory"
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = "You belong to %s groups."
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = "You belong to 1 group."
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = "Manage"
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = "Statistics"
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = "Wiki"
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = "%s posts, %s threads"
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = "Last Post:"
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = "Join/Manage All Groups"
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = "See Combined Group Feeds"
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = "Crawl Mixes"
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = "Present search results from multiple indexes in the order you prefer. Share your search creations with groups of friends."
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = "You have %s crawl mixes."
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = "You have %s crawl mix."
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = "Create/Manage Crawl Mixes"
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -2753,7 +2708,7 @@ manageclassifiers_finalize = "Finalize"
 manageclassifiers_finalizing = "Finalizing"
 ;
 ; ManageclassifiersElement.php line: 120
-confirm_delete_operation = "Are you sure you want to Delete?"
+confirm_delete_operation = "Are you sure you want to delete?"
 ;
 ; ManageclassifiersElement.php line: 123
 manageclassifiers_delete = "Delete"
@@ -2903,7 +2858,7 @@ managegroups_element_decline = "Decline"
 managegroups_element_unsubscribe = "Unsubscribe"
 ;
 ; ManagegroupsElement.php line: 295
-confirm_delete_operation = "Are you sure you want to Delete?"
+confirm_delete_operation = "Are you sure you want to delete?"
 ;
 ; ManagegroupsElement.php line: 298
 managegroups_element_delete = "Delete"
@@ -3104,7 +3059,7 @@ managelocales_element_false = "false"
 managelocales_element_edit = "Edit"
 ;
 ; ManagelocalesElement.php line: 115
-confirm_delete_operation = "Are you sure you want to Delete?"
+confirm_delete_operation = "Are you sure you want to delete?"
 ;
 ; ManagelocalesElement.php line: 116
 managelocales_element_delete = "Delete"
@@ -3206,7 +3161,7 @@ manageroles_element_edit = "Edit"
 manageroles_element_delete = "Delete"
 ;
 ; ManagerolesElement.php line: 103
-confirm_delete_operation = "Are you sure you want to Delete?"
+confirm_delete_operation = "Are you sure you want to delete?"
 ;
 ; ManagerolesElement.php line: 106
 manageroles_element_delete = "Delete"
@@ -3278,7 +3233,7 @@ manageusers_element_edit = "Edit"
 manageusers_element_delete = "Delete"
 ;
 ; ManageusersElement.php line: 155
-confirm_delete_operation = "Are you sure you want to Delete?"
+confirm_delete_operation = "Are you sure you want to delete?"
 ;
 ; ManageusersElement.php line: 158
 manageusers_element_delete = "Delete"
@@ -3398,7 +3353,7 @@ mixcrawls_set_index = "Set as Index"
 mixcrawl_search_index = "Search Index"
 ;
 ; MixcrawlsElement.php line: 134
-confirm_delete_operation = "Are you sure you want to Delete?"
+confirm_delete_operation = "Are you sure you want to delete?"
 ;
 ; MixcrawlsElement.php line: 136
 mixcrawls_view_delete = "Delete"
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = "Sites to Filter"
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = "Save Filter"
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = "Add Scraper Form"
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = "Edit"
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = "Add Scraper"
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = "Name:"
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = "Signature:"
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = "Scrape Rules:"
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = "Save"
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = "Web Scrapers"
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = "Name"
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = "Signature"
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = "Scrape Rules"
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = "Actions"
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = "Edit"
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = "Are you sure you want to delete?"
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = "Delete"
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = "Add Source Form"
 ;
@@ -3719,7 +3719,7 @@ searchsources_element_action = "Action"
 searchsources_element_editmedia = "Edit"
 ;
 ; SearchsourcesElement.php line: 230
-confirm_delete_operation = "Are you sure you want to Delete?"
+confirm_delete_operation = "Are you sure you want to delete?"
 ;
 ; SearchsourcesElement.php line: 233
 searchsources_element_deletemedia = "Delete"
@@ -4079,7 +4079,7 @@ wiki_element_resources_info = "Resources are images, videos, or files associated
 wiki_element_rename_failed = "Rename Failed!"
 ;
 ; WikiElement.php line: 714
-confirm_delete_operation = "Are you sure you want to Delete?"
+confirm_delete_operation = "Are you sure you want to delete?"
 ;
 ; WikiElement.php line: 766
 wiki_element_places = "Places:"
@@ -4464,7 +4464,7 @@ machinestatus_view_media_updater = "Media Updater"
 machinestatus_view_log = "Log"
 ;
 ; MachinestatusView.php line: 125
-confirm_delete_operation = "Are you sure you want to Delete?"
+confirm_delete_operation = "Are you sure you want to delete?"
 ;
 ; MachinestatusView.php line: 126
 machinestatus_view_delete = "Delete"
diff --git a/src/locale/es/configure.ini b/src/locale/es/configure.ini
index 801c15731..303cd382f 100755
--- a/src/locale/es/configure.ini
+++ b/src/locale/es/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "Inicio de sesi&oacute;n con &eacute;xito."
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "El nombre de usuario o la contrase&ntilde;a introducidos no son correctos."
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "Inicia sesi&oacute;n para continuar con la configuraci&oacute;n (default: u=root, p=)"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = "Las actualizaciones se han detenido."
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = "Filtrar P&aacute;ginas Actualizadas!"
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = "Seleccionar una URL previamente editada"
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = "Resultados de la actualizaci&oacute;n de la p&aacute;gina debe especificar la URL!"
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = "P&aacute;gina Actualizada!"
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = "P&aacute;gina Cargada!"
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = "Motor de b&uacute;squeda de directorio de trabajo"
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/fa/configure.ini b/src/locale/fa/configure.ini
index 726c2e75a..92c90116b 100755
--- a/src/locale/fa/configure.ini
+++ b/src/locale/fa/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "با موفقیت وارد شدید!!"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "نام کاربری یا رمز عبور اشتباه است!"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "برای ادامهٔ تنظیمات وارد شوید (پیش&zwnj;فرض: نام کاربری=root و رمز عبور=)"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = "به روز رسانی وضعیت متوقف شده است."
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = "تنظیمات صفحه به روز شد
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = "پالایه صفحات به روز شد!"
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = "یک URL که قبلن ویرایش شده انتخاب کنید"
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = "به روز رسانی صفحهٔ نتایج احتیاج به تعیین URL دارد! "
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = "صفحهٔ نتایج به روز آوری شد!"
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = "صفحه بارگذاری شد!"
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = "نوع رسانه"
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = "ویدیو"
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = "RSS"
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = "نمایه/ترکیب مورد استفاده"
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = "منبع رسانه&zwnj;ها اضافه شد!"
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = "زیرجستجو اضافه شد!"
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = "منبع رسانه&zwnj;ها حذف شد!"
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = "زیر جستجو حذف شد!"
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = "پوشهٔ کار موتور جستجو"
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = "سایت&zwnj;هایی که فیلتر
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = "فیلتر را ذخیره کن"
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/fr_FR/configure.ini b/src/locale/fr_FR/configure.ini
index 549414d1f..a882ad296 100755
--- a/src/locale/fr_FR/configure.ini
+++ b/src/locale/fr_FR/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "D&eacute;connexion r&eacute;ussie!"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = ""
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = ""
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/he/configure.ini b/src/locale/he/configure.ini
index cd102100d..1c611e462 100755
--- a/src/locale/he/configure.ini
+++ b/src/locale/he/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = ""
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "סיסמא / שם משתמש אינו נכון"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "התחבר על מנת להמשך בתהליך"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/hi/configure.ini b/src/locale/hi/configure.ini
index 8df4213e5..5cd2f354d 100755
--- a/src/locale/hi/configure.ini
+++ b/src/locale/hi/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "लॉग इन सफल"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "लॉग इन असफल"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "कॉन्फ़िगर करने के लिए लॉगिन करें"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/in_ID/configure.ini b/src/locale/in_ID/configure.ini
index ecf585555..cce8fbf27 100755
--- a/src/locale/in_ID/configure.ini
+++ b/src/locale/in_ID/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "Login berhasil"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "Login tidak berhasil"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = ""
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/it/configure.ini b/src/locale/it/configure.ini
index dfa703b59..51e8584c3 100755
--- a/src/locale/it/configure.ini
+++ b/src/locale/it/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "Accesso effettuato!!"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "Utente o Password non corretto!"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "Accedi per continuare la configurazione (utente=root; nessuna password)"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = "Aggiornamenti stato interrotti."
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = "Opzioni Pagina aggiornate!"
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = "Filtro Pagina aggiornato!"
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = "Seleziona un URL precedentemente modificato"
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = "Aggiornamento pagina dei risultati necessita specificare URL!"
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = "Pagina dei risultatai aggiornata!"
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = "Pagina caricata!"
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = "Cartella di Lavoro del Motore di Ricerca"
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = "Siti da filtrare"
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = "Salva Filtro"
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/ja/configure.ini b/src/locale/ja/configure.ini
index e892f9604..9d862e9b2 100755
--- a/src/locale/ja/configure.ini
+++ b/src/locale/ja/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "ログイン成功"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "無効なユーザー名またはパスワード"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = ""
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = "作業ディレクトリ"
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/kn/configure.ini b/src/locale/kn/configure.ini
index b783f669d..011ee8e1a 100755
--- a/src/locale/kn/configure.ini
+++ b/src/locale/kn/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "ಒಳಪ್ರವೇಶಣೆ ಸಫಲ"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "ಒಳಪ್ರವೇಶಣೆ ವಿಫಲ, ಬಳಕೆದಾರನ ಹೆಸರು ಅಥವಾ ಪ್ರವೇಶ ಪದ ತಪ್ಪಾಗಿದೆ "
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "ಸಂರಚನೆ ಮುಂದುವರೆಸಲು ಒಳಪ್ರವೇಶಿಸಿ"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/ko/configure.ini b/src/locale/ko/configure.ini
index 8f734444e..f98059f12 100755
--- a/src/locale/ko/configure.ini
+++ b/src/locale/ko/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "로그인 성공!!!"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "로그인 실패!!!"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "관리 (default: u=root, p=)"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = "검색 엔진 작업 디렉토리"
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/nl/configure.ini b/src/locale/nl/configure.ini
index 816d88572..2a994d1b5 100644
--- a/src/locale/nl/configure.ini
+++ b/src/locale/nl/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = "Cookies die nodig zijn om in te loggen!!"
 ; AdminController.php line: 164
 admin_controller_account_not_active = "Account niet actief. Misschien vraag wachtwoord opnieuw in te stellen?"
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "Login Succesvolle!!"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = "Geen Back Button Tijdens Inloggen!"
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "Gebruikersnaam of wachtwoord onjuist!"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "Login om te gaan met de configuratie (standaard: u=wortel, p=)"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = "Status updates zijn gestopt."
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = "Toegang tot account"
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = "sociaal"
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = "crawls"
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = "Systeeminstellingen"
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = "is gelijk aan"
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = "niet gelijken"
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = "bevat"
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = "begint met"
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = "eindigt met"
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = "is gelijk aan"
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = "niet gelijken"
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = "niet sorteren"
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = "oplopend"
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = "aflopend"
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = "Opties voor de pagina Bijgewerkt!"
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = "Uitvoeren van tests!"
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = "Filter Paginas Bijgewerkt!"
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = "Selecteer een Eerder Bewerkt URL"
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = "Resultaat Pagina update nodig heeft om de URL opgeven!"
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = "Resultaat Pagina bijgewerkt!"
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = "Page Loaded!"
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = "media Kind"
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = "video"
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = "RSS"
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = "Html Feed"
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = "Index / Mix te gebruiken"
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = "Type Bron onbekend!"
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = "Moet mediatype ingesteld!"
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = "Ongeldige URL!"
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = "Alle velden moeten worden ingevuld!"
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = "Media Source toegevoegd!"
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = "Alle velden moeten worden ingevuld!"
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = "Subsearch toegevoegd!"
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = "Bron niet is verdwenen!"
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = "Media Source Deleted!"
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = "Bron niet is verdwenen!"
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = "Subsearch Deleted!"
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = "Subsearch Bijgewerkt!"
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = "Media Source Bijgewerkt!"
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = "Reset Aanpassingen"
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = "uitgeven"
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = "Zoekmachine Werk Directory"
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = "U behoort tot %s groepen."
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = "U behoort tot 1 groep."
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = "wiki"
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = " %s berichten, %s discussies"
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = "Laatste bericht:"
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = "Join / beheren Alle groepen"
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = "Zie Gecombineerde Groep Feeds"
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = "crawl Mixes"
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = "Aanwezig zoekresultaten van meerdere indexen in de volgorde van uw voorkeur. Deel uw zoekopdracht creaties met een groep vrienden."
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = "Je hebt %s kruipen mixen."
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = "Je hebt %s kruipen mix."
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = "Maak / beheren Crawl Mixes"
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = "Sites te filteren"
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = "opslaan Filter"
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = "Bron Vorm toevoegen"
 ;
diff --git a/src/locale/pl/configure.ini b/src/locale/pl/configure.ini
index e26783c95..9a266954b 100755
--- a/src/locale/pl/configure.ini
+++ b/src/locale/pl/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = ""
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = ""
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = ""
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/pt/configure.ini b/src/locale/pt/configure.ini
index 2be264f5d..11342ef49 100755
--- a/src/locale/pt/configure.ini
+++ b/src/locale/pt/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = ""
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = ""
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = ""
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/ru/configure.ini b/src/locale/ru/configure.ini
index ed2467c5b..e678f9cde 100755
--- a/src/locale/ru/configure.ini
+++ b/src/locale/ru/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = ""
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = ""
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = ""
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/te/configure.ini b/src/locale/te/configure.ini
index a553680e8..1dfd17528 100644
--- a/src/locale/te/configure.ini
+++ b/src/locale/te/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = "లాగిన్ అవడానికి క
 ; AdminController.php line: 164
 admin_controller_account_not_active = "ఖాతా ఆక్టివ్ గా లేదు. పాస్&zwnj;వర్డ్ రీసెట్ చెయ్యమని అడగవచ్చు "
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "లాగిన్ విజయవంతం"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = "లాగిన్ అయ్యేటప్పుడు బ్యాక్ బటన్ నోక్కకూడదు!"
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "యూజర్ పేరు లేదా పాస్&zwnj;వర్డ్ సరి లేదు!"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "కాన్ఫిగరేషన్ కొరకు లాగిన్ చేయండి"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = "స్టేటస్ అప్డేట్స్ ఆగిపోయినవి. "
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = "ఖాతా సదుపాయం"
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = "సోషల్"
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = "క్రాల్స్"
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = "సిస్టమ్ సెట్టింగులు"
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = "సమానం"
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = "సమానం కాదు"
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = "కలిగిఉన్నది"
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = "దీనితో ప్రారంభమవుతుంది"
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = "దీనితో ముగుస్తుంది"
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = "సమానం"
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = "సమానం కాదు"
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = "క్రమం లో లేదు "
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = "ఆరోహణ క్రమం "
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = "అవరోహణ క్రమం"
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = "పేజ్ ఆప్షన్లు
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = "టెస్ట్లు నడుస్తున్నవి!"
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = "ఫిల్టర్ పేజీలు నవీకరించబడినవి!"
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = "ఇంతకముందు ఎడిట్ చేసిన యుఆరెల్ ని ఎంచుకోండి"
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = "ఫలితాల పేజీ అప్డేట్ కోసం యుఆర్ఎల్ పేర్కొనండి!"
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = "ఫలితాల పేజీలు అప్డేట్ అయినవి!"
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = "పేజ్ లోడ్ అయినది!"
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = "మీడియా రకం"
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = "వీడియో "
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = "ఆర్ ఎస్ ఎస్ "
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = "హెచ్ టి యమ్ ఎల్ ఫీడ్ "
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = "సూచిక/మిక్స్ ఉపయోగించడానికి"
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = "సోర్స్ టైపు ఇంకా సెట్ చేయలేదు!"
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = "మీడియా సెట్ టైప్ చేయాలి!"
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = "చెల్లని యుఆర్ఎల్!"
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = "అన్ని ఖాళీలను భర్తీ చేయాలి!"
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = "మీడియా సోర్సు ఆడ్ చేయడమైనది!"
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = "అన్ని ఖాళీలను భర్తీ చేయాలి!"
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = "సబ్ సెర్చ్ ఆడ్ చేయడమైనది!"
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = "సోర్స్ డిలీట్ చెయ్యబడలేదు!"
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = "మీడియా సోర్సు డిలీట్ చేయడమైనది!"
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = "సోర్స్ డిలీట్ చెయ్యబడలేదు!"
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = "సబ్ సెర్చ్ డిలీట్ చేయడమైనది!"
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = "సబ్ సెర్చ్ అప్డేట్ చేయడమైనది!"
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = "మీడియా సోర్సు అప్డేట్ చేయడమైనది!"
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = "సెర్చ్ ఇంజిన్ వర్క్ డైరెక్టరీ"
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = "వికీ"
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = "%sపోస్ట్లు, %sథ్రెడ్లు"
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = "ఆఖరి పోస్ట్:"
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = "క్రాల్ మిక్షెస్"
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/th/configure.ini b/src/locale/th/configure.ini
index d64a6785f..c55e68b9f 100755
--- a/src/locale/th/configure.ini
+++ b/src/locale/th/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = ""
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = ""
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = ""
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/tr/configure.ini b/src/locale/tr/configure.ini
index 7efa2986c..9889cd203 100755
--- a/src/locale/tr/configure.ini
+++ b/src/locale/tr/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = ""
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = ""
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = ""
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/vi_VN/configure.ini b/src/locale/vi_VN/configure.ini
index 311757cda..831ffd2a0 100755
--- a/src/locale/vi_VN/configure.ini
+++ b/src/locale/vi_VN/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "Đăng nhập th&agrave;nh c&ocirc;ng"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "T&ecirc;n đăng nhập họăc khẩu kh&ocirc;ng đ&uacute;ng"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "đăng nhập để cấu h&igrave;nh"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = ""
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = ""
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = ""
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = ""
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = ""
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = ""
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = ""
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = ""
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = ""
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = ""
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = ""
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = ""
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = "T&igrave;m kiếm sự hướng dẫn cơ cấu động cơ"
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/locale/zh_CN/configure.ini b/src/locale/zh_CN/configure.ini
index ec99d0c9f..2dbd0d1ce 100755
--- a/src/locale/zh_CN/configure.ini
+++ b/src/locale/zh_CN/configure.ini
@@ -34,64 +34,64 @@ admin_controller_need_cookies = ""
 ; AdminController.php line: 164
 admin_controller_account_not_active = ""
 ;
-; AdminController.php line: 170
+; AdminController.php line: 178
 admin_controller_login_successful = "登入成功"
 ;
-; AdminController.php line: 189
+; AdminController.php line: 198
 admin_controller_no_back_button = ""
 ;
-; AdminController.php line: 203
+; AdminController.php line: 212
 admin_controller_login_failed = "登入失敗"
 ;
-; AdminController.php line: 209
+; AdminController.php line: 218
 admin_controller_login_to_config = "登入管理介面"
 ;
-; AdminController.php line: 213
+; AdminController.php line: 222
 admin_controller_status_updates_stopped = "管理員終止更新"
 ;
-; AdminController.php line: 375
+; AdminController.php line: 384
 admin_controller_account_access = ""
 ;
-; AdminController.php line: 376
+; AdminController.php line: 385
 admin_controller_social = ""
 ;
-; AdminController.php line: 377
+; AdminController.php line: 386
 admin_controller_crawl_settings = ""
 ;
-; AdminController.php line: 378
+; AdminController.php line: 387
 admin_controller_system_settings = ""
 ;
-; AdminController.php line: 379
+; AdminController.php line: 388
 admin_controller_advertisement = ""
 ;
-; AdminController.php line: 553
+; AdminController.php line: 562
 admin_controller_equal = ""
 ;
-; AdminController.php line: 554
+; AdminController.php line: 563
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 555
+; AdminController.php line: 564
 admin_controller_contains = ""
 ;
-; AdminController.php line: 556
+; AdminController.php line: 565
 admin_controller_begins_with = ""
 ;
-; AdminController.php line: 557
+; AdminController.php line: 566
 admin_controller_ends_with = ""
 ;
-; AdminController.php line: 560
+; AdminController.php line: 569
 admin_controller_equal = ""
 ;
-; AdminController.php line: 561
+; AdminController.php line: 570
 admin_controller_not_equal = ""
 ;
-; AdminController.php line: 564
+; AdminController.php line: 573
 admin_controller_no_sort = ""
 ;
-; AdminController.php line: 565
+; AdminController.php line: 574
 admin_controller_sort_ascending = ""
 ;
-; AdminController.php line: 566
+; AdminController.php line: 575
 admin_controller_sort_descending = ""
 ;
 ; /Applications/MAMP/htdocs/git/yioop/src/controllers/components
@@ -528,91 +528,91 @@ crawl_component_page_options_updated = "更新頁面選項"
 ; CrawlComponent.php line: 1179
 crawl_component_page_options_running_tests = ""
 ;
-; CrawlComponent.php line: 1390
-crawl_component_cmsdetectors_no_name = ""
+; CrawlComponent.php line: 1371
+crawl_component_scraper_missing = ""
 ;
-; CrawlComponent.php line: 1397
-crawl_component_cmsdetectors_added = ""
+; CrawlComponent.php line: 1379
+crawl_component_scraper_added = ""
 ;
-; CrawlComponent.php line: 1403
-crawl_component_no_delete_cmsdetectors = ""
+; CrawlComponent.php line: 1385
+crawl_component_no_delete_scraper = ""
 ;
-; CrawlComponent.php line: 1409
-crawl_component_media_cmsdetectors_deleted = ""
+; CrawlComponent.php line: 1391
+crawl_component_scraper_deleted = ""
 ;
-; CrawlComponent.php line: 1445
-crawl_component_cmsdetectors_updated = ""
+; CrawlComponent.php line: 1426
+crawl_component_scraper_updated = ""
 ;
-; CrawlComponent.php line: 1489
+; CrawlComponent.php line: 1465
 crawl_component_results_editor_update = "編輯者更新結果"
 ;
-; CrawlComponent.php line: 1504
+; CrawlComponent.php line: 1480
 crawl_component_edited_pages = "編輯頁面"
 ;
-; CrawlComponent.php line: 1517
+; CrawlComponent.php line: 1493
 crawl_component_results_editor_need_url = "需要網址"
 ;
-; CrawlComponent.php line: 1524
+; CrawlComponent.php line: 1500
 crawl_component_results_editor_page_updated = "更新頁面"
 ;
-; CrawlComponent.php line: 1538
+; CrawlComponent.php line: 1514
 crawl_component_results_editor_page_loaded = "載入頁面"
 ;
-; CrawlComponent.php line: 1569
+; CrawlComponent.php line: 1545
 crawl_component_media_kind = "多媒體類別"
 ;
-; CrawlComponent.php line: 1570
+; CrawlComponent.php line: 1546
 crawl_component_video = "影片"
 ;
-; CrawlComponent.php line: 1571
+; CrawlComponent.php line: 1547
 crawl_component_rss_feed = "RSS"
 ;
-; CrawlComponent.php line: 1572
+; CrawlComponent.php line: 1548
 crawl_component_json_feed = ""
 ;
-; CrawlComponent.php line: 1573
+; CrawlComponent.php line: 1549
 crawl_component_html_feed = ""
 ;
-; CrawlComponent.php line: 1587
+; CrawlComponent.php line: 1563
 crawl_component_sources_indexes = ""
 ;
-; CrawlComponent.php line: 1643
+; CrawlComponent.php line: 1619
 crawl_component_no_source_type = ""
 ;
-; CrawlComponent.php line: 1657
+; CrawlComponent.php line: 1633
 crawl_component_missing_type = ""
 ;
-; CrawlComponent.php line: 1671
+; CrawlComponent.php line: 1647
 crawl_component_invalid_url = ""
 ;
-; CrawlComponent.php line: 1678
+; CrawlComponent.php line: 1654
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1695
+; CrawlComponent.php line: 1671
 crawl_component_media_source_added = "增加多媒體"
 ;
-; CrawlComponent.php line: 1708
+; CrawlComponent.php line: 1684
 crawl_component_missing_fields = ""
 ;
-; CrawlComponent.php line: 1716
+; CrawlComponent.php line: 1692
 crawl_component_subsearch_added = ""
 ;
-; CrawlComponent.php line: 1722
+; CrawlComponent.php line: 1698
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1728
+; CrawlComponent.php line: 1704
 crawl_component_media_source_deleted = "刪除多媒體"
 ;
-; CrawlComponent.php line: 1735
+; CrawlComponent.php line: 1711
 crawl_component_no_delete_source = ""
 ;
-; CrawlComponent.php line: 1742
+; CrawlComponent.php line: 1718
 crawl_component_subsearch_deleted = ""
 ;
-; CrawlComponent.php line: 1777
+; CrawlComponent.php line: 1753
 crawl_component_subsearch_updated = ""
 ;
-; CrawlComponent.php line: 1853
+; CrawlComponent.php line: 1829
 crawl_component_media_source_updated = ""
 ;
 ; SocialComponent.php line: 91
@@ -1990,51 +1990,6 @@ appearance_element_reset_customizations = ""
 ; AppearanceElement.php line: 199
 appearance_element_save = ""
 ;
-; CmsDetectorsElement.php line: 61
-cmsdetectors_element_addcmsdetectors_form = ""
-;
-; CmsDetectorsElement.php line: 62
-cmsdetectors_element_edit_cms_detectors = ""
-;
-; CmsDetectorsElement.php line: 66
-cmsdetectors_element_add_cmd_detectors = ""
-;
-; CmsDetectorsElement.php line: 89
-cmsdetectors_element_sourcename = ""
-;
-; CmsDetectorsElement.php line: 98
-cmsdetectors_element_header = ""
-;
-; CmsDetectorsElement.php line: 104
-cmsdetectors_element_importantcontent = ""
-;
-; CmsDetectorsElement.php line: 112
-cmsdetectors_element_submit = ""
-;
-; CmsDetectorsElement.php line: 118
-cmsdetectors_element_cms_Detectors = ""
-;
-; CmsDetectorsElement.php line: 142
-cmsdetectors_element_detectorsname = ""
-;
-; CmsDetectorsElement.php line: 143
-cmsdetectors_element_detectorsheader = ""
-;
-; CmsDetectorsElement.php line: 145
-cmsdetectors_element_detectorsimportantcontent = ""
-;
-; CmsDetectorsElement.php line: 147
-cmsdetectors_element_detectorsaction = ""
-;
-; CmsDetectorsElement.php line: 161
-searchsources_element_editmedia = ""
-;
-; CmsDetectorsElement.php line: 164
-cmsdetectors_element_confirmdelete = ""
-;
-; CmsDetectorsElement.php line: 167
-cmsdetectors_element_deletecmsdetectors = ""
-;
 ; ConfigureElement.php line: 72
 configure_element_work_directory = ""
 ;
@@ -2533,40 +2488,40 @@ manageaccount_element_num_groups = ""
 ; ManageaccountElement.php line: 272
 manageaccount_element_num_group = ""
 ;
-; ManageaccountElement.php line: 286
+; ManageaccountElement.php line: 289
 manageaccount_element_manage = ""
 ;
-; ManageaccountElement.php line: 288
+; ManageaccountElement.php line: 292
 manageaccount_element_statistics = ""
 ;
-; ManageaccountElement.php line: 301
+; ManageaccountElement.php line: 304
 manageaccount_element_group_wiki = ""
 ;
-; ManageaccountElement.php line: 303
+; ManageaccountElement.php line: 306
 manageaccount_element_group_stats = ""
 ;
-; ManageaccountElement.php line: 308
+; ManageaccountElement.php line: 311
 manageaccount_element_last_post = ""
 ;
-; ManageaccountElement.php line: 318
+; ManageaccountElement.php line: 321
 manageaccount_element_manage_all_groups = ""
 ;
-; ManageaccountElement.php line: 320
+; ManageaccountElement.php line: 323
 manageaccount_element_go_to_group_feed = ""
 ;
-; ManageaccountElement.php line: 321
+; ManageaccountElement.php line: 324
 manageaccount_element_crawl_mixes = ""
 ;
-; ManageaccountElement.php line: 322
+; ManageaccountElement.php line: 325
 manageaccount_element_mixes_info = ""
 ;
-; ManageaccountElement.php line: 324
+; ManageaccountElement.php line: 327
 manageaccount_element_num_mixes = ""
 ;
-; ManageaccountElement.php line: 327
+; ManageaccountElement.php line: 330
 manageaccount_element_num_mix = ""
 ;
-; ManageaccountElement.php line: 331
+; ManageaccountElement.php line: 334
 manageaccount_element_manage_mixes = ""
 ;
 ; ManageadvertisementsElement.php line: 59
@@ -3652,6 +3607,51 @@ resultseditor_element_sites_to_filter = ""
 ; ResultseditorElement.php line: 119
 resultseditor_element_save_filter = ""
 ;
+; ScrapersElement.php line: 58
+scrapers_element_add_scraper_form = ""
+;
+; ScrapersElement.php line: 59
+scrapers_element_edit_scrapers = ""
+;
+; ScrapersElement.php line: 63
+scrapers_element_add_scraper = ""
+;
+; ScrapersElement.php line: 86
+scrapers_element_scraper_name = ""
+;
+; ScrapersElement.php line: 95
+scrapers_element_signature = ""
+;
+; ScrapersElement.php line: 101
+scrapers_element_scrape_rules = ""
+;
+; ScrapersElement.php line: 109
+scrapers_element_save = ""
+;
+; ScrapersElement.php line: 115
+scrapers_element_scrapers = ""
+;
+; ScrapersElement.php line: 131
+scrapers_element_name_heading = ""
+;
+; ScrapersElement.php line: 132
+scrapers_element_signature_heading = ""
+;
+; ScrapersElement.php line: 134
+scrapers_element_scrape_rules_heading = ""
+;
+; ScrapersElement.php line: 135
+scrapers_element_actions = ""
+;
+; ScrapersElement.php line: 149
+scrapers_element_edit = ""
+;
+; ScrapersElement.php line: 152
+scrapers_element_confirm_delete = ""
+;
+; ScrapersElement.php line: 155
+scrapers_element_delete_scraper = ""
+;
 ; SearchsourcesElement.php line: 62
 searchsources_element_addsource_form = ""
 ;
diff --git a/src/models/CmsModel.php b/src/models/CmsModel.php
deleted file mode 100644
index 5ad16a5ae..000000000
--- a/src/models/CmsModel.php
+++ /dev/null
@@ -1,156 +0,0 @@
-<?php
-/**
- * SeekQuarry/Yioop --
- * Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- * Copyright (C) 2009 - 2016  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.orgs
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
- * @copyright 2009 - 2016
- * @filesource
- */
-namespace seekquarry\yioop\models;
-
-use seekquarry\yioop\configs as C;
-use seekquarry\yioop\library as L;
-use seekquarry\yioop\library\CrawlConstants;
-use seekquarry\yioop\library\FetchUrl;
-use seekquarry\yioop\library\IndexShard;
-use seekquarry\yioop\library\PhraseParser;
-use seekquarry\yioop\library\UrlParser;
-use seekquarry\yioop\controllers\AdminController;
-
-/** For getLocaleTag*/
-require_once __DIR__.'/../library/LocaleFunctions.php';
-/**
- * Used to manage data related to CMS_DETECTORS
- *
- * @author Charles Bocage
- */
-class CmsModel extends ParallelModel
-{
-    /**
-     * Controls which tables and the names of tables
-     * underlie the given model and should be used in a getRows call
-     *
-     * @param string $args it does not matter.
-     * @return string which table to use
-     */
-    public function fromCallback($args = null)
-    {
-        return "CMS_DETECTORS";
-    }
-    /**
-     * Return the contents of the CMS_DETECTORS table
-     * @return array associative array with TIMESTAMP, NAME, HEADER,
-     *     and LANGUAGE
-     */
-    public function getsCmsDetectorsSettings()
-    {
-        $db = $this->db;
-        $sources = [];
-        $sql = "SELECT * FROM CMS_DETECTORS";
-        $result = $db->execute($sql);
-        if (!$result) {
-            return false;
-        }
-        $i = 0;
-        while ($sources[$i] = $db->fetchArray($result)) {
-            $i++;
-        }
-        unset($sources[$i]); //last one will be null
-        return $sources;
-    }
-    /**
-     * Used to add a new video, rss, html news, or other sources to Yioop
-     *
-     * @param string $name
-     * @param string $source_header the regex to query the html headers for
-     *     a match
-     * @param string $source_importantcontent the xpath strings used to find
-     *     the important content in the html document
-     */
-    public function addCmsDetectors($name, $source_header,
-        $source_importantcontent)
-    {
-        $admin = new AdminController();
-        $db = $this->db;
-        $sql = "INSERT INTO CMS_DETECTORS VALUES (?,?,?,?)";
-        $name = $admin->clean($name, "string");
-        $source_header = $admin->clean($source_header, "string");
-        $source_importantcontent = $admin->clean($source_importantcontent,
-            "string");
-        $db->execute($sql, [time(), $name, $source_header,
-            $source_importantcontent]);
-    }
-    /**
-     * Deletes the cms detector whose id is the given timestamp
-     *
-     * @param int $timestamp of media source to be deleted
-     */
-    public function deleteCmsDetectors($timestamp)
-    {
-        $sql = "DELETE FROM CMS_DETECTORS WHERE TIMESTAMP=?";
-        $this->db->execute($sql, [$timestamp]);
-    }
-    /**
-     * Return the cms detector by the timestamp of the source
-     * @param string $timestamp of the cms detectors to look up
-     * @return array associative array with TIMESTAMP, NAME, HEADER and
-     *     IMPORTANT_CONTENT
-     */
-    public function getCmsDetectors($timestamp)
-    {
-        $db = $this->db;
-        $sql = "SELECT * FROM CMS_DETECTORS WHERE TIMESTAMP = ?";
-        $result = $db->execute($sql, [$timestamp]);
-        if (!$result) {
-            return false;
-        }
-        $row = $db->fetchArray($result);
-        return $row;
-    }
-    /**
-     * Used to update the fields stored in a CMS_DETECTORS row according to
-     * an array holding new values
-     * @param array $source_info updated values for a CMS_DETECTORS row
-     */
-    public function updateCmsDetectors($source_info)
-    {
-        $timestamp = $source_info['TIMESTAMP'];
-        unset($source_info['TIMESTAMP']);
-        unset($source_info['NAME']);
-        $sql = "UPDATE CMS_DETECTORS SET ";
-        $comma ="";
-        $params = [];
-        $admin = new AdminController();
-        foreach ($source_info as $field => $value) {
-            $sql .= "$comma $field=? ";
-            $comma = ",";
-            //$value = $admin->clean($value, "string");
-            $params[] = $value;
-        }
-        $sql .= " WHERE TIMESTAMP=?";
-        $params[] = $timestamp;
-        $this->db->execute($sql, $params);
-    }
-}
\ No newline at end of file
diff --git a/src/models/ProfileModel.php b/src/models/ProfileModel.php
index 075ec976b..af7e72ff2 100755
--- a/src/models/ProfileModel.php
+++ b/src/models/ProfileModel.php
@@ -138,11 +138,12 @@ class ProfileModel extends Model
                 CRAWL_MIXES (OWNER_ID)",
             "CM_PARENT_INDEX" => "CREATE INDEX CM_PARENT_INDEX ON
                 CRAWL_MIXES (PARENT)",
-            "CMS_DETECTORS" =>
-                "CREATE TABLE CMS_DETECTORS (TIMESTAMP NUMERIC(" .
-                C\TIMESTAMP_LEN . ") PRIMARY KEY NOT NULL, NAME VARCHAR(" .
-                C\TITLE_LEN . "), HEADER VARCHAR(" . C\TITLE_LEN . ")," .
-                "IMPORTANT_CONTENT VARCHAR(" . C\TITLE_LEN . "))",
+            "SCRAPER" =>
+                "CREATE TABLE SCRAPER (ID $serial PRIMARY KEY
+                $auto_increment, NAME VARCHAR(" .
+                C\TITLE_LEN . ") UNIQUE, SIGNATURE VARCHAR("
+                . C\TITLE_LEN . ")," .
+                "SCRAPE_RULES VARCHAR(" . C\TITLE_LEN . "))",
             "CURRENT_WEB_INDEX" => "CREATE TABLE CURRENT_WEB_INDEX
                 (CRAWL_TIME NUMERIC(" . C\TIMESTAMP_LEN . ") PRIMARY KEY)",
             "CREDIT_LEDGER" => "CREATE TABLE CREDIT_LEDGER
diff --git a/src/models/ScraperModel.php b/src/models/ScraperModel.php
new file mode 100644
index 000000000..ca9e0b5ff
--- /dev/null
+++ b/src/models/ScraperModel.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2016  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.orgs
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2016
+ * @filesource
+ */
+namespace seekquarry\yioop\models;
+
+use seekquarry\yioop\configs as C;
+use seekquarry\yioop\library as L;
+/**
+ * Used to manage data related to the SCRAPER database table.
+ * This table is used to store web scrapers, a tool for scraping
+ * important content from pages which might have been generated
+ * by a content management system.
+ *
+ * @author Charles Bocage (changed CMS_DETECTORS to SCRAPER and
+ *  simplified Chris Pollett)
+ */
+class ScraperModel extends Model
+{
+    /**
+     * Controls which tables and the names of tables
+     * underlie the given model and should be used in a getRows call
+     *
+     * @param string $args it does not matter.
+     * @return string which table to use
+     */
+    public function fromCallback($args = null)
+    {
+        return "SCRAPER";
+    }
+    /**
+     * Return the contents of the SCRAPER table
+     * @return array associative of rows with ID, NAME, SIGNATURE,
+     *     and SCRAPE_RULES
+     */
+    public function getAllScrapers()
+    {
+        $db = $this->db;
+        $sources = [];
+        $sql = "SELECT * FROM SCRAPER";
+        $result = $db->execute($sql);
+        if (!$result) {
+            return false;
+        }
+        while ($sources[] = $db->fetchArray($result)) {
+        }
+        return $sources;
+    }
+    /**
+     * Used to add a new scraper to Yioop
+     *
+     * @param string $name of scraper to add
+     * @param string $signature the regex to query the html headers for
+     *     a match
+     * @param string $scrape_rules the xpath strings used to find
+     *     the important content in the html document
+     */
+    public function add($name, $signature, $scrape_rules)
+    {
+        $db = $this->db;
+        $sql = "INSERT INTO SCRAPER(NAME, SIGNATURE, SCRAPE_RULES)
+            VALUES (?,?,?)";
+        $db->execute($sql, [$name, $signature, $scrape_rules]);
+    }
+    /**
+     * Deletes the scraper with the provided id
+     *
+     * @param int $id of scraper to be deleted
+     */
+    public function delete($id)
+    {
+        $sql = "DELETE FROM SCRAPER WHERE ID=?";
+        $this->db->execute($sql, [$id]);
+    }
+    /**
+     * Returns the scraper with the given id
+     * @param int $id of scraper to look up
+     * @return array associative array with ID, NAME, SIGNATURE,
+     *     and SCRAPE_RULES of a scraper
+     */
+    public function get($id)
+    {
+        $db = $this->db;
+        $sql = "SELECT * FROM SCRAPER WHERE ID = ?";
+        $result = $db->execute($sql, [$id]);
+        if (!$result) {
+            return false;
+        }
+        $row = $db->fetchArray($result);
+        return $row;
+    }
+    /**
+     * Used to update the fields stored in a SCRAPER row according to
+     * an array holding new values
+     * @param array $scraper_info updated values for scraper
+     */
+    public function update($scraper_info)
+    {
+        $id = $scraper_info['ID'];
+        unset($scraper_info['ID']);
+        $sql = "UPDATE SCRAPER SET ";
+        $comma = "";
+        $params = [];
+        foreach ($scraper_info as $field => $value) {
+            $sql .= "$comma $field=? ";
+            $comma = ",";
+            $params[] = $value;
+        }
+        $sql .= " WHERE ID=?";
+        $params[] = $id;
+        $this->db->execute($sql, $params);
+    }
+}
diff --git a/src/views/elements/CmsDetectorsElement.php b/src/views/elements/CmsDetectorsElement.php
deleted file mode 100644
index ed047dc4b..000000000
--- a/src/views/elements/CmsDetectorsElement.php
+++ /dev/null
@@ -1,176 +0,0 @@
-<?php
-/**
- * SeekQuarry/Yioop --
- * Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- * Copyright (C) 2009 - 2016  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
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
- * @copyright 2009 - 2016
- * @filesource
- */
-namespace seekquarry\yioop\views\elements;
-
-use seekquarry\yioop as B;
-use seekquarry\yioop\configs as C;
-
-/**
- * Contains the forms for managing CMS Detection.
- *
- * @author Charles Bocage
- */
-class CmsDetectorsElement extends Element
-{
-    /**
-     * Renders search source and subsearch forms
-     *
-     * @param array $data available Search sources  and subsearches
-     */
-    public function render($data)
-    {
-        $admin_url = htmlentities(B\controllerUrl('admin', true));
-        $token_string = C\CSRF_TOKEN."=".$data[C\CSRF_TOKEN];
-        $pre_base_url = $admin_url . $token_string;
-        $base_url = $pre_base_url . "&amp;a=cmsDetectors";
-        $localize_url = $pre_base_url . "&amp;a=manageLocales".
-            "&amp;arg=editstrings&amp;selectlocale=".$data['LOCALE_TAG'].
-            "&amp;previous_activity=cmsDetectors";
-        ?>
-        <div class="current-activity">
-        <?php if ($data["SOURCE_FORM_TYPE"] == "editsource") {
-            ?>
-            <div class='float-opposite'><a href='<?= $base_url ?>'><?=
-                tl('cmsdetectors_element_addcmsdetectors_form') ?></a></div>
-            <h2><?= tl('cmsdetectors_element_edit_cms_detectors')?></h2>
-            <?php
-        } else {
-            ?>
-            <h2><?= tl('cmsdetectors_element_add_cmd_detectors')?>
-            <?= $this->view->helper("helpbutton")->render(
-                "CMS Detectors", $data[C\CSRF_TOKEN]) ?>
-            </h2>
-            <?php
-        }
-        ?>
-        <form id="addCmsDetectorsForm" method="post">
-        <input type="hidden" name="c" value="admin" />
-        <input type="hidden" name="<?= C\CSRF_TOKEN ?>" value="<?=
-            $data[C\CSRF_TOKEN] ?>" />
-        <input type="hidden" name="a" value="cmsDetectors" />
-        <input type="hidden" name="arg" value="<?=
-            $data['SOURCE_FORM_TYPE']?>" />
-        <?php
-        if ($data['SOURCE_FORM_TYPE'] == "editsource") {
-            ?>
-            <input type="hidden" name="ts" value="<?= $data['ts']?>" />
-            <?php
-        }
-        ?>
-        <table class="name-table">
-        <tr><td><label for="source-name"><b><?=
-            tl('cmsdetectors_element_sourcename')?></b></label></td><td>
-            <input type="text" id="source-name" name="name"
-                value="<?=$data['CURRENT_CMS_DETECTORS']['name'] ?>"
-                maxlength="<?= C\LONG_NAME_LEN ?>"
-                class="wide-field" <?php
-                if ($data["SOURCE_FORM_TYPE"] == "editsource") {
-                    e("disabled='disabled'");
-                } ?>/></td></tr>
-        <tr><td><label for="source-header"><b><?=
-            tl('cmsdetectors_element_header')?></b></label></td><td>
-            <input type="header" id="source-header" name="header"
-                value="<?=$data['CURRENT_CMS_DETECTORS']['header'] ?>"
-                maxlength="<?=C\MAX_URL_LEN ?>"
-                class="wide-field" /></td></tr>
-        <tr><td><label for="source-important-content"><b><?=
-            tl('cmsdetectors_element_importantcontent')?></b></label></td><td>
-            <input type="importantcontent" id="source-importantcontent"
-                name="important_content"
-                value=
-                "<?=$data['CURRENT_CMS_DETECTORS']['important_content']?>"
-                maxlength="<?=C\MAX_URL_LEN ?>"
-                class="wide-field" /></td></tr>
-        <tr><td></td><td class="center"><button class="button-box"
-            type="submit"><?=tl('cmsdetectors_element_submit')
-            ?></button></td></tr>
-        </table>
-        </form>
-        <?php
-        $data['FORM_TYPE'] = "";
-        $data['TABLE_TITLE'] = tl('cmsdetectors_element_cms_Detectors');
-        $data['NO_FLOAT_TABLE'] = true;
-        $data['ACTIVITY'] = 'cmsDetectors';
-        $data['VIEW'] = $this->view;
-        $data['NO_SEARCH'] = true;
-        $paging_items = ['SUBstart_row', 'SUBend_row', 'SUBnum_show'];
-
-        $paging1 = "";
-        foreach ($paging_items as $item) {
-            if (isset($data[strtoupper($item)])) {
-                $paging1 .= "&amp;".$item."=".$data[strtoupper($item)];
-            }
-        }
-        $paging2 = "";
-        $paging_items = ['start_row', 'end_row', 'num_show'];
-        foreach ($paging_items as $item) {
-            if (isset($data[strtoupper($item)])) {
-                $paging2 .= "&amp;".$item."=".$data[strtoupper($item)];
-            }
-        }
-        $data['PAGING'] = $paging1;
-        $this->view->helper("pagingtable")->render($data);
-        ?>
-        <table class="cms-detectors-table">
-        <tr><th><?= tl('cmsdetectors_element_detectorsname') ?></th>
-            <th><?= tl('cmsdetectors_element_detectorsheader') ?></th>
-            <th width="40%"><?=
-                tl('cmsdetectors_element_detectorsimportantcontent') ?></th>
-            <th colspan="2" width="20%"><?=
-                tl('cmsdetectors_element_detectorsaction') ?></th>
-        <?php
-        foreach ($data['CMS_DETECTORS_SETTINGS'] as $source) {
-            $encode_source = urlencode(
-                urlencode($source['NAME']));
-        ?>
-        <tr><td><b><?= $source['NAME'] ?></b></td>
-            <td><?= $source['HEADER'] ?></td>
-            <td>
-                <?= preg_replace("/###/", "###<br />",
-                    $source['IMPORTANT_CONTENT']); ?>
-            </td>
-            <td><a href="<?=$base_url."&amp;arg=editsource&amp;ts=".
-                $source['TIMESTAMP'].$paging1 . $paging2 ?>"><?=
-                tl('searchsources_element_editmedia')
-            ?></a></td>
-            <td><a onclick='javascript:return confirm("<?=
-                tl('cmsdetectors_element_confirmdelete') ?>");' href="<?=
-                $base_url."&amp;arg=deletesource&amp;ts=".
-                $source['TIMESTAMP'] . $paging1 . $paging2 ?>"><?=
-                tl('cmsdetectors_element_deletecmsdetectors')
-            ?></a></td></tr>
-        <?php
-        } ?>
-        </table>
-        </div>
-    <?php
-    }
-}
diff --git a/src/views/elements/ScrapersElement.php b/src/views/elements/ScrapersElement.php
new file mode 100644
index 000000000..3a583a3ec
--- /dev/null
+++ b/src/views/elements/ScrapersElement.php
@@ -0,0 +1,162 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2016  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
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2016
+ * @filesource
+ */
+namespace seekquarry\yioop\views\elements;
+
+use seekquarry\yioop as B;
+use seekquarry\yioop\configs as C;
+
+/**
+ * Contains the forms for managing Web Page Scrapers.
+ *
+ * @author Charles Bocage (repurposed from CMS Detector element by
+ *  Chris Pollett)
+ */
+class ScrapersElement extends Element
+{
+    /**
+     * Renders Web Scrapers form and the table used for drawing the
+     * current scrapers
+     *
+     * @param array $data contains the available scrapers
+     *      as well as potentially edit info for the current scraper
+     */
+    public function render($data)
+    {
+        $admin_url = htmlentities(B\controllerUrl('admin', true));
+        $token_string = C\CSRF_TOKEN."=".$data[C\CSRF_TOKEN];
+        $pre_base_url = $admin_url . $token_string;
+        $base_url = $pre_base_url . "&amp;a=scrapers";
+        ?>
+        <div class="current-activity">
+        <?php if ($data["FORM_TYPE"] == "edit") {
+            ?>
+            <div class='float-opposite'><a href='<?= $base_url ?>'><?=
+                tl('scrapers_element_add_scraper_form') ?></a></div>
+            <h2><?= tl('scrapers_element_edit_scrapers')?></h2>
+            <?php
+        } else {
+            ?>
+            <h2><?= tl('scrapers_element_add_scraper')?>
+            <?= $this->view->helper("helpbutton")->render(
+                "Scrapers", $data[C\CSRF_TOKEN]) ?>
+            </h2>
+            <?php
+        }
+        ?>
+        <form id="addScraperForm" method="post">
+        <input type="hidden" name="c" value="admin" />
+        <input type="hidden" name="<?= C\CSRF_TOKEN ?>" value="<?=
+            $data[C\CSRF_TOKEN] ?>" />
+        <input type="hidden" name="a" value="scrapers" />
+        <input type="hidden" name="arg" value="<?=
+            $data['FORM_TYPE']?>" />
+        <?php
+        if ($data['FORM_TYPE'] == "edit") {
+            ?>
+            <input type="hidden" name="id" value="<?= $data['id']?>" />
+            <?php
+        }
+        ?>
+        <table class="name-table">
+        <tr><td><label for="scraper-name"><b><?=
+            tl('scrapers_element_scraper_name')?></b></label></td><td>
+            <input type="text" id="scraper-name" name="name"
+                value="<?=$data['CURRENT_SCRAPER']['name'] ?>"
+                maxlength="<?= C\LONG_NAME_LEN ?>"
+                class="wide-field" <?php
+                if ($data["FORM_TYPE"] == "edit") {
+                    e("disabled='disabled'");
+                } ?>/></td></tr>
+        <tr><td><label for="scrapers-signature"><b><?=
+            tl('scrapers_element_signature')?></b></label></td><td>
+            <input type="text" id="scrapers-signature" name="signature"
+                value="<?=$data['CURRENT_SCRAPER']['signature'] ?>"
+                maxlength="<?=C\MAX_URL_LEN ?>"
+                class="wide-field" /></td></tr>
+        <tr><td><label for="scrapers-scrape-rules"><b><?=
+            tl('scrapers_element_scrape_rules')?></b></label></td><td>
+            <input type="text" id="scrapers-scrape-rules"
+                name="scrape_rules"
+                value=
+                "<?=$data['CURRENT_SCRAPER']['scrape_rules']?>"
+                maxlength="<?=C\MAX_URL_LEN ?>"
+                class="wide-field" /></td></tr>
+        <tr><td></td><td class="center"><button class="button-box"
+            type="submit"><?=tl('scrapers_element_save')
+            ?></button></td></tr>
+        </table>
+        </form>
+        <?php
+        $data['FORM_TYPE'] = "";
+        $data['TABLE_TITLE'] = tl('scrapers_element_scrapers');
+        $data['NO_FLOAT_TABLE'] = true;
+        $data['ACTIVITY'] = 'scrapers';
+        $data['VIEW'] = $this->view;
+        $data['NO_SEARCH'] = true;
+        $this->view->helper("pagingtable")->render($data);
+        $paging = "&amp;start_row=".$data['START_ROW'].
+                    "&amp;end_row=".$data['END_ROW'].
+                    "&amp;num_show=".$data['NUM_SHOW'];
+        ?>
+        <table class="scrapers-table">
+        <tr><th><?= tl('scrapers_element_name_heading') ?></th>
+            <th><?= tl('scrapers_element_signature_heading') ?></th>
+            <th><?=
+                tl('scrapers_element_scrape_rules_heading') ?></th>
+            <th colspan="2"><?= tl('scrapers_element_actions') ?></th>
+        <?php
+        foreach ($data['SCRAPERS'] as $scraper) {
+            $encode_source = urlencode(
+                urlencode($scraper['NAME']));
+        ?>
+        <tr><td><b><?= $scraper['NAME'] ?></b></td>
+            <td><?=$scraper['SIGNATURE'] ?></td>
+            <td>
+                <?=preg_replace("/###/", "###<br />",
+                    $scraper['SCRAPE_RULES']); ?>
+            </td>
+            <td><a href="<?=$base_url."&amp;arg=edit&amp;id=".
+                $scraper['ID']. $paging?>"><?=
+                tl('scrapers_element_edit')
+            ?></a></td>
+            <td><a onclick='javascript:return confirm("<?=
+                tl('scrapers_element_confirm_delete') ?>");' href="<?=
+                $base_url . "&amp;arg=delete&amp;id=".
+                $scraper['ID'] . $paging  ?>"><?=
+                tl('scrapers_element_delete_scraper')
+            ?></a></td></tr>
+        <?php
+        } ?>
+        </table>
+        </div>
+    <?php
+    }
+}
diff --git a/tests/CmsDetectorTest.php b/tests/CmsDetectorTest.php
deleted file mode 100644
index 92912135c..000000000
--- a/tests/CmsDetectorTest.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * SeekQuarry/Yioop --
- * Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- * Copyright (C) 2009 - 2016  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 Charles Bocage charles.bocage@sjsu.edu
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
- * @copyright 2009 - 2016
- * @filesource
- */
-namespace seekquarry\yioop\tests;
-
-use seekquarry\yioop\configs as C;
-use seekquarry\yioop\library\UnitTest;
-use seekquarry\yioop\library\processors\HtmlProcessor;
-
-/**
- * Code used to test the CMS detector algorithms.
- *
- * @author Charles Bocage
- */
-class CmsDetectorTest extends UnitTest
-{
-    /**
-     * Nothing done for unit test setup
-     */
-    public function setUp()
-    {
-    }
-    /**
-     * Nothing done for unit test tear done
-     */
-    public function tearDown()
-    {
-    }
-    /**
-     * This function reads each line from the $file_names file. The
-     * $file_names file contains a list of a files to load into the
-     * CMS detector to check its framework.  The contents of the file is sent
-     * to the CMS detector and it returns if it found a match or not.  Then it
-     * corresponding value in the $return_values_to_compare file to make sure
-     * they match.
-     *
-     * $return_values_to_compare is a list of corresponding values used for
-     * comparing results
-     * $file_names is a list of files to load into the CMS detector
-     */
-    public function checkTestCase()
-    {
-        $cms_detector_dir = C\PARENT_DIR . '/tests/test_files/cms_detector';
-        $file_names = file("$cms_detector_dir/cms_detector_input.txt");
-        $return_values_to_compare =
-            file("$cms_detector_dir/cms_detector_results.txt");
-        for ($i = 0; $i < count($file_names); $i++) {
-            $file_name = trim($file_names[$i]);
-            $file_path = iconv('ASCII', 'UTF-8//IGNORE',
-                $cms_detector_dir . "/" . $file_name);
-            $return_value_to_compare = trim($return_values_to_compare[$i]);
-            $contents = file_get_contents($file_path);
-            $processor = new HtmlProcessor();
-            $detector = $processor->checkForCmsContent($contents);
-            $cms_detector_return_value = false;
-            if (!empty($detector)) {
-                $cms_detector_return_value = $detector->getName();
-            }
-            $this->assertEqual($cms_detector_return_value,
-                $return_value_to_compare, "function check ".
-                "incorrectly detects the contents in \"$file_name\" ".
-                "[$cms_detector_return_value] to $return_value_to_compare");
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/ScraperManagerTest.php b/tests/ScraperManagerTest.php
new file mode 100644
index 000000000..aa69f8bba
--- /dev/null
+++ b/tests/ScraperManagerTest.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2016  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 Charles Bocage charles.bocage@sjsu.edu
+ * @license http://www.gnu.org/licenses/ GPL3
+ * @link http://www.seekquarry.com/
+ * @copyright 2009 - 2016
+ * @filesource
+ */
+namespace seekquarry\yioop\tests;
+
+use seekquarry\yioop\configs as C;
+use seekquarry\yioop\library\ScraperManager;
+use seekquarry\yioop\library\UnitTest;
+use seekquarry\yioop\models\ScraperModel;
+
+/**
+ * Code used to test Web Scrapers.
+ *
+ * @author Charles Bocage (modified to be used for Scraper class from
+ *  previous code for CMS Detectors by Chris Pollett)
+ */
+class ScraperManagerTest extends UnitTest
+{
+    /**
+     * Nothing done for unit test setup
+     */
+    public function setUp()
+    {
+    }
+    /**
+     * Nothing done for unit test tear done
+     */
+    public function tearDown()
+    {
+    }
+    /**
+     * This function uses its local variable $file_names to read in a
+     * file with a list of files to scrape. Each file is then checked
+     * against the current active list of scrapers, and the scraper
+     * label of the scraper whose signature matched against the file
+     * is determined. This label is then compared against the $correct_names
+     * array to see if the answer is as expected.
+     */
+    public function checkTestCase()
+    {
+        $scrapers_dir = C\PARENT_DIR . '/tests/test_files/scrapers';
+        $file_names = file("$scrapers_dir/scraper_input.txt");
+        $correct_names =
+            file("$scrapers_dir/scraper_results.txt");
+        for ($i = 0; $i < count($file_names); $i++) {
+            $file_name = trim($file_names[$i]);
+            $file_path = $scrapers_dir . "/" . $file_name;
+            $correct_name = trim($correct_names[$i]);
+            $contents = file_get_contents($file_path);
+            $scraper_model = new ScraperModel();
+            $scrapers = $scraper_model->getAllScrapers();
+            $scraper =
+                ScraperManager::getScraper($contents, $scrapers);
+            $name = empty($scraper['NAME']) ? "" : $scraper['NAME'];
+            $this->assertEqual($name, $correct_name,
+                "incorrectly detects the contents in \"$file_name\" ".
+                "as a $name site rather than a $correct_name site.");
+        }
+    }
+}
diff --git a/tests/test_files/cms_detector/Drupal01.txt b/tests/test_files/scrapers/Drupal01.txt
similarity index 100%
rename from tests/test_files/cms_detector/Drupal01.txt
rename to tests/test_files/scrapers/Drupal01.txt
diff --git a/tests/test_files/cms_detector/Drupal02.txt b/tests/test_files/scrapers/Drupal02.txt
similarity index 100%
rename from tests/test_files/cms_detector/Drupal02.txt
rename to tests/test_files/scrapers/Drupal02.txt
diff --git a/tests/test_files/cms_detector/Drupal03.txt b/tests/test_files/scrapers/Drupal03.txt
similarity index 100%
rename from tests/test_files/cms_detector/Drupal03.txt
rename to tests/test_files/scrapers/Drupal03.txt
diff --git a/tests/test_files/cms_detector/Drupal04.txt b/tests/test_files/scrapers/Drupal04.txt
similarity index 100%
rename from tests/test_files/cms_detector/Drupal04.txt
rename to tests/test_files/scrapers/Drupal04.txt
diff --git a/tests/test_files/cms_detector/Joomla01.txt b/tests/test_files/scrapers/Joomla01.txt
similarity index 100%
rename from tests/test_files/cms_detector/Joomla01.txt
rename to tests/test_files/scrapers/Joomla01.txt
diff --git a/tests/test_files/cms_detector/SiteCore01.txt b/tests/test_files/scrapers/SiteCore01.txt
similarity index 100%
rename from tests/test_files/cms_detector/SiteCore01.txt
rename to tests/test_files/scrapers/SiteCore01.txt
diff --git a/tests/test_files/cms_detector/SiteCore02.txt b/tests/test_files/scrapers/SiteCore02.txt
similarity index 100%
rename from tests/test_files/cms_detector/SiteCore02.txt
rename to tests/test_files/scrapers/SiteCore02.txt
diff --git a/tests/test_files/cms_detector/Wordpress01.txt b/tests/test_files/scrapers/Wordpress01.txt
similarity index 99%
rename from tests/test_files/cms_detector/Wordpress01.txt
rename to tests/test_files/scrapers/Wordpress01.txt
index 4c1a5a1e6..9a2f72356 100644
--- a/tests/test_files/cms_detector/Wordpress01.txt
+++ b/tests/test_files/scrapers/Wordpress01.txt
@@ -203,4 +203,4 @@ blockquote { border-left-color: #81EDD8;}
 <body>

 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/tests/test_files/cms_detector/Wordpress02.txt b/tests/test_files/scrapers/Wordpress02.txt
similarity index 100%
rename from tests/test_files/cms_detector/Wordpress02.txt
rename to tests/test_files/scrapers/Wordpress02.txt
diff --git a/tests/test_files/cms_detector/Wordpress03.txt b/tests/test_files/scrapers/Wordpress03.txt
similarity index 100%
rename from tests/test_files/cms_detector/Wordpress03.txt
rename to tests/test_files/scrapers/Wordpress03.txt
diff --git a/tests/test_files/cms_detector/Wordpress04.txt b/tests/test_files/scrapers/Wordpress04.txt
similarity index 100%
rename from tests/test_files/cms_detector/Wordpress04.txt
rename to tests/test_files/scrapers/Wordpress04.txt
diff --git a/tests/test_files/cms_detector/Yioop01.txt b/tests/test_files/scrapers/Yioop01.txt
similarity index 100%
rename from tests/test_files/cms_detector/Yioop01.txt
rename to tests/test_files/scrapers/Yioop01.txt
diff --git a/tests/test_files/cms_detector/cms_detector_input.txt b/tests/test_files/scrapers/scraper_input.txt
similarity index 94%
rename from tests/test_files/cms_detector/cms_detector_input.txt
rename to tests/test_files/scrapers/scraper_input.txt
index a714df99f..26515e52d 100644
--- a/tests/test_files/cms_detector/cms_detector_input.txt
+++ b/tests/test_files/scrapers/scraper_input.txt
@@ -11,4 +11,4 @@ vBulletin02.txt
 Joomla01.txt
 SiteCore01.txt
 SiteCore02.txt
-Yioop01.txt
\ No newline at end of file
+Yioop01.txt
diff --git a/tests/test_files/cms_detector/cms_detector_results.txt b/tests/test_files/scrapers/scraper_results.txt
similarity index 95%
rename from tests/test_files/cms_detector/cms_detector_results.txt
rename to tests/test_files/scrapers/scraper_results.txt
index c37ba0c55..a275a6a54 100644
--- a/tests/test_files/cms_detector/cms_detector_results.txt
+++ b/tests/test_files/scrapers/scraper_results.txt
@@ -11,4 +11,4 @@ VBULLETIN
 JOOMLA!
 SITECORE
 SITECORE
-YIOOP!
\ No newline at end of file
+YIOOP
diff --git a/tests/test_files/scrapers/test.php b/tests/test_files/scrapers/test.php
new file mode 100644
index 000000000..aa8b681e1
--- /dev/null
+++ b/tests/test_files/scrapers/test.php
@@ -0,0 +1,7 @@
+<?php
+$dom = new \DOMDocument();
+$page = file_get_contents("Yioop01.txt");
+@$dom->loadHTML($page);
+$xpath_doc = new \DOMXpath($dom);
+$elements = $xpath_doc->query("/html/head/*[contains(@href, 'wp-content') or contains(@href, 'wp-includes')]");
+var_dump($elements);
diff --git a/tests/test_files/cms_detector/vBulletin01.txt b/tests/test_files/scrapers/vBulletin01.txt
similarity index 100%
rename from tests/test_files/cms_detector/vBulletin01.txt
rename to tests/test_files/scrapers/vBulletin01.txt
diff --git a/tests/test_files/cms_detector/vBulletin02.txt b/tests/test_files/scrapers/vBulletin02.txt
similarity index 100%
rename from tests/test_files/cms_detector/vBulletin02.txt
rename to tests/test_files/scrapers/vBulletin02.txt
ViewGit