Simplify chat bot architecture change, urls in licenses to https,a=chris

Chris Pollett [2018-05-07 07:May:th]
Simplify chat bot architecture change, urls in licenses to https,a=chris
Filename
index.php
src/advertise.php
src/blog.php
src/bot.php
src/configs/Config.php
src/configs/ConfigureTool.php
src/configs/Createdb.php
src/configs/ExportPublicHelpDb.php
src/configs/GroupWikiTool.php
src/configs/PublicHelpPages.php
src/configs/TokenTool.php
src/configs/default_crawl.ini
src/controllers/AdminController.php
src/controllers/ApiController.php
src/controllers/ArchiveController.php
src/controllers/ClassifierController.php
src/controllers/Controller.php
src/controllers/CrawlController.php
src/controllers/FetchController.php
src/controllers/GroupController.php
src/controllers/JobsController.php
src/controllers/MachineController.php
src/controllers/RegisterController.php
src/controllers/ResourceController.php
src/controllers/SearchController.php
src/controllers/SettingsController.php
src/controllers/StaticController.php
src/controllers/TestsController.php
src/controllers/components/AccountaccessComponent.php
src/controllers/components/AdvertisementComponent.php
src/controllers/components/ChatbotComponent.php
src/controllers/components/Component.php
src/controllers/components/CrawlComponent.php
src/controllers/components/SocialComponent.php
src/controllers/components/SystemComponent.php
src/css/editor.css
src/css/search.css
src/data/default.db
src/error.php
src/examples/QueryCacher.php
src/examples/SearchApi.php
src/examples/StockBot.php
src/examples/WeatherBot.php
src/executables/ArcTool.php
src/executables/ClassifierTool.php
src/executables/ClassifierTrainer.php
src/executables/CodeTool.php
src/executables/Fetcher.php
src/executables/MediaUpdater.php
src/executables/Mirror.php
src/executables/QueryTool.php
src/executables/QueueServer.php
src/index.php
src/library/AnalyticsManager.php
src/library/BTree.php
src/library/BloomFilterBundle.php
src/library/BloomFilterFile.php
src/library/BrowserRunner.php
src/library/Bzip2BlockIterator.php
src/library/CrawlConstants.php
src/library/CrawlDaemon.php
src/library/FetchGitRepositoryUrls.php
src/library/FetchUrl.php
src/library/FileCache.php
src/library/HashTable.php
src/library/IndexArchiveBundle.php
src/library/IndexDictionary.php
src/library/IndexManager.php
src/library/IndexShard.php
src/library/JavascriptUnitTest.php
src/library/Join.php
src/library/LocaleFunctions.php
src/library/MailServer.php
src/library/MediaConstants.php
src/library/NWordGrams.php
src/library/Notifier.php
src/library/PageRuleParser.php
src/library/PartialZipArchive.php
src/library/PersistentStructure.php
src/library/PhraseParser.php
src/library/PriorityQueue.php
src/library/ScraperManager.php
src/library/StringArray.php
src/library/SuffixTree.php
src/library/Thesaurus.php
src/library/Trie.php
src/library/UnitTest.php
src/library/UpgradeFunctions.php
src/library/UrlParser.php
src/library/Utility.php
src/library/VersionFunctions.php
src/library/VersionManager.php
src/library/WebArchive.php
src/library/WebArchiveBundle.php
src/library/WebQueueBundle.php
src/library/WebSite.php
src/library/WikiParser.php
src/library/archive_bundle_iterators/ArcArchiveBundleIterator.php
src/library/archive_bundle_iterators/ArchiveBundleIterator.php
src/library/archive_bundle_iterators/DatabaseBundleIterator.php
src/library/archive_bundle_iterators/MediaWikiArchiveBundleIterator.php
src/library/archive_bundle_iterators/MixArchiveBundleIterator.php
src/library/archive_bundle_iterators/OdpRdfArchiveBundleIterator.php
src/library/archive_bundle_iterators/TextArchiveBundleIterator.php
src/library/archive_bundle_iterators/WarcArchiveBundleIterator.php
src/library/archive_bundle_iterators/WebArchiveBundleIterator.php
src/library/classifiers/BinaryFeatures.php
src/library/classifiers/ChiSquaredFeatureSelection.php
src/library/classifiers/Classifier.php
src/library/classifiers/ClassifierAlgorithm.php
src/library/classifiers/FeatureSelection.php
src/library/classifiers/Features.php
src/library/classifiers/LassoRegression.php
src/library/classifiers/NaiveBayes.php
src/library/classifiers/SparseMatrix.php
src/library/classifiers/WeightedFeatures.php
src/library/compressors/Compressor.php
src/library/compressors/GzipCompressor.php
src/library/compressors/NonCompressor.php
src/library/index_bundle_iterators/DisjointIterator.php
src/library/index_bundle_iterators/DocIterator.php
src/library/index_bundle_iterators/GroupIterator.php
src/library/index_bundle_iterators/IndexBundleIterator.php
src/library/index_bundle_iterators/IntersectIterator.php
src/library/index_bundle_iterators/NegationIterator.php
src/library/index_bundle_iterators/NetworkIterator.php
src/library/index_bundle_iterators/UnionIterator.php
src/library/index_bundle_iterators/WordIterator.php
src/library/indexing_plugins/AddressesPlugin.php
src/library/indexing_plugins/IndexingPlugin.php
src/library/indexing_plugins/RecipePlugin.php
src/library/indexing_plugins/WordfilterPlugin.php
src/library/media_jobs/AnalyticsJob.php
src/library/media_jobs/BulkEmailJob.php
src/library/media_jobs/FeedsUpdateJob.php
src/library/media_jobs/MediaJob.php
src/library/media_jobs/RecommendationJob.php
src/library/media_jobs/VideoConvertJob.php
src/library/processors/BmpProcessor.php
src/library/processors/DocProcessor.php
src/library/processors/DocxProcessor.php
src/library/processors/EpubProcessor.php
src/library/processors/GifProcessor.php
src/library/processors/GitXmlProcessor.php
src/library/processors/GopherProcessor.php
src/library/processors/HtmlProcessor.php
src/library/processors/ImageProcessor.php
src/library/processors/JavaProcessor.php
src/library/processors/JpgProcessor.php
src/library/processors/PageProcessor.php
src/library/processors/PdfProcessor.php
src/library/processors/PngProcessor.php
src/library/processors/PptProcessor.php
src/library/processors/PptxProcessor.php
src/library/processors/PythonProcessor.php
src/library/processors/RobotProcessor.php
src/library/processors/RssProcessor.php
src/library/processors/RtfProcessor.php
src/library/processors/SitemapProcessor.php
src/library/processors/SvgProcessor.php
src/library/processors/TextProcessor.php
src/library/processors/XlsxProcessor.php
src/library/processors/XmlProcessor.php
src/library/summarizers/CentroidSummarizer.php
src/library/summarizers/CentroidWeightedSummarizer.php
src/library/summarizers/GraphBasedSummarizer.php
src/library/summarizers/ScrapeSummarizer.php
src/library/summarizers/Summarizer.php
src/locale/ar/configure.ini
src/locale/ar/resources/Tokenizer.php
src/locale/ar/resources/locale.js
src/locale/bn/configure.ini
src/locale/bn/resources/Tokenizer.php
src/locale/bn/resources/locale.js
src/locale/de/configure.ini
src/locale/de/resources/Tokenizer.php
src/locale/de/resources/locale.js
src/locale/en_US/configure.ini
src/locale/en_US/resources/Tokenizer.php
src/locale/en_US/resources/locale.js
src/locale/es/configure.ini
src/locale/es/resources/Tokenizer.php
src/locale/es/resources/locale.js
src/locale/fa/configure.ini
src/locale/fa/resources/Tokenizer.php
src/locale/fa/resources/locale.js
src/locale/fa/statistics.txt
src/locale/fr_FR/configure.ini
src/locale/fr_FR/resources/Tokenizer.php
src/locale/fr_FR/resources/locale.js
src/locale/general.ini
src/locale/he/configure.ini
src/locale/he/resources/Tokenizer.php
src/locale/he/resources/locale.js
src/locale/hi/configure.ini
src/locale/hi/resources/Tokenizer.php
src/locale/hi/resources/locale.js
src/locale/in_ID/configure.ini
src/locale/in_ID/resources/Tokenizer.php
src/locale/in_ID/resources/locale.js
src/locale/it/configure.ini
src/locale/it/resources/Tokenizer.php
src/locale/it/resources/locale.js
src/locale/ja/configure.ini
src/locale/ja/resources/Tokenizer.php
src/locale/ja/resources/locale.js
src/locale/kn/configure.ini
src/locale/kn/resources/Tokenizer.php
src/locale/kn/resources/locale.js
src/locale/ko/configure.ini
src/locale/ko/resources/Tokenizer.php
src/locale/ko/resources/locale.js
src/locale/nl/configure.ini
src/locale/nl/resources/Tokenizer.php
src/locale/nl/resources/locale.js
src/locale/nl/statistics.txt
src/locale/pl/configure.ini
src/locale/pl/resources/Tokenizer.php
src/locale/pl/resources/locale.js
src/locale/pt/configure.ini
src/locale/pt/resources/Tokenizer.php
src/locale/pt/resources/locale.js
src/locale/ru/configure.ini
src/locale/ru/resources/Tokenizer.php
src/locale/ru/resources/locale.js
src/locale/te/configure.ini
src/locale/te/resources/Tokenizer.php
src/locale/te/resources/locale.js
src/locale/te/statistics.txt
src/locale/th/configure.ini
src/locale/th/resources/Tokenizer.php
src/locale/th/resources/locale.js
src/locale/tr/configure.ini
src/locale/tr/resources/Tokenizer.php
src/locale/tr/resources/locale.js
src/locale/vi_VN/configure.ini
src/locale/vi_VN/resources/Tokenizer.php
src/locale/vi_VN/resources/locale.js
src/locale/zh_CN/configure.ini
src/locale/zh_CN/resources/Tokenizer.php
src/locale/zh_CN/resources/locale.js
src/models/ActivityModel.php
src/models/AdvertisementModel.php
src/models/BotModel.php
src/models/CaptchaModel.php
src/models/CrawlModel.php
src/models/CreditModel.php
src/models/CronModel.php
src/models/EntityModel.php
src/models/GroupModel.php
src/models/ImpressionModel.php
src/models/LocaleModel.php
src/models/MachineModel.php
src/models/Model.php
src/models/ParallelModel.php
src/models/PhraseModel.php
src/models/ProfileModel.php
src/models/RoleModel.php
src/models/ScraperModel.php
src/models/SearchfiltersModel.php
src/models/SigninModel.php
src/models/SourceModel.php
src/models/UserModel.php
src/models/VisitorModel.php
src/models/datasources/DatasourceManager.php
src/models/datasources/MysqlManager.php
src/models/datasources/PdoManager.php
src/models/datasources/Sqlite3Manager.php
src/privacy.php
src/scripts/basic.js
src/scripts/big_int.js
src/scripts/chart.js
src/scripts/classifiers.js
src/scripts/hash_captcha.js
src/scripts/help.js
src/scripts/history.js
src/scripts/mix.js
src/scripts/register_validator.js
src/scripts/sha1.js
src/scripts/spreadsheet.js
src/scripts/suggest.js
src/scripts/wiki.js
src/scripts/zkp.js
src/terms.php
src/views/AdminView.php
src/views/ApiView.php
src/views/CrawlstatusView.php
src/views/FeedstatusView.php
src/views/FetchView.php
src/views/GroupView.php
src/views/MachinestatusView.php
src/views/NocacheView.php
src/views/RecoverView.php
src/views/RegisterView.php
src/views/ResendEmailView.php
src/views/RssView.php
src/views/SearchView.php
src/views/SettingsView.php
src/views/SigninView.php
src/views/StaticView.php
src/views/SuggestView.php
src/views/TestsView.php
src/views/View.php
src/views/WikiView.php
src/views/elements/ActivityElement.php
src/views/elements/ApiElement.php
src/views/elements/AppearanceElement.php
src/views/elements/BotstoryElement.php
src/views/elements/ConfigureElement.php
src/views/elements/CrawloptionsElement.php
src/views/elements/DisplayadvertisementElement.php
src/views/elements/EditclassifierElement.php
src/views/elements/EditlocalesElement.php
src/views/elements/EditmixElement.php
src/views/elements/Element.php
src/views/elements/FooterElement.php
src/views/elements/GroupfeedElement.php
src/views/elements/HelpElement.php
src/views/elements/LanguageElement.php
src/views/elements/MachinelogElement.php
src/views/elements/ManageaccountElement.php
src/views/elements/ManageadvertisementsElement.php
src/views/elements/ManageclassifiersElement.php
src/views/elements/ManagecrawlsElement.php
src/views/elements/ManagecreditsElement.php
src/views/elements/ManagegroupsElement.php
src/views/elements/ManagelocalesElement.php
src/views/elements/ManagemachinesElement.php
src/views/elements/ManagerolesElement.php
src/views/elements/ManageusersElement.php
src/views/elements/MixcrawlsElement.php
src/views/elements/MoreoptionsElement.php
src/views/elements/PageoptionsElement.php
src/views/elements/QuerystatsElement.php
src/views/elements/ResultseditorElement.php
src/views/elements/ScrapersElement.php
src/views/elements/SearchsourcesElement.php
src/views/elements/SecurityElement.php
src/views/elements/ServersettingsElement.php
src/views/elements/SigninElement.php
src/views/elements/StatisticsElement.php
src/views/elements/SubsearchElement.php
src/views/elements/WikiElement.php
src/views/helpers/DisplayresultsHelper.php
src/views/helpers/FeedsHelper.php
src/views/helpers/FiletypeHelper.php
src/views/helpers/FileuploadHelper.php
src/views/helpers/HelpbuttonHelper.php
src/views/helpers/Helper.php
src/views/helpers/ImagesHelper.php
src/views/helpers/OptionsHelper.php
src/views/helpers/PaginationHelper.php
src/views/helpers/PagingtableHelper.php
src/views/helpers/SearchformHelper.php
src/views/helpers/ToggleHelper.php
src/views/helpers/VideourlHelper.php
src/views/layouts/ApiLayout.php
src/views/layouts/Layout.php
src/views/layouts/RssLayout.php
src/views/layouts/WebLayout.php
tests/BloomFilterFileTest.php
tests/BtreeTest.php
tests/DeTokenizerTest.php
tests/DocxProcessorTest.php
tests/EnTokenizerTest.php
tests/EpubProcessorTest.php
tests/EsTokenizerTest.php
tests/FaTokenizerTest.php
tests/FrTokenizerTest.php
tests/HashTableTest.php
tests/HiTokenizerTest.php
tests/IndexShardTest.php
tests/ItTokenizerTest.php
tests/ManyScrapersExperiment.php
tests/ManyUserExperiment.php
tests/NlTokenizerTest.php
tests/PdfProcessorTest.php
tests/PhantomjsUiTest.php
tests/PhraseParserTest.php
tests/PptxProcessorTest.php
tests/PriorityQueueTest.php
tests/PtTokenizerTest.php
tests/QueueServerTest.php
tests/RuTokenizerTest.php
tests/ScraperManagerTest.php
tests/Sha1JavascriptTest.php
tests/SocketExperiment.php
tests/StringArrayTest.php
tests/StringCatExperiment.php
tests/SummarizerTest.php
tests/TrieTest.php
tests/UrlParserTest.php
tests/UtilityTest.php
tests/VersionManagerTest.php
tests/WebArchiveTest.php
tests/WebQueueBundleTest.php
tests/XlsxProcessorTest.php
tests/mobile_ui_tests.js
tests/phantomjs_runner.js
tests/test_files/VocabSampler.php
tests/test_files/hindi_stemmer/input_vocabulary.txt
tests/test_files/hindi_stemmer/stemmed_result.txt
tests/web_ui_tests.js
work_directory/_placeholder.php
diff --git a/index.php b/index.php
index 42f488338..b2e4d4734 100644
--- a/index.php
+++ b/index.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/advertise.php b/src/advertise.php
index 8fb951b4c..038cea503 100644
--- a/src/advertise.php
+++ b/src/advertise.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * the SeekQuarry/Yioop Search engine
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/blog.php b/src/blog.php
index 4b6495ebb..c023b89a7 100755
--- a/src/blog.php
+++ b/src/blog.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * the SeekQuarry/Yioop Search engine
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/bot.php b/src/bot.php
index 41ca56ce9..0ec41647f 100644
--- a/src/bot.php
+++ b/src/bot.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * the SeekQuarry/Yioop Search engine
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/configs/Config.php b/src/configs/Config.php
index 8a5b80daa..62bdaed11 100755
--- a/src/configs/Config.php
+++ b/src/configs/Config.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -32,8 +32,8 @@
  * nsconddefine it should be fair game for tweaking in the LocalConfig.php
  * file
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -158,7 +158,7 @@ function nsconddefine($constant, $value)
  * Version number for upgrade function
  * @var int
  */
-nsdefine('YIOOP_VERSION', 55);
+nsdefine('YIOOP_VERSION', 56);
 /**
  * Minimum Version fo Yioop for which keyword ad script
  * still works with this version
@@ -1051,13 +1051,23 @@ nsdefine('NUM_FIELD_LEN', 4);
 nsdefine('WRITING_MODE_LEN', 5);
 /** Length of zero knowledge password string */
 nsdefine('ZKP_PASSWORD_LEN', 200);
+/*
+ * Adjustable CHAT BOT RELATED defines
+ */
+/** Maximum number of patterns that can be used in a chat bot */
+nsconddefine('MAX_BOT_PATTERNS', 50);
+/** Maximum number chat bots that will be listened to in a group.
+ * Beyond this number additional bots will be ignored. I.e., they
+ * won't get a chance to answer posts
+ */
+nsconddefine('GROUP_BOT_FOLLOWERS', 10);
 /*
  * Adjustable AD RELATED defines
  *
  /** Truncate length for ad description and keywords*/
 nsdefine('ADVERTISEMENT_TRUNCATE_LEN', 8);
 /** Initial bid amount for advertisement keyword */
-nsconddefine('AD_KEYWORD_INIT_BID',1);
+nsconddefine('AD_KEYWORD_INIT_BID', 1);
 /** Allows the root account to purchase free ad credits. Might
  *  mess up the value of credits if allow. This only makes a difference
  *  in the presence of an ad processing script
diff --git a/src/configs/ConfigureTool.php b/src/configs/ConfigureTool.php
index 2de394f3b..7e4f3e793 100644
--- a/src/configs/ConfigureTool.php
+++ b/src/configs/ConfigureTool.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * command-line for Yioop.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/configs/Createdb.php b/src/configs/Createdb.php
index 099abc9da..35f6763f5 100755
--- a/src/configs/Createdb.php
+++ b/src/configs/Createdb.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -27,8 +27,8 @@
  * minimal sqlite database so this script is not strictly needed.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -156,17 +156,18 @@ $sql = "INSERT INTO GROUPS VALUES(".PUBLIC_GROUP_ID.",'Public','".
     "', ".NON_VOTING_GROUP.", " . FOREVER . ", 0)";
 $db->execute($sql);
 $now = time();
-$db->execute("INSERT INTO ROLE VALUES (".ADMIN_ROLE.", 'Admin' )");
-$db->execute("INSERT INTO ROLE VALUES (".USER_ROLE.", 'User' )");
-$db->execute("INSERT INTO ROLE VALUES (".BUSINESS_ROLE.", 'Business User' )");
+$db->execute("INSERT INTO ROLE VALUES (" . ADMIN_ROLE . ", 'Admin' )");
+$db->execute("INSERT INTO ROLE VALUES (" . USER_ROLE . ", 'User' )");
+$db->execute("INSERT INTO ROLE VALUES (" . BUSINESS_ROLE . ", 'Business User' )");
 $db->execute("INSERT INTO ROLE VALUES (".BOT_ROLE.", 'Bot User' )");
-$db->execute("INSERT INTO USER_ROLE VALUES (".ROOT_ID.", ".ADMIN_ROLE.")");
-$db->execute("INSERT INTO USER_GROUP VALUES (".ROOT_ID.", ".
+$db->execute("INSERT INTO USER_ROLE VALUES (" . ROOT_ID . ", " . ADMIN_ROLE .
+    ")");
+$db->execute("INSERT INTO USER_GROUP VALUES (" . ROOT_ID . ", ".
     PUBLIC_GROUP_ID.", ".ACTIVE_STATUS.", $now)");
 $db->execute("INSERT INTO USER_GROUP VALUES (".PUBLIC_USER_ID.", ".
     PUBLIC_GROUP_ID.", ".ACTIVE_STATUS.", $now)");
 //Create a Group for Wiki HELP.
-$sql = "INSERT INTO GROUPS VALUES(" . HELP_GROUP_ID . ",'Help','" .
+$sql = "INSERT INTO GROUPS VALUES (" . HELP_GROUP_ID . ",'Help','" .
     $creation_time . "','" . ROOT_ID . "',
     '" . PUBLIC_BROWSE_REQUEST_JOIN . "', '" . GROUP_READ_WIKI .
     "', " . UP_DOWN_VOTING_GROUP . ", " . FOREVER . ", 0)";
@@ -248,43 +249,6 @@ foreach ($locales as $locale) {
     $locale_index[$locale[0]] = $i;
     $i++;
 }
-//Insert the lexicon for all locales in the database
-foreach ($locales as $locale) {
-    $folderName = $locale[0];
-    if (strstr($locale[0], "-")) {
-        $localeName = explode("-", $locale[0]);
-        $folderName = $localeName[0] . "_" . $localeName[1];
-    }
-    $lexicon_file = C\LOCALE_DIR . "/" . $folderName .
-        "/resources/lexicon.txt.gz";
-    if (file_exists($lexicon_file)) {
-        $lines = gzfile($lexicon_file);
-        $insert_values = "";
-        $count = 0;
-        foreach ($lines as $line) {
-            $line = trim($line, " ");
-            $line = explode(" ", $line);
-            $insert_values .= '(\'' . trim($line[0]) . '\',\'' . $locale[0] .
-                '\',\'' . trim($line[1]) . '\'),';
-            $count++;
-            if ($count >= C\NUM_LEX_BULK_INSERTS) {
-                $insert_values = rtrim($insert_values, ',');
-                $query = "INSERT INTO LEXICON (TERM, LOCALE, PART_OF_SPEECH)
-                 VALUES {$insert_values}";
-                $db->exec($query);
-                $insert_values = "";
-                $count = 0;
-            }
-        }
-
-        if ($count > 0) {
-            $insert_values = rtrim($insert_values, ',');
-            $query = "INSERT INTO LEXICON (TERM, LOCALE, PART_OF_SPEECH) VALUES
-                {$insert_values}";
-            $db->exec($query);
-        }
-    }
-}
 $activities = [
     "manageAccount" => ['db_activity_manage_account',
         [
@@ -445,11 +409,12 @@ foreach ($activities as $activity => $translation_info) {
         $db->execute("INSERT INTO ROLE_ACTIVITY VALUES (" .
             BUSINESS_ROLE . ", $i)");
     } else {
-        $db->execute("INSERT INTO ROLE_ACTIVITY VALUES (" .
-            ADMIN_ROLE . ", $i)");
         if ($activity == "botStory") {
             $db->execute("INSERT INTO ROLE_ACTIVITY VALUES (" .
                 BOT_ROLE . ", $i)");
+        } else {
+            $db->execute("INSERT INTO ROLE_ACTIVITY VALUES (" .
+                ADMIN_ROLE . ", $i)");
         }
     }
     $db->execute("INSERT INTO TRANSLATION
@@ -607,9 +572,11 @@ if (stristr(DB_HOST, "pgsql") !== false) {
     /* For postgres count initial values of SERIAL sequences
        will be screwed up unless do
      */
-    $auto_tables = ["ACTIVITY" =>"ACTIVITY_ID",
-        "GROUP_ITEM" =>"ID", "GROUP_PAGE" => "ID",
-        "GROUPS" => "GROUP_ID", "LOCALE"=> "LOCALE_ID", "ROLE" => "ROLE_ID",
+    $auto_tables = ["ACTIVITY" =>"ACTIVITY_ID", "ADVERTISEMENT" => "ID",
+        "CHAT_BOT_PATTERN" => "PATTERN_ID", "GROUP_ITEM" =>"ID",
+        "GROUP_PAGE" => "ID", "GROUPS" => "GROUP_ID", "LOCALE"=> "LOCALE_ID",
+        "PAGE_RELATIONSHIPS" => "ID", "QUERY_ITEM" => "ID",
+        "ROLE" => "ROLE_ID", "SCRAPER" => "ID",
         "TRANSLATION" => "TRANSLATION_ID", "USERS" => "USER_ID"];
     foreach ($auto_tables as $table => $auto_column) {
         $sql = "SELECT MAX($auto_column) AS NUM FROM $table";
diff --git a/src/configs/ExportPublicHelpDb.php b/src/configs/ExportPublicHelpDb.php
index e0fe1f2aa..c805e954c 100644
--- a/src/configs/ExportPublicHelpDb.php
+++ b/src/configs/ExportPublicHelpDb.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -27,8 +27,8 @@
  * used by createdb.php when creating a fresh version of the Yioop database.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -88,7 +88,7 @@ $out .= <<< EOD
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -97,8 +97,8 @@ $out .= <<< EOD
  * This file should be generated using ExportPublicHelpDb.php
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/configs/GroupWikiTool.php b/src/configs/GroupWikiTool.php
index 24d29f8ae..92120551c 100644
--- a/src/configs/GroupWikiTool.php
+++ b/src/configs/GroupWikiTool.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -30,8 +30,8 @@
  *
  * @author Ravi Dhillon  ravi.dhillon@yahoo.com, Chris Pollett (modified for n
  *     ngrams)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/configs/PublicHelpPages.php b/src/configs/PublicHelpPages.php
index fecf48311..4b672cc5b 100644
--- a/src/configs/PublicHelpPages.php
+++ b/src/configs/PublicHelpPages.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -27,8 +27,8 @@
  * This file should be generated using ExportPublicHelpDb.php
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -77,620 +77,620 @@ page_footer=

 sort=aname

-END_HEAD_VARS=Yioop Wiki Syntax=
-
-: Wiki syntax is a lightweight way to markup a text document so that
-it can be formatted and drawn nicely by Yioop.
-This page briefly describes the wiki syntax supported by Yioop.
-
-==Headings==
-: In wiki syntax headings of documents and sections are written as follows:
-
-&lt;nowiki&gt;
-=Level1=
-==Level2==
-===Level3===
-====Level4====
-=====Level5=====
-======Level6======
-&lt;/nowiki&gt;
-
-and would look like:
-
-=Level1=
-==Level2==
-===Level3===
-====Level4====
-=====Level5=====
-======Level6======
-
-==Paragraphs==
-: In Yioop two new lines indicates a new paragraph. You can control
-the indent of a paragraph by putting colons followed by a space in front of it:
-
-&lt;nowiki&gt;
-: some indent
-
-:: a little more
-
-::: even more
-
-:::: that&#039;s sorta crazy
-&lt;/nowiki&gt;
-
-which looks like:
-
-: some indent
-
-:: a little more
-
-::: even more
-
-:::: that&#039;s sorta crazy
-
-==Horizontal Rule==
-: Sometimes it is convenient to separate paragraphs or sections with a horizontal
-rule. This can be done by placing four hyphens on a line by themselves:
-&lt;nowiki&gt;
-----
-&lt;/nowiki&gt;
-This results in a line that looks like:
-----
-
-==Text Formatting Within Paragraphs==
-: Within a paragraph it is often convenient to make some text bold, italics,
-underlined, etc. Below is a quick summary of how to do this:
-===Wiki Markup===
-{|
-|&lt;nowiki&gt;&#039;&#039;italic&#039;&#039;&lt;/nowiki&gt;|&#039;&#039;italic&#039;&#039;
-|-
-|&lt;nowiki&gt;&#039;&#039;&#039;bold&#039;&#039;&#039;&lt;/nowiki&gt;|&#039;&#039;&#039;bold&#039;&#039;&#039;
-|-
-|&lt;nowiki&gt;&#039;&#039;&#039;&#039;&#039;bold and italic&#039;&#039;&#039;&#039;&#039;&lt;/nowiki&gt;|&#039;&#039;&#039;&#039;&#039;bold and italic&#039;&#039;&#039;&#039;&#039;
-|}
-
-===HTML Tags===
-: Yioop also supports several html tags such as:
-{|
-|&lt;nowiki&gt;&lt;del&gt;delete&lt;/del&gt;&lt;/nowiki&gt;|&lt;del&gt;delete&lt;/del&gt;
-|-
-|&lt;nowiki&gt;&lt;ins&gt;insert&lt;/ins&gt;&lt;/nowiki&gt;|&lt;ins&gt;insert&lt;/ins&gt;
-|-
-|&lt;nowiki&gt;&lt;s&gt;strike through&lt;/s&gt; or
-&lt;strike&gt;strike through&lt;/strike&gt; &lt;/nowiki&gt;|&lt;s&gt;strike through&lt;/s&gt;
-|-
-|&lt;nowiki&gt;&lt;sup&gt;superscript&lt;/sup&gt; and
-&lt;sub&gt;subscript&lt;/sub&gt;&lt;/nowiki&gt;|&lt;sup&gt;superscript&lt;/sup&gt; and
-&lt;sub&gt;subscript&lt;/sub&gt;
-|-
-|&lt;nowiki&gt;&lt;tt&gt;typewriter&lt;/tt&gt;&lt;/nowiki&gt;|&lt;tt&gt;typewriter&lt;/tt&gt;
-|-
-|&lt;nowiki&gt;&lt;u&gt;underline&lt;/u&gt;&lt;/nowiki&gt;|&lt;u&gt;underline&lt;/u&gt;
-|}
-
-===Spacing within Paragraphs===
-: The HTML entity
-&lt;nowiki&gt;&amp;nbsp;&lt;/nowiki&gt;
-can be used to create a non-breaking space. The tag
-&lt;nowiki&gt;&lt;br&gt;&lt;/nowiki&gt;
-can be used to produce a line break.
-
-==Preformatted Text and Unformatted Text==
-: You can force text to be formatted as you typed it rather
-than using the layout mechanism of the browser using the
-&lt;nowiki&gt;&lt;pre&gt;preformatted text tag.&lt;/pre&gt;&lt;/nowiki&gt;
-Alternatively, a sequence of lines all beginning with a
-space character will also be treated as preformatted.
-
-: Wiki markup within pre tags is still parsed by Yioop.
-If you would like to add text that is not parsed, enclosed
-it in &lt;tt&gt;&lt;`mbox{nowiki}`&gt; &lt;/`mbox{nowiki}`&gt;&lt;/tt&gt; tags.
-
-==Styling Text Paragraphs==
-: Yioop wiki syntax offers a number of templates for
-control the styles, and alignment of text for
-a paragraph or group of paragraphs:&lt;br /&gt;
-`{{`left| some text`}}`,&lt;br /&gt; `{{`right| some text`}}`,&lt;br /&gt;
-and&lt;br /&gt;
-`{{`center| some text`}}`&lt;br /&gt; can be used to left-justify,
-right-justify, and center a block of text. For example,
-the last command, would produce:
-{{center|
-some text
-}}
-If you know cascading style sheets (CSS), you can set
-a class or id selector for a block of text using:&lt;br /&gt;
-`{{`class=&quot;my-class-selector&quot; some text`}}`&lt;br /&gt;and&lt;br /&gt;
-`{{`id=&quot;my-id-selector&quot; some text`}}`.&lt;br /&gt;
-You can also apply inline styles to a block of text
-using the syntax:&lt;br /&gt;
-`{{`style=&quot;inline styles&quot; some text`}}`.&lt;br /&gt;
-For example, `{{`style=&quot;color:red&quot; some text`}}` looks
-like {{style=&quot;color:red&quot; some text}}.
-
-==Lists==
-: The Yioop Wiki Syntax supported of ways of listing items:
-bulleted/unordered list, numbered/ordered lists, and
-definition lists. Below are some examples:
-
-===Unordered Lists===
-&lt;nowiki&gt;
-* Item1
-** SubItem1
-** SubItem2
-*** SubSubItem1
-* Item 2
-* Item 3
-&lt;/nowiki&gt;
-would be drawn as:
-* Item1
-** SubItem1
-** SubItem2
-*** SubSubItem1
-* Item 2
-* Item 3
-
-===Ordered Lists===
-&lt;nowiki&gt;
-# Item1
-## SubItem1
-## SubItem2
-### SubSubItem1
-# Item 2
-# Item 3
-&lt;/nowiki&gt;
-# Item1
-## SubItem1
-## SubItem2
-### SubSubItem1
-# Item 2
-# Item 3
-
-===Mixed Lists===
-&lt;nowiki&gt;
-# Item1
-#* SubItem1
-#* SubItem2
-#*# SubSubItem1
-# Item 2
-# Item 3
-&lt;/nowiki&gt;
-# Item1
-#* SubItem1
-#* SubItem2
-#*# SubSubItem1
-# Item 2
-# Item 3
-
-===Definition Lists===
-&lt;nowiki&gt;
-;Term 1: Definition of Term 1
-;Term 2: Definition of Term 2
-&lt;/nowiki&gt;
-;Term 1: Definition of Term 1
-;Term 2: Definition of Term 2
-
-==Tables==
-: A table begins with {`|`  and ends with `|`}. Cells are separated with | and
-rows are separated with |- as can be seen in the following
-example:
-&lt;nowiki&gt;
-{|
-|a||b
-|-
-|c||d
-|}
-&lt;/nowiki&gt;
-{|
-|a||b
-|-
-|c||d
-|}
-Headings for columns and rows can be made by using an exclamation point, !,
-rather than a vertical bar |. For example,
-&lt;nowiki&gt;
-{|
-!a!!b
-|-
-|c||d
-|}
-&lt;/nowiki&gt;
-{|
-!a!!b
-|-
-|c||d
-|}
-Captions can be added using the + symbol:
-&lt;nowiki&gt;
-{|
-|+ My Caption
-!a!!b
-|-
-|c||d
-|}
-&lt;/nowiki&gt;
-{|
-|+ My Caption
-!a!!b
-|-
-|c||d
-|}
-Finally, you can put a CSS class or style attributes (or both) on the first line
-of the table to further control how it looks:
-&lt;nowiki&gt;
-{| class=&quot;wikitable&quot;
-|+ My Caption
-!a!!b
-|-
-|c||d
-|}
-&lt;/nowiki&gt;
-{| class=&quot;wikitable&quot;
-|+ My Caption
-!a!!b
-|-
-|c||d
-|}
-Within a cell attributes like align, valign, styles, and class can be used. For
-example,
-&lt;nowiki&gt;
-{|
-| style=&quot;text-align:right;&quot;| a| b
-|-
-| lalala | lalala
-|}
-&lt;/nowiki&gt;
-{|
-| style=&quot;text-align:right;&quot;| a| b
-|-
-| lalala | lalala
-|}
-
-==Math==
-
-: Math can be included into a wiki document by either using the math tag:
-&lt;nowiki&gt;
-&lt;math&gt;
-\sum_{i=1}^{n} i = frac{(n+1)(n)}{2}
-&lt;/math&gt;
-&lt;/nowiki&gt;
-
-&lt;math&gt;
-\sum_{i=1}^{n} i = frac{(n+1)(n)}{2}
-&lt;/math&gt;
-
-or by enclosing the math in backticks:
-
-&lt;pre&gt;
-`[[1, -2],[3,4]]`
-&lt;/pre&gt;
-
-`[[1, -2],[3,4]]`.
-
-Rendering of math is done using [[https://www.mathjax.org/|MathJax]], making us of the [[https://en.wikipedia.org/wiki/ASCIIMathML|ASCIImathml]] extensions.
-
-==Links and Relationships==
-: A hypertext link to another document can be inserted into a wiki page using
-the chain link icon in the GUI. Alternatively, there are several techniques
-for inserting a link into a page depending on whether the link is to a page
-within the same wiki group, is a link to a page on a different wiki
-group, or is a link to a different website. In addition to normal
-hypertext links, Yioop also supports relationship links.
-
-&#039;&#039;&#039;Intra-Group Wiki Links&#039;&#039;&#039; use the syntax:
-&lt;nowiki&gt;
-[[name_of_wiki_page]]
-or
-[[name_of_wiki_page|text for the link]]
-or
-[[name_of_wiki_page#heading_or_id_on_page|text for the link]]
-&lt;/nowiki&gt;
-for example, to make a link to this Syntax page one could write,
-&lt;nowiki&gt;
-[[Syntax|Yioop Wiki Syntax Page]]
-&lt;/nowiki&gt;
-which would look like,
-
-[[Syntax|Yioop Wiki Syntax Page]]
-
-&#039;&#039;&#039;Inter-Group Wiki Links&#039;&#039;&#039; use the syntax:
-&lt;nowiki&gt;
-[[name_of-group@name_of_wiki_page|text for the link]]
-&lt;/nowiki&gt;
-
-&#039;&#039;&#039;Different Website Links&#039;&#039;&#039; use the syntax:
-&lt;nowiki&gt;
-[[website_url|text for the link]]
-&lt;/nowiki&gt;
-
-: Relationships are a generalized form of link. They are used to express
-a more complicated linking between two wiki pages and have the syntax:
-
-&lt;nowiki&gt;
-[[relationship_type|wiki_page_name|text for the link]]
-&lt;/nowiki&gt;
-
-: In the navigation dropdown for a Yioop wiki page there are items for
-what links to the current page and what relates to the current page
-based on the links and relationships a page belongs to.
-
-==Recent Places Dropdowns==
-: You can add a dropdown that can allow users to navigate to recently visited
-wiki pages using the syntax:
-
-&lt;sub&gt;`[`{recent_places}]&lt;/sub&gt;
-
-This looks like:
-
-[{recent_places}]
-
-==Adding Resources to a Page==
-
-: Yioop wiki syntax supports adding search bars, audio, images, and video to a
-page. The magnifying class edit tool icon can be used to add a search bar via
-the GUI. This can also be added by hand with the syntax:
-&lt;nowiki&gt;
-{{search:default|size:small|placeholder:Search Placeholder Text}}
-&lt;/nowiki&gt;
-This syntax is split into three parts each separated by a vertical bar |. The
-first part search:default means results from searches should come from the
-default search index. You can replace default with the timestamp of a specific
-index or mix if you do not want to use the default. The second group size:small
-indicates the size of the search bar to be drawn. Choices of size are small,
-medium, and large. Finally, placeholder:Search Placeholder Text indicates the
-grayed out background text in the search input before typing is done should
-read: Search Placeholder Text. Here is what the above code outputs:
-
-{{search:default|size:small|placeholder:Search Placeholder Text}}
-
-: Image, video and other media resources can be associated with a page by dragging
-and dropping them in the edit textarea or by clicking on the link click to select
-link in the gray box below the textarea. This would add wiki code such as
-
-&lt;sub&gt;((resource`:`myphoto.jpg|Resource Description))&lt;/sub&gt;
-
-to the page. Only saving the page will save this code and upload the resource to
-the server. In the above &#039;&#039;myphoto.jpg&#039;&#039; is the resource that will be inserted and
-Resource Description is the alternative text to use in case the viewing browser
-cannot display jpg files. To add a resource
-from a different wiki page belonging to the same group to the current wiki
-page one can use a syntax like:
-
-&lt;sub&gt;((resource`:`Documentation:ConfigureScreenForm1.png|The work directory form))&lt;/sub&gt;
-
-Here Documentation would be the page and ConfigureScreenForm1.png the resource.
-You can also insert resources from a data-string using &#039;&#039;resource-data&#039;&#039; rather than
-&#039;&#039;resource&#039;&#039;. For example:
-
-&lt;sub&gt;((resource-data`:`image/jpeg;base64,/9j/4AAQSkZJRg...rest of image data...|Seekquarry Logo))&lt;/sub&gt;
-
-could be used to inline an image like:
-
-((resource-data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAtqADAAQAAAABAAAAewAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgAewC2AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAGhoaGhoaLRoaLUAtLS1AV0BAQEBXbVdXV1dXbYRtbW1tbW2EhISEhISEhJ6enp6enri4uLi4z8/Pz8/Pz8/Pz//bAEMBICIiNTE1WjExWtiTeJPY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/dAAQADP/aAAwDAQACEQMRAD8A0dS1L7GBHGAZGGeegFZCQavejzSzAHpubaPyFRX5H9rHz/ublznpt4rsRgjI6UAcqbDV4BvRycf3XJ/Q1Z0/VneQW1394nAbpz6GuirA1HS5ri58622jI5yccjvwKAN+imrnaN3XHNRz3ENunmTMFH8/pQBNRWC2vW4OFjYj3IH9at2uq2tywQEox6Bu/wBD0oA06KKY7pGheQhVHUmgB9FYcmu2qnEasw9eAP1qSDWrSVtr5j9zjH5igDYrn9cuJ4DF5Llc7s4Ppit/rzXNeIesP0b+lAG7Zsz2kTuckopJ/CrNVLD/AI8of+ua/wAqbd30FmB5uST0C8n60AXaKrW1yLqPzUVlU9N3Gas0AFFFFABRRRQAUUUUAf/Q0dS00XoEkZ2yKMc9DWGG1XT/AJfnCj23L/X+ldNFfWk8vkxPubGeAf51coA5aHX5h/ro1b3U4/xrZtNStrs7UO1/7rdfw9ammsrW4/1sak+uOfzrl9SsPsMiSQk7WPGeoI5//VQB2VcXdytqF/syQgJA9gOv511NrMbizSY9WXn61xdlb3E8xW2IDBc9ccU15id7aG/GtvEu2NQBWdf28OwzxAKR1A6EVI1jqSffdVz6sB/SlbTNUdSrEEH3H+FaOUWrWMlCad7mzpV01zagucsh2k+vofyrG1i5kmuhaIflUgf8CPf8K1NJs7izWRZgAGwRg56VzsiTzam6RffMjYz/AJ9KyNma0EVvbrhQCe5PU1BeW8MyF0AVxyCO/saZLa6jCu6aRUHTJYD+lSCw1YjIYEH3H+Fa88drGPJLe5b0K6aSJrdjnZgr9D2/CoPEPWH6N/SpdL025tLkyygbSpHBz3FReIesP/Av6VkbF37dHZabCTy5jXav4dfpVGxsZL6T7beZKnkA/wAX/wBb/P1zlsLua0N22SFA2g9So9PYVv6Pe/aIfIkPzxjj3X1oA2AABgUtFFABRRRQAUUUUAFFFFAH/9GpdCXTNR81BkZLL6EHqP8APtXS22oWtyoKOA3908Gpp7eG5Ty5l3D+X0rDl0BScwy4Howz/hQBvvNEi7ndQB3JrltVvkvHSC2+YKevqTxgVMNAkzzKo+i//XrWtNMtrQ7wN7/3m7fT0oAsWkJt7WOA9VXB+veuXRjpepncPkyf++W/z+ldjVS7soLxAsw5HQjqKAMfVbea9aOe1HmpjHGKmur1tPs47cMDPtA9cep/wqH+w5UJ8mfAPsR/I1Lb6HEj77h/M5zgDA/HuaAL2mzXNxb+dcY+Y/LgY49awtSSWz1EXSDhiHH1HUV1gAAwOAKingiuI/LmXI/l9KAMK/jbVEinsiH25BGQCCcetXPPXTNPRJSDIFwFz1P+Aqo2hMj7reYj6jn8wRSx6EC++4lLfQcn8Tk0AWNKury63PPjYvAOMZNUvEPWH6N/SuiiijhQRxAKo6AVSv8AT1vihZyuzPQZ60ATWP8Ax4w/9c1/lXN3sEmmXizwcITlfT3H+e30rqoIhDCkIOdihc/So7u1ju4TDJ9QfQ+tADredLmFZo+jDp6e1T1nWNgbHcFkLK3YjHNaNABRRRQAUUUUAFFFFAH/0unooooAKjkljhTfKwVR3NNuJ0t4Wmk6KM//AFq5HF1q9wWJwF/JR7UAbkmt2afc3v8AQf44pY9asn+9uT/eH+FRRaXZxj5l3n1akl0q0kHyDyz6r/hSuVym0jpIoeMhgehFPri45bnSbnY3KnkgdGH+NdhHIksayxnKsMimSSUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//T6eiiigDntflKxxwj+Ilj+HT9TU2mRCKzQ93+Y/jVLxDnfH/un+YrUs/+PSL/AHB/Kky4lmimSSJEhkkOFHU1yt3qE9zMFhJVc4UA4P4+9IpuxsavCJLXzMcxnP4Hg1JoUpa1aI/wNx9Dz/Oi63jTG845fZz9areHw2Z27fL/AFpoiR0tFU7q+t7PHnE5PQDk1PDNHcRiWI5U0ySlqN+LKIbRl2+6D0+prIjj1i/QS+YUVjkZO3I9gOf1rbudPtrtg8wOQMcEjipXurSH5XkRcdsigDnJoNXsUM3mMyjqQxOPwNbGl37XsbCTAdDzjuD0NR3GrWHlOoYvxjgHHPv0rP8AD5zJJ/uj+ZoA0dZuJba3R4WKkvg49MGstr29vY0gtNxIQFyOCT9ewq74g/49Y/8AroP5Gp9EjVbEOvV2JP4HH9KAIdKj1FJWW7LbQOjc5J9D7VQGrTwXM3msWC7gq9s54rrK421iEur4YZHmMfyJP86AHFNaY/aB5nqOQP8Ax3P9KtahcX1lLH+9JDKDjjkjqOneumrK1iDzbNnHWP5h9O/6UAaUciyxrInRgCPxpJZFhiaV+igk/hWTok/mWphJ5jOB9DyKTXJ/LthAOsh5/wB0cmgCHS5ry8kd5ZGCKOnuef0FbXkt/wA9GqrpcBgs0DD5n+Y/j/8AWrRoA//U6eiiigDE1yAyWwmUZMZ5+hqHSbhZLfyCfmj4/DtW+yhlKsMg8EVyl3ptzZS+fZ5Kjpjkj6juKBp2LWrQXMyoIRlRnIHr2NYtxp09rGsp5HfHatKPWmAxMgJ9QcfoaZPq7SqY4owN3HJz+gpFOxUl1F5rMWz8tkZJ7gVqWk6abpwkfmSU7lX26D8K5+a1nt0V5V27ugPXH0oZ5ruTdIST3Jo2Ek5OyCWSa7kaRzknk1q6JeeTN9nf7sn6N2/PpVZECLtWqcgMc25eM8j6/wD66iM7ux01cPyQUjf1e8maf7FAT2BxwST0FTwaFCqgzuS3cLwP8azr+OUtHqcY+WRVYn0YetaUevW2z96rBgOcYIrQ5C02nWFvE8nlg4UnLc9PrWXoH+tk/wBxf5mnzXV1qv8Ao9ohSM/eY9/xH9Kh0NvKu3hbqVI/FTQBe1//AI9o/wDroP5GrWkf8g6L8f5mquv/APHtH/10H8jVrSP+QdF+P8zQBp1yen/8hdv96T+ddZXJ6fj+12/3pP50AdZSEAgg9DS0UAcnYk2OqNbseCSn9Vpbn/T9XEI5VTtP0Xlv8Km1yJo5I7yPg9Cfccin6HEzGS7k5JO0fzP60AdDS0UUAf/V6eiiigAooooAhkt7eX/Wxq31ANUrqa002LcqKGP3VUAZP+FWbu6jtITNJ9APU+lcNNNNezl5Dlj+QHoPagaTbsglkmvZjJIck9+wH+FWkRUXatCIqLgU6ueUrnrUKCgrvcKp3DAyADtViWQRr79qfplk15cbnHyLyx9fb8aqnHqZYuqrciOssEKWUSOOQoyKkNpal95iTd67Rmp+nFLWx5ogAAwOKTauc4GadRQAhAPUZoAA4FLRQAU0KoOQBTqKACkyKWsvU7GS8VDEwVkz1z3+lAGfrV0HKWcJ3HOWA9ew/Otu0gFtbJCP4Rz9e9Zdho4tpBNOwZh0A6A+vvW7QAUUUUAf/9bp6KKKACiiigCnfWaXsPlMcEHII9a5W40a7g+ZBvHqOv5V21FAHnQlmjO1uo7HrTzctjhcGu4uLa3lX94it9RWcmn2W/8A1S1PKjZV5pWTOes7Ce+kz0Xuxrtbe3jtohFEMAVKqqg2qMD2p1UYthRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//9k=|The Seekquarry Logo))
-
-be aware though that the default maximum wiki page size is 512Kb (this can be set in src/configs/Config.php).
-
-: Sometimes it is useful to edit the basic resource link
-above to make a link which is a thumbnail of the resource which points to a
-separate page containing that resource. This can be done using the syntax:
-
-&lt;sub&gt;((resource-thumb`:`myphoto.jpg|Resource Description))&lt;/sub&gt;
-
-: Similarly, by default for resources like PDFs, epub&#039;s, etc., the resource tag inlines
-the whole resource into the page, if instead one wants a clickable link to a page where
-the resource is displayed one can use the syntax:
-
-&lt;sub&gt;((resource-link`:`my_document.pdf|Resource Description))&lt;/sub&gt;
-
-: Comma separated value files (.csv or CSV files) are inlined into a page as a table. Which rows and columns of the CSV to present in this table can be controlled by the resource line. The general format for including
-a CSV resource is:
-
-&lt;sub&gt; ((resource`:`resource_name.csv#config#top_left_cell#bottom_right_cell|Resource Description))&lt;/sub&gt;
-
-For example,
-
-&lt;sub&gt;((resource`:`resource_name.csv##B2#C3|Resource Description))&lt;/sub&gt;
-
-might output
-
-((resource-data:text/csv;base64,LCwsLAosLTIsMywsCiw1LDQsLAosLCwsCiwsLCwK##B2#C3|Example CSV with Headings))
-
-I.e., just the portion of the CSV given by the rectangle between the cells B2 and C3. Using a config directive we can omit the spreadsheet row and column headings as follows:
-
-&lt;sub&gt;((resource`:`resource_name.csv#noheadings#B2#C3|Resource Description)) &lt;/sub&gt;
-
-which might output
-
-
-((resource-data:text/csv;base64,LCwsLAosLTIsMywsCiw1LDQsLAosLCwsCiwsLCwK#noheadings#B2#C3|Example CSV without Headings))
-
-CSV spreadsheet files can also be used to output a variety of charts. The general format for the command to insert a chart resource is:
-
-&lt;sub&gt;((resource-chart_type`:`resource_name.csv#char_config#x_start#x_end#y_start#y_end|Resource Description))&lt;/sub&gt;
-
-Here &#039;&#039;chart_type&#039;&#039; can be one of &#039;&#039;bargraph&#039;&#039;,  &#039;&#039;linegraph&#039;&#039;, or &#039;&#039;pointgraph&#039;&#039;. For example, one might have a line like:
-
-&lt;sub&gt;((resource-bargraph`:`resource_name.csv##B1#B4#C1#C4|Quadratic Function)) &lt;/sub&gt;
-
-which could produce a chart like
-
-((resource-bargraph:##(1,1)#(2,4)#(3,9)#(4,16)|Quadratic Function))
-
-In the above example, the values for the `x` coordinates would come from the cells B1, B2, B3, B4 from
-&#039;&#039;resource_name.csv &#039;&#039; and the values for the `y` coordinates would come from cells C1, C2, C3, C4 from
-&#039;&#039;resource_name.csv &#039;&#039;. Alternatively, rather than use a CSV to get out data we can just list the points we want to plot with a command like:
-
-&lt;sub&gt;((resource-bargraph`:`##(1,1)#(2,4)#(3,9)#(4,16)|Quadratic Function))&lt;/sub&gt;
-
-==Manipulating Page Resources==
-
-: A list of media that have already been associated with
-a page appears under the Page Resource heading below the textarea. This
-table allows the user to rename and delete resources as well as insert the
-same resource at multiple locations within the same document.
-
-: The resources section of the edit page can be thought of as similar to
-a folder in Windows or MacOS. One can have subfolders of the resource folder.
-
-: The &#039;&#039;&#039;Places&#039;&#039;&#039; dropdown at the top of the &#039;&#039;&#039;Page Resource&#039;&#039;&#039; section allows one to navigate
-these folders.
-
-: The &#039;&#039;&#039;Filter&#039;&#039;&#039; textfield lets you enter a search string.
-Clicking &#039;&#039;&#039;Go&#039;&#039;&#039; then shows only those resources
-which contain that search string in their title.
-
-: The &#039;&#039;&#039;Clip Folder&#039;&#039;&#039; dropdown is used to copy files between folders and pages.
-Its current value is the folder that the &#039;&#039;&#039;Clip Copy&#039;&#039;&#039; buttons next to resources
-will copy their resource to when clicked. You can set the &#039;&#039;&#039;Clip Folder&#039;&#039;&#039; to
-the current folder using the dropdown, then  move to the page and folder that
-you would like to copy stuff from and click the &#039;&#039;&#039;Clip Copy&#039;&#039;&#039; button of the
-desired resource.
-
-: The &#039;&#039;&#039;Name&#039;&#039;&#039;, &#039;&#039;&#039;Size&#039;&#039;&#039;, &#039;&#039;&#039;Modified&#039;&#039;&#039; header links above the resources list
-control the sort order for the resource list. If a page is a media list page,
-then even in read mode, the sort order selected is remembered when drawing the
-media list.
-
-: The &#039;&#039;&#039;Actions&#039;&#039;&#039; drop can be used to create new folders, new text files, and new csv
-text files within the current page resource folder. These are initial named beginning
-with &#039;&#039;untitled&#039;&#039; followed by some number, and if applicable a file extension.
-
-: Resources entries for the resources list consist first of an icon, followed by a textfield
-with a name for the resource, followed by buttons for actions that can be done to that resource
-(Rename, Add to Page, Clip Copy), followed by a link [X], which can be used to delete the resource.
-If a resource is editable the icon will look like a plus sign together with a pencil. Clicking
-on the icon will then let you edit the resource.
-
-===Text and CSV Resources===
-: For normal text files clicking edit will bring up a textarea with the context of the text to edit.
-For CSV (comma separated value) files this will present the file as an editable spreadsheet.
-Yioop spreadsheets can have equation much like Excel spreadsheets. Clicking on a cell lets one
-edit its contents. For example, if in the cell A3
-one entered the equation:
- = A1+A2
-then clicking out of the cell would cause it to refresh with the value of the sum of the contents of
-cells A1 and A2. In addition, to the standard arithmetic operators [&#039;*&#039;, &#039;/&#039;, &#039;+&#039;, &#039;-&#039;, &#039;%&#039;], the
-spreadsheet expressions can use float or integer literals, and can make use of the following table
-of built-in functions:
-
-{| class=&quot;wikitable&quot;
-!Function Name!!Description
-|-
-!avg(x1,...,xn), avg(x1:xn)|| computes average of values of cells listed as arguments
-|-
-!ceil(x)|| rounds the value of x up to nearest integer
-|-
-!cell(i,j)|| returns the contents of the cell with column name of letter j, and row name i. For example, cell(2,&#039;B&#039;) would return the contents of cell B2.
-|-
-!col(value, search_row, start_col, end_col)|| searches the row &#039;&#039;search_row&#039;&#039; between the columns
-&#039;&#039;start_col&#039;&#039;, &#039;&#039;end_col&#039;&#039; for &#039;&#039;value&#039;&#039;. Returns the column name where this value was found or -1 if not found.
-For example, col(3, 2, &quot;B&quot;, &quot;D&quot;) might return C if the cell C2 had value 3.
-|-
-!exp(x)|| computes `e^x`
-|-
-!floor(x)|| rounds the value of x down to the nearest integer
-|-
-!log(x)|| computes `log x`
-|-
-!min(x1,...,xn), min(x1:xn)|| computes minimum value of cells listed as arguments
-|-
-!max(x1,...,xn), max(x1:xn)|| computes maximum value of cells listed as arguments
-|-
-!pow(x,y)|| computes `x^y`
-|-
-!row(value, search_col, start_row, end_row)|| searches the column &#039;&#039;search_col&#039;&#039;
-between the rows &#039;&#039;start_row&#039;&#039;, &#039;&#039;end_row&#039;&#039; for &#039;&#039;value&#039;&#039;.
-Returns the row name where this value was found or -1 if not found.
-For example, row(3, &quot;C&quot;, &quot;1&quot;, &quot;5&quot;) might return 2 if the cell C2 had value 3.
-|-
-!sqrt(x)|| computes `sqrt(x)`
-|-
-!sum(x1,...,xn), sum(x1:xn)|| computes sum of values of cells listed as arguments
-|-
-!username()|| returns username of the person using this CSV file
-|}
-
-===HTML, PDF and EPub Resources===
-: How HTML, PDF, EPub resources included on a page render depends on how the Yioop wiki software
-has been configured. If no special configuration has been done, then HTML and PDF documents
-will bbe rendered in an &lt;iframe&gt; tag within the current wiki page. In the EPub, case a link
-to download the resource will be given. If the wiki software detects the presence of the
-file APP_DIR/scripts/pdf.js ([[https://en.wikipedia.org/wiki/PDF.js|PDF.js]])
-or APP_DIR/scripts/epub.js ([[https://github.com/futurepress/epub.js|epub.js]]), the wiki
-system will render the resource in a Javascript viewer and will do things like remember reading
-position.
-
-
-===Video and Audio Resources===
-
-: Not all browsers support the same video and audio formats for playback. For this reason
-it sometimes is useful to have multiple video resources for the same video. For example,
-you might have a .ogv and .vp8 version of the same video recording. In read (non-edit)
-mode, the Yioop wiki system displays only one link for video or audio files that have
-the same name except for extension. It then includes the grouped file as separated &lt;source&gt;
-tags within either the &lt;video&gt; or &lt;audio&gt; html tag used to render the item in the browser.
-In this way, you can make your media take best advantages to whatever capabilities your
-client&#039;s browser has. If you don&#039;t feel like recoding your media in such a fancy way, a safe
-rule of thumb is that .mp3 audio will playback in all modern browser, and that .mp4 video
-will playback in all modern browser.
-
-: For video it is sometimes useful to add a subtitle or caption track. Yioop wiki supports
-[[https://en.wikipedia.org/wiki/WebVTT|WebVTT]] format subtitles and captions. To see how
-Yioop wiki makes use of these files, suppose you included a resource &#039;&#039;foo.mp4&#039;&#039; in your
-wiki pages, and you also had a file named &#039;&#039;foo-captions-en-US.vtt&#039;&#039; then when the HTML
-page is generated from your wiki page, a &lt;track&gt; tag for the caption file would be added
-to the &lt;video&gt; tag. A user seeing this page would then see in the video player a closed caption
-symbol and be able to turn on/off (defaults off) the English captions. If you wanted
-named the file &#039;&#039;foo-subtitles-en-US.vtt&#039;&#039; instead, then Yioop wiki would include it as a
-subtitles track (defaults on). You can add captions/subtitle files for as many languages as
-desired.
-
-: When viewing the page resources for a page in edit mode, one can see one file/resource and
-no grouping of resources by name is done. In this way you can keep track of exactly what
-resources are available for a page.
-
-==Page Settings, Page Type==
-
-: In edit mode for a wiki page, next to the page name, is a link [Settings].
-Clicking this link expands a form which can be used to control global settings
-for a wiki page.  This form contains a drop down for the page type, another
-drop down for the type of border for the page in non-logged in mode,
-a checkbox for whether a table of contents should be auto-generated from level 2
-and level three headings and then text
-fields or areas for the page title, author, meta robots, and page description.
-Beneath this one can specify another wiki page to be used as a header for this
-page and also specify another wiki page to be used as a footer for this page.
-
-: The contents of the page title is displayed in the browser title when the
-wiki page is accessed with the  Activity Panel collapsed or when not logged in.
-Similarly, in the collapsed or not logged in mode, if one looks as the HTML
-page source for the page,  in the head of document, &lt;meta&gt; tags for author,
-robots, and description are set according to these fields. These fields can
-be useful for search engine optimization. The robots meta tag can be
-used to control how search engine robots index the page. Wikipedia has more information on
-[[https://en.wikipedia.org/wiki/Meta_element|Meta Elements]].
-
-: The &#039;&#039;&#039;Standard&#039;&#039;&#039; page type treats the page as a usual wiki page.
-
-: &#039;&#039;&#039;Page Alias&#039;&#039;&#039; type redirects the current page to another page name. This can
-be used to handle things like different names for the same topic or to do localization
-of pages. For example, if you switch the locale from English to French and
-you were on the wiki page dental_floss when you switch to French the article
-dental_floss might redirect to the page dentrifice.
-
-: &#039;&#039;&#039;Media List&#039;&#039;&#039; type means that the page, when read, should display just the
-resources in the page as a list of thumbnails and links. These links for the
-resources go to a separate pages used to display these resources.
-This kind of page is useful for a gallery of
-images or a collection of audio or video files.
-
-: &#039;&#039;&#039;Presentation&#039;&#039;&#039; type is for a wiki page whose purpose is a slide presentation. In this mode,
-....
-on a line by itself is used to separate one slide. If presentation type is a selected a new
-slide icon appears in the wiki edit bar allowining one to easily add new slides.
-When the Activity panel is not collapsed and you are reading a presentation, it just
-displays as a single page with all slides visible. Collapsing the Activity panel presents
-the slides as a typical slide presentation using the
+END_HEAD_VARS=Yioop Wiki Syntax=
+
+: Wiki syntax is a lightweight way to markup a text document so that
+it can be formatted and drawn nicely by Yioop.
+This page briefly describes the wiki syntax supported by Yioop.
+
+==Headings==
+: In wiki syntax headings of documents and sections are written as follows:
+
+&lt;nowiki&gt;
+=Level1=
+==Level2==
+===Level3===
+====Level4====
+=====Level5=====
+======Level6======
+&lt;/nowiki&gt;
+
+and would look like:
+
+=Level1=
+==Level2==
+===Level3===
+====Level4====
+=====Level5=====
+======Level6======
+
+==Paragraphs==
+: In Yioop two new lines indicates a new paragraph. You can control
+the indent of a paragraph by putting colons followed by a space in front of it:
+
+&lt;nowiki&gt;
+: some indent
+
+:: a little more
+
+::: even more
+
+:::: that&#039;s sorta crazy
+&lt;/nowiki&gt;
+
+which looks like:
+
+: some indent
+
+:: a little more
+
+::: even more
+
+:::: that&#039;s sorta crazy
+
+==Horizontal Rule==
+: Sometimes it is convenient to separate paragraphs or sections with a horizontal
+rule. This can be done by placing four hyphens on a line by themselves:
+&lt;nowiki&gt;
+----
+&lt;/nowiki&gt;
+This results in a line that looks like:
+----
+
+==Text Formatting Within Paragraphs==
+: Within a paragraph it is often convenient to make some text bold, italics,
+underlined, etc. Below is a quick summary of how to do this:
+===Wiki Markup===
+{|
+|&lt;nowiki&gt;&#039;&#039;italic&#039;&#039;&lt;/nowiki&gt;|&#039;&#039;italic&#039;&#039;
+|-
+|&lt;nowiki&gt;&#039;&#039;&#039;bold&#039;&#039;&#039;&lt;/nowiki&gt;|&#039;&#039;&#039;bold&#039;&#039;&#039;
+|-
+|&lt;nowiki&gt;&#039;&#039;&#039;&#039;&#039;bold and italic&#039;&#039;&#039;&#039;&#039;&lt;/nowiki&gt;|&#039;&#039;&#039;&#039;&#039;bold and italic&#039;&#039;&#039;&#039;&#039;
+|}
+
+===HTML Tags===
+: Yioop also supports several html tags such as:
+{|
+|&lt;nowiki&gt;&lt;del&gt;delete&lt;/del&gt;&lt;/nowiki&gt;|&lt;del&gt;delete&lt;/del&gt;
+|-
+|&lt;nowiki&gt;&lt;ins&gt;insert&lt;/ins&gt;&lt;/nowiki&gt;|&lt;ins&gt;insert&lt;/ins&gt;
+|-
+|&lt;nowiki&gt;&lt;s&gt;strike through&lt;/s&gt; or
+&lt;strike&gt;strike through&lt;/strike&gt; &lt;/nowiki&gt;|&lt;s&gt;strike through&lt;/s&gt;
+|-
+|&lt;nowiki&gt;&lt;sup&gt;superscript&lt;/sup&gt; and
+&lt;sub&gt;subscript&lt;/sub&gt;&lt;/nowiki&gt;|&lt;sup&gt;superscript&lt;/sup&gt; and
+&lt;sub&gt;subscript&lt;/sub&gt;
+|-
+|&lt;nowiki&gt;&lt;tt&gt;typewriter&lt;/tt&gt;&lt;/nowiki&gt;|&lt;tt&gt;typewriter&lt;/tt&gt;
+|-
+|&lt;nowiki&gt;&lt;u&gt;underline&lt;/u&gt;&lt;/nowiki&gt;|&lt;u&gt;underline&lt;/u&gt;
+|}
+
+===Spacing within Paragraphs===
+: The HTML entity
+&lt;nowiki&gt;&amp;nbsp;&lt;/nowiki&gt;
+can be used to create a non-breaking space. The tag
+&lt;nowiki&gt;&lt;br&gt;&lt;/nowiki&gt;
+can be used to produce a line break.
+
+==Preformatted Text and Unformatted Text==
+: You can force text to be formatted as you typed it rather
+than using the layout mechanism of the browser using the
+&lt;nowiki&gt;&lt;pre&gt;preformatted text tag.&lt;/pre&gt;&lt;/nowiki&gt;
+Alternatively, a sequence of lines all beginning with a
+space character will also be treated as preformatted.
+
+: Wiki markup within pre tags is still parsed by Yioop.
+If you would like to add text that is not parsed, enclosed
+it in &lt;tt&gt;&lt;`mbox{nowiki}`&gt; &lt;/`mbox{nowiki}`&gt;&lt;/tt&gt; tags.
+
+==Styling Text Paragraphs==
+: Yioop wiki syntax offers a number of templates for
+control the styles, and alignment of text for
+a paragraph or group of paragraphs:&lt;br /&gt;
+`{{`left| some text`}}`,&lt;br /&gt; `{{`right| some text`}}`,&lt;br /&gt;
+and&lt;br /&gt;
+`{{`center| some text`}}`&lt;br /&gt; can be used to left-justify,
+right-justify, and center a block of text. For example,
+the last command, would produce:
+{{center|
+some text
+}}
+If you know cascading style sheets (CSS), you can set
+a class or id selector for a block of text using:&lt;br /&gt;
+`{{`class=&quot;my-class-selector&quot; some text`}}`&lt;br /&gt;and&lt;br /&gt;
+`{{`id=&quot;my-id-selector&quot; some text`}}`.&lt;br /&gt;
+You can also apply inline styles to a block of text
+using the syntax:&lt;br /&gt;
+`{{`style=&quot;inline styles&quot; some text`}}`.&lt;br /&gt;
+For example, `{{`style=&quot;color:red&quot; some text`}}` looks
+like {{style=&quot;color:red&quot; some text}}.
+
+==Lists==
+: The Yioop Wiki Syntax supported of ways of listing items:
+bulleted/unordered list, numbered/ordered lists, and
+definition lists. Below are some examples:
+
+===Unordered Lists===
+&lt;nowiki&gt;
+* Item1
+** SubItem1
+** SubItem2
+*** SubSubItem1
+* Item 2
+* Item 3
+&lt;/nowiki&gt;
+would be drawn as:
+* Item1
+** SubItem1
+** SubItem2
+*** SubSubItem1
+* Item 2
+* Item 3
+
+===Ordered Lists===
+&lt;nowiki&gt;
+# Item1
+## SubItem1
+## SubItem2
+### SubSubItem1
+# Item 2
+# Item 3
+&lt;/nowiki&gt;
+# Item1
+## SubItem1
+## SubItem2
+### SubSubItem1
+# Item 2
+# Item 3
+
+===Mixed Lists===
+&lt;nowiki&gt;
+# Item1
+#* SubItem1
+#* SubItem2
+#*# SubSubItem1
+# Item 2
+# Item 3
+&lt;/nowiki&gt;
+# Item1
+#* SubItem1
+#* SubItem2
+#*# SubSubItem1
+# Item 2
+# Item 3
+
+===Definition Lists===
+&lt;nowiki&gt;
+;Term 1: Definition of Term 1
+;Term 2: Definition of Term 2
+&lt;/nowiki&gt;
+;Term 1: Definition of Term 1
+;Term 2: Definition of Term 2
+
+==Tables==
+: A table begins with {`|`  and ends with `|`}. Cells are separated with | and
+rows are separated with |- as can be seen in the following
+example:
+&lt;nowiki&gt;
+{|
+|a||b
+|-
+|c||d
+|}
+&lt;/nowiki&gt;
+{|
+|a||b
+|-
+|c||d
+|}
+Headings for columns and rows can be made by using an exclamation point, !,
+rather than a vertical bar |. For example,
+&lt;nowiki&gt;
+{|
+!a!!b
+|-
+|c||d
+|}
+&lt;/nowiki&gt;
+{|
+!a!!b
+|-
+|c||d
+|}
+Captions can be added using the + symbol:
+&lt;nowiki&gt;
+{|
+|+ My Caption
+!a!!b
+|-
+|c||d
+|}
+&lt;/nowiki&gt;
+{|
+|+ My Caption
+!a!!b
+|-
+|c||d
+|}
+Finally, you can put a CSS class or style attributes (or both) on the first line
+of the table to further control how it looks:
+&lt;nowiki&gt;
+{| class=&quot;wikitable&quot;
+|+ My Caption
+!a!!b
+|-
+|c||d
+|}
+&lt;/nowiki&gt;
+{| class=&quot;wikitable&quot;
+|+ My Caption
+!a!!b
+|-
+|c||d
+|}
+Within a cell attributes like align, valign, styles, and class can be used. For
+example,
+&lt;nowiki&gt;
+{|
+| style=&quot;text-align:right;&quot;| a| b
+|-
+| lalala | lalala
+|}
+&lt;/nowiki&gt;
+{|
+| style=&quot;text-align:right;&quot;| a| b
+|-
+| lalala | lalala
+|}
+
+==Math==
+
+: Math can be included into a wiki document by either using the math tag:
+&lt;nowiki&gt;
+&lt;math&gt;
+\sum_{i=1}^{n} i = frac{(n+1)(n)}{2}
+&lt;/math&gt;
+&lt;/nowiki&gt;
+
+&lt;math&gt;
+\sum_{i=1}^{n} i = frac{(n+1)(n)}{2}
+&lt;/math&gt;
+
+or by enclosing the math in backticks:
+
+&lt;pre&gt;
+`[[1, -2],[3,4]]`
+&lt;/pre&gt;
+
+`[[1, -2],[3,4]]`.
+
+Rendering of math is done using [[https://www.mathjax.org/|MathJax]], making us of the [[https://en.wikipedia.org/wiki/ASCIIMathML|ASCIImathml]] extensions.
+
+==Links and Relationships==
+: A hypertext link to another document can be inserted into a wiki page using
+the chain link icon in the GUI. Alternatively, there are several techniques
+for inserting a link into a page depending on whether the link is to a page
+within the same wiki group, is a link to a page on a different wiki
+group, or is a link to a different website. In addition to normal
+hypertext links, Yioop also supports relationship links.
+
+&#039;&#039;&#039;Intra-Group Wiki Links&#039;&#039;&#039; use the syntax:
+&lt;nowiki&gt;
+[[name_of_wiki_page]]
+or
+[[name_of_wiki_page|text for the link]]
+or
+[[name_of_wiki_page#heading_or_id_on_page|text for the link]]
+&lt;/nowiki&gt;
+for example, to make a link to this Syntax page one could write,
+&lt;nowiki&gt;
+[[Syntax|Yioop Wiki Syntax Page]]
+&lt;/nowiki&gt;
+which would look like,
+
+[[Syntax|Yioop Wiki Syntax Page]]
+
+&#039;&#039;&#039;Inter-Group Wiki Links&#039;&#039;&#039; use the syntax:
+&lt;nowiki&gt;
+[[name_of-group@name_of_wiki_page|text for the link]]
+&lt;/nowiki&gt;
+
+&#039;&#039;&#039;Different Website Links&#039;&#039;&#039; use the syntax:
+&lt;nowiki&gt;
+[[website_url|text for the link]]
+&lt;/nowiki&gt;
+
+: Relationships are a generalized form of link. They are used to express
+a more complicated linking between two wiki pages and have the syntax:
+
+&lt;nowiki&gt;
+[[relationship_type|wiki_page_name|text for the link]]
+&lt;/nowiki&gt;
+
+: In the navigation dropdown for a Yioop wiki page there are items for
+what links to the current page and what relates to the current page
+based on the links and relationships a page belongs to.
+
+==Recent Places Dropdowns==
+: You can add a dropdown that can allow users to navigate to recently visited
+wiki pages using the syntax:
+
+&lt;sub&gt;`[`{recent_places}]&lt;/sub&gt;
+
+This looks like:
+
+[{recent_places}]
+
+==Adding Resources to a Page==
+
+: Yioop wiki syntax supports adding search bars, audio, images, and video to a
+page. The magnifying class edit tool icon can be used to add a search bar via
+the GUI. This can also be added by hand with the syntax:
+&lt;nowiki&gt;
+{{search:default|size:small|placeholder:Search Placeholder Text}}
+&lt;/nowiki&gt;
+This syntax is split into three parts each separated by a vertical bar |. The
+first part search:default means results from searches should come from the
+default search index. You can replace default with the timestamp of a specific
+index or mix if you do not want to use the default. The second group size:small
+indicates the size of the search bar to be drawn. Choices of size are small,
+medium, and large. Finally, placeholder:Search Placeholder Text indicates the
+grayed out background text in the search input before typing is done should
+read: Search Placeholder Text. Here is what the above code outputs:
+
+{{search:default|size:small|placeholder:Search Placeholder Text}}
+
+: Image, video and other media resources can be associated with a page by dragging
+and dropping them in the edit textarea or by clicking on the link click to select
+link in the gray box below the textarea. This would add wiki code such as
+
+&lt;sub&gt;((resource`:`myphoto.jpg|Resource Description))&lt;/sub&gt;
+
+to the page. Only saving the page will save this code and upload the resource to
+the server. In the above &#039;&#039;myphoto.jpg&#039;&#039; is the resource that will be inserted and
+Resource Description is the alternative text to use in case the viewing browser
+cannot display jpg files. To add a resource
+from a different wiki page belonging to the same group to the current wiki
+page one can use a syntax like:
+
+&lt;sub&gt;((resource`:`Documentation:ConfigureScreenForm1.png|The work directory form))&lt;/sub&gt;
+
+Here Documentation would be the page and ConfigureScreenForm1.png the resource.
+You can also insert resources from a data-string using &#039;&#039;resource-data&#039;&#039; rather than
+&#039;&#039;resource&#039;&#039;. For example:
+
+&lt;sub&gt;((resource-data`:`image/jpeg;base64,/9j/4AAQSkZJRg...rest of image data...|Seekquarry Logo))&lt;/sub&gt;
+
+could be used to inline an image like:
+
+((resource-data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAtqADAAQAAAABAAAAewAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgAewC2AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAGhoaGhoaLRoaLUAtLS1AV0BAQEBXbVdXV1dXbYRtbW1tbW2EhISEhISEhJ6enp6enri4uLi4z8/Pz8/Pz8/Pz//bAEMBICIiNTE1WjExWtiTeJPY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/dAAQADP/aAAwDAQACEQMRAD8A0dS1L7GBHGAZGGeegFZCQavejzSzAHpubaPyFRX5H9rHz/ublznpt4rsRgjI6UAcqbDV4BvRycf3XJ/Q1Z0/VneQW1394nAbpz6GuirA1HS5ri58622jI5yccjvwKAN+imrnaN3XHNRz3ENunmTMFH8/pQBNRWC2vW4OFjYj3IH9at2uq2tywQEox6Bu/wBD0oA06KKY7pGheQhVHUmgB9FYcmu2qnEasw9eAP1qSDWrSVtr5j9zjH5igDYrn9cuJ4DF5Llc7s4Ppit/rzXNeIesP0b+lAG7Zsz2kTuckopJ/CrNVLD/AI8of+ua/wAqbd30FmB5uST0C8n60AXaKrW1yLqPzUVlU9N3Gas0AFFFFABRRRQAUUUUAf/Q0dS00XoEkZ2yKMc9DWGG1XT/AJfnCj23L/X+ldNFfWk8vkxPubGeAf51coA5aHX5h/ro1b3U4/xrZtNStrs7UO1/7rdfw9ammsrW4/1sak+uOfzrl9SsPsMiSQk7WPGeoI5//VQB2VcXdytqF/syQgJA9gOv511NrMbizSY9WXn61xdlb3E8xW2IDBc9ccU15id7aG/GtvEu2NQBWdf28OwzxAKR1A6EVI1jqSffdVz6sB/SlbTNUdSrEEH3H+FaOUWrWMlCad7mzpV01zagucsh2k+vofyrG1i5kmuhaIflUgf8CPf8K1NJs7izWRZgAGwRg56VzsiTzam6RffMjYz/AJ9KyNma0EVvbrhQCe5PU1BeW8MyF0AVxyCO/saZLa6jCu6aRUHTJYD+lSCw1YjIYEH3H+Fa88drGPJLe5b0K6aSJrdjnZgr9D2/CoPEPWH6N/SpdL025tLkyygbSpHBz3FReIesP/Av6VkbF37dHZabCTy5jXav4dfpVGxsZL6T7beZKnkA/wAX/wBb/P1zlsLua0N22SFA2g9So9PYVv6Pe/aIfIkPzxjj3X1oA2AABgUtFFABRRRQAUUUUAFFFFAH/9GpdCXTNR81BkZLL6EHqP8APtXS22oWtyoKOA3908Gpp7eG5Ty5l3D+X0rDl0BScwy4Howz/hQBvvNEi7ndQB3JrltVvkvHSC2+YKevqTxgVMNAkzzKo+i//XrWtNMtrQ7wN7/3m7fT0oAsWkJt7WOA9VXB+veuXRjpepncPkyf++W/z+ldjVS7soLxAsw5HQjqKAMfVbea9aOe1HmpjHGKmur1tPs47cMDPtA9cep/wqH+w5UJ8mfAPsR/I1Lb6HEj77h/M5zgDA/HuaAL2mzXNxb+dcY+Y/LgY49awtSSWz1EXSDhiHH1HUV1gAAwOAKingiuI/LmXI/l9KAMK/jbVEinsiH25BGQCCcetXPPXTNPRJSDIFwFz1P+Aqo2hMj7reYj6jn8wRSx6EC++4lLfQcn8Tk0AWNKury63PPjYvAOMZNUvEPWH6N/SuiiijhQRxAKo6AVSv8AT1vihZyuzPQZ60ATWP8Ax4w/9c1/lXN3sEmmXizwcITlfT3H+e30rqoIhDCkIOdihc/So7u1ju4TDJ9QfQ+tADredLmFZo+jDp6e1T1nWNgbHcFkLK3YjHNaNABRRRQAUUUUAFFFFAH/0unooooAKjkljhTfKwVR3NNuJ0t4Wmk6KM//AFq5HF1q9wWJwF/JR7UAbkmt2afc3v8AQf44pY9asn+9uT/eH+FRRaXZxj5l3n1akl0q0kHyDyz6r/hSuVym0jpIoeMhgehFPri45bnSbnY3KnkgdGH+NdhHIksayxnKsMimSSUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//T6eiiigDntflKxxwj+Ilj+HT9TU2mRCKzQ93+Y/jVLxDnfH/un+YrUs/+PSL/AHB/Kky4lmimSSJEhkkOFHU1yt3qE9zMFhJVc4UA4P4+9IpuxsavCJLXzMcxnP4Hg1JoUpa1aI/wNx9Dz/Oi63jTG845fZz9areHw2Z27fL/AFpoiR0tFU7q+t7PHnE5PQDk1PDNHcRiWI5U0ySlqN+LKIbRl2+6D0+prIjj1i/QS+YUVjkZO3I9gOf1rbudPtrtg8wOQMcEjipXurSH5XkRcdsigDnJoNXsUM3mMyjqQxOPwNbGl37XsbCTAdDzjuD0NR3GrWHlOoYvxjgHHPv0rP8AD5zJJ/uj+ZoA0dZuJba3R4WKkvg49MGstr29vY0gtNxIQFyOCT9ewq74g/49Y/8AroP5Gp9EjVbEOvV2JP4HH9KAIdKj1FJWW7LbQOjc5J9D7VQGrTwXM3msWC7gq9s54rrK421iEur4YZHmMfyJP86AHFNaY/aB5nqOQP8Ax3P9KtahcX1lLH+9JDKDjjkjqOneumrK1iDzbNnHWP5h9O/6UAaUciyxrInRgCPxpJZFhiaV+igk/hWTok/mWphJ5jOB9DyKTXJ/LthAOsh5/wB0cmgCHS5ry8kd5ZGCKOnuef0FbXkt/wA9GqrpcBgs0DD5n+Y/j/8AWrRoA//U6eiiigDE1yAyWwmUZMZ5+hqHSbhZLfyCfmj4/DtW+yhlKsMg8EVyl3ptzZS+fZ5Kjpjkj6juKBp2LWrQXMyoIRlRnIHr2NYtxp09rGsp5HfHatKPWmAxMgJ9QcfoaZPq7SqY4owN3HJz+gpFOxUl1F5rMWz8tkZJ7gVqWk6abpwkfmSU7lX26D8K5+a1nt0V5V27ugPXH0oZ5ruTdIST3Jo2Ek5OyCWSa7kaRzknk1q6JeeTN9nf7sn6N2/PpVZECLtWqcgMc25eM8j6/wD66iM7ux01cPyQUjf1e8maf7FAT2BxwST0FTwaFCqgzuS3cLwP8azr+OUtHqcY+WRVYn0YetaUevW2z96rBgOcYIrQ5C02nWFvE8nlg4UnLc9PrWXoH+tk/wBxf5mnzXV1qv8Ao9ohSM/eY9/xH9Kh0NvKu3hbqVI/FTQBe1//AI9o/wDroP5GrWkf8g6L8f5mquv/APHtH/10H8jVrSP+QdF+P8zQBp1yen/8hdv96T+ddZXJ6fj+12/3pP50AdZSEAgg9DS0UAcnYk2OqNbseCSn9Vpbn/T9XEI5VTtP0Xlv8Km1yJo5I7yPg9Cfccin6HEzGS7k5JO0fzP60AdDS0UUAf/V6eiiigAooooAhkt7eX/Wxq31ANUrqa002LcqKGP3VUAZP+FWbu6jtITNJ9APU+lcNNNNezl5Dlj+QHoPagaTbsglkmvZjJIck9+wH+FWkRUXatCIqLgU6ueUrnrUKCgrvcKp3DAyADtViWQRr79qfplk15cbnHyLyx9fb8aqnHqZYuqrciOssEKWUSOOQoyKkNpal95iTd67Rmp+nFLWx5ogAAwOKTauc4GadRQAhAPUZoAA4FLRQAU0KoOQBTqKACkyKWsvU7GS8VDEwVkz1z3+lAGfrV0HKWcJ3HOWA9ew/Otu0gFtbJCP4Rz9e9Zdho4tpBNOwZh0A6A+vvW7QAUUUUAf/9bp6KKKACiiigCnfWaXsPlMcEHII9a5W40a7g+ZBvHqOv5V21FAHnQlmjO1uo7HrTzctjhcGu4uLa3lX94it9RWcmn2W/8A1S1PKjZV5pWTOes7Ce+kz0Xuxrtbe3jtohFEMAVKqqg2qMD2p1UYthRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//9k=|The Seekquarry Logo))
+
+be aware though that the default maximum wiki page size is 512Kb (this can be set in src/configs/Config.php).
+
+: Sometimes it is useful to edit the basic resource link
+above to make a link which is a thumbnail of the resource which points to a
+separate page containing that resource. This can be done using the syntax:
+
+&lt;sub&gt;((resource-thumb`:`myphoto.jpg|Resource Description))&lt;/sub&gt;
+
+: Similarly, by default for resources like PDFs, epub&#039;s, etc., the resource tag inlines
+the whole resource into the page, if instead one wants a clickable link to a page where
+the resource is displayed one can use the syntax:
+
+&lt;sub&gt;((resource-link`:`my_document.pdf|Resource Description))&lt;/sub&gt;
+
+: Comma separated value files (.csv or CSV files) are inlined into a page as a table. Which rows and columns of the CSV to present in this table can be controlled by the resource line. The general format for including
+a CSV resource is:
+
+&lt;sub&gt; ((resource`:`resource_name.csv#config#top_left_cell#bottom_right_cell|Resource Description))&lt;/sub&gt;
+
+For example,
+
+&lt;sub&gt;((resource`:`resource_name.csv##B2#C3|Resource Description))&lt;/sub&gt;
+
+might output
+
+((resource-data:text/csv;base64,LCwsLAosLTIsMywsCiw1LDQsLAosLCwsCiwsLCwK##B2#C3|Example CSV with Headings))
+
+I.e., just the portion of the CSV given by the rectangle between the cells B2 and C3. Using a config directive we can omit the spreadsheet row and column headings as follows:
+
+&lt;sub&gt;((resource`:`resource_name.csv#noheadings#B2#C3|Resource Description)) &lt;/sub&gt;
+
+which might output
+
+
+((resource-data:text/csv;base64,LCwsLAosLTIsMywsCiw1LDQsLAosLCwsCiwsLCwK#noheadings#B2#C3|Example CSV without Headings))
+
+CSV spreadsheet files can also be used to output a variety of charts. The general format for the command to insert a chart resource is:
+
+&lt;sub&gt;((resource-chart_type`:`resource_name.csv#char_config#x_start#x_end#y_start#y_end|Resource Description))&lt;/sub&gt;
+
+Here &#039;&#039;chart_type&#039;&#039; can be one of &#039;&#039;bargraph&#039;&#039;,  &#039;&#039;linegraph&#039;&#039;, or &#039;&#039;pointgraph&#039;&#039;. For example, one might have a line like:
+
+&lt;sub&gt;((resource-bargraph`:`resource_name.csv##B1#B4#C1#C4|Quadratic Function)) &lt;/sub&gt;
+
+which could produce a chart like
+
+((resource-bargraph:##(1,1)#(2,4)#(3,9)#(4,16)|Quadratic Function))
+
+In the above example, the values for the `x` coordinates would come from the cells B1, B2, B3, B4 from
+&#039;&#039;resource_name.csv &#039;&#039; and the values for the `y` coordinates would come from cells C1, C2, C3, C4 from
+&#039;&#039;resource_name.csv &#039;&#039;. Alternatively, rather than use a CSV to get out data we can just list the points we want to plot with a command like:
+
+&lt;sub&gt;((resource-bargraph`:`##(1,1)#(2,4)#(3,9)#(4,16)|Quadratic Function))&lt;/sub&gt;
+
+==Manipulating Page Resources==
+
+: A list of media that have already been associated with
+a page appears under the Page Resource heading below the textarea. This
+table allows the user to rename and delete resources as well as insert the
+same resource at multiple locations within the same document.
+
+: The resources section of the edit page can be thought of as similar to
+a folder in Windows or MacOS. One can have subfolders of the resource folder.
+
+: The &#039;&#039;&#039;Places&#039;&#039;&#039; dropdown at the top of the &#039;&#039;&#039;Page Resource&#039;&#039;&#039; section allows one to navigate
+these folders.
+
+: The &#039;&#039;&#039;Filter&#039;&#039;&#039; textfield lets you enter a search string.
+Clicking &#039;&#039;&#039;Go&#039;&#039;&#039; then shows only those resources
+which contain that search string in their title.
+
+: The &#039;&#039;&#039;Clip Folder&#039;&#039;&#039; dropdown is used to copy files between folders and pages.
+Its current value is the folder that the &#039;&#039;&#039;Clip Copy&#039;&#039;&#039; buttons next to resources
+will copy their resource to when clicked. You can set the &#039;&#039;&#039;Clip Folder&#039;&#039;&#039; to
+the current folder using the dropdown, then  move to the page and folder that
+you would like to copy stuff from and click the &#039;&#039;&#039;Clip Copy&#039;&#039;&#039; button of the
+desired resource.
+
+: The &#039;&#039;&#039;Name&#039;&#039;&#039;, &#039;&#039;&#039;Size&#039;&#039;&#039;, &#039;&#039;&#039;Modified&#039;&#039;&#039; header links above the resources list
+control the sort order for the resource list. If a page is a media list page,
+then even in read mode, the sort order selected is remembered when drawing the
+media list.
+
+: The &#039;&#039;&#039;Actions&#039;&#039;&#039; drop can be used to create new folders, new text files, and new csv
+text files within the current page resource folder. These are initial named beginning
+with &#039;&#039;untitled&#039;&#039; followed by some number, and if applicable a file extension.
+
+: Resources entries for the resources list consist first of an icon, followed by a textfield
+with a name for the resource, followed by buttons for actions that can be done to that resource
+(Rename, Add to Page, Clip Copy), followed by a link [X], which can be used to delete the resource.
+If a resource is editable the icon will look like a plus sign together with a pencil. Clicking
+on the icon will then let you edit the resource.
+
+===Text and CSV Resources===
+: For normal text files clicking edit will bring up a textarea with the context of the text to edit.
+For CSV (comma separated value) files this will present the file as an editable spreadsheet.
+Yioop spreadsheets can have equation much like Excel spreadsheets. Clicking on a cell lets one
+edit its contents. For example, if in the cell A3
+one entered the equation:
+ = A1+A2
+then clicking out of the cell would cause it to refresh with the value of the sum of the contents of
+cells A1 and A2. In addition, to the standard arithmetic operators [&#039;*&#039;, &#039;/&#039;, &#039;+&#039;, &#039;-&#039;, &#039;%&#039;], the
+spreadsheet expressions can use float or integer literals, and can make use of the following table
+of built-in functions:
+
+{| class=&quot;wikitable&quot;
+!Function Name!!Description
+|-
+!avg(x1,...,xn), avg(x1:xn)|| computes average of values of cells listed as arguments
+|-
+!ceil(x)|| rounds the value of x up to nearest integer
+|-
+!cell(i,j)|| returns the contents of the cell with column name of letter j, and row name i. For example, cell(2,&#039;B&#039;) would return the contents of cell B2.
+|-
+!col(value, search_row, start_col, end_col)|| searches the row &#039;&#039;search_row&#039;&#039; between the columns
+&#039;&#039;start_col&#039;&#039;, &#039;&#039;end_col&#039;&#039; for &#039;&#039;value&#039;&#039;. Returns the column name where this value was found or -1 if not found.
+For example, col(3, 2, &quot;B&quot;, &quot;D&quot;) might return C if the cell C2 had value 3.
+|-
+!exp(x)|| computes `e^x`
+|-
+!floor(x)|| rounds the value of x down to the nearest integer
+|-
+!log(x)|| computes `log x`
+|-
+!min(x1,...,xn), min(x1:xn)|| computes minimum value of cells listed as arguments
+|-
+!max(x1,...,xn), max(x1:xn)|| computes maximum value of cells listed as arguments
+|-
+!pow(x,y)|| computes `x^y`
+|-
+!row(value, search_col, start_row, end_row)|| searches the column &#039;&#039;search_col&#039;&#039;
+between the rows &#039;&#039;start_row&#039;&#039;, &#039;&#039;end_row&#039;&#039; for &#039;&#039;value&#039;&#039;.
+Returns the row name where this value was found or -1 if not found.
+For example, row(3, &quot;C&quot;, &quot;1&quot;, &quot;5&quot;) might return 2 if the cell C2 had value 3.
+|-
+!sqrt(x)|| computes `sqrt(x)`
+|-
+!sum(x1,...,xn), sum(x1:xn)|| computes sum of values of cells listed as arguments
+|-
+!username()|| returns username of the person using this CSV file
+|}
+
+===HTML, PDF and EPub Resources===
+: How HTML, PDF, EPub resources included on a page render depends on how the Yioop wiki software
+has been configured. If no special configuration has been done, then HTML and PDF documents
+will bbe rendered in an &lt;iframe&gt; tag within the current wiki page. In the EPub, case a link
+to download the resource will be given. If the wiki software detects the presence of the
+file APP_DIR/scripts/pdf.js ([[https://en.wikipedia.org/wiki/PDF.js|PDF.js]])
+or APP_DIR/scripts/epub.js ([[https://github.com/futurepress/epub.js|epub.js]]), the wiki
+system will render the resource in a Javascript viewer and will do things like remember reading
+position.
+
+
+===Video and Audio Resources===
+
+: Not all browsers support the same video and audio formats for playback. For this reason
+it sometimes is useful to have multiple video resources for the same video. For example,
+you might have a .ogv and .vp8 version of the same video recording. In read (non-edit)
+mode, the Yioop wiki system displays only one link for video or audio files that have
+the same name except for extension. It then includes the grouped file as separated &lt;source&gt;
+tags within either the &lt;video&gt; or &lt;audio&gt; html tag used to render the item in the browser.
+In this way, you can make your media take best advantages to whatever capabilities your
+client&#039;s browser has. If you don&#039;t feel like recoding your media in such a fancy way, a safe
+rule of thumb is that .mp3 audio will playback in all modern browser, and that .mp4 video
+will playback in all modern browser.
+
+: For video it is sometimes useful to add a subtitle or caption track. Yioop wiki supports
+[[https://en.wikipedia.org/wiki/WebVTT|WebVTT]] format subtitles and captions. To see how
+Yioop wiki makes use of these files, suppose you included a resource &#039;&#039;foo.mp4&#039;&#039; in your
+wiki pages, and you also had a file named &#039;&#039;foo-captions-en-US.vtt&#039;&#039; then when the HTML
+page is generated from your wiki page, a &lt;track&gt; tag for the caption file would be added
+to the &lt;video&gt; tag. A user seeing this page would then see in the video player a closed caption
+symbol and be able to turn on/off (defaults off) the English captions. If you wanted
+named the file &#039;&#039;foo-subtitles-en-US.vtt&#039;&#039; instead, then Yioop wiki would include it as a
+subtitles track (defaults on). You can add captions/subtitle files for as many languages as
+desired.
+
+: When viewing the page resources for a page in edit mode, one can see one file/resource and
+no grouping of resources by name is done. In this way you can keep track of exactly what
+resources are available for a page.
+
+==Page Settings, Page Type==
+
+: In edit mode for a wiki page, next to the page name, is a link [Settings].
+Clicking this link expands a form which can be used to control global settings
+for a wiki page.  This form contains a drop down for the page type, another
+drop down for the type of border for the page in non-logged in mode,
+a checkbox for whether a table of contents should be auto-generated from level 2
+and level three headings and then text
+fields or areas for the page title, author, meta robots, and page description.
+Beneath this one can specify another wiki page to be used as a header for this
+page and also specify another wiki page to be used as a footer for this page.
+
+: The contents of the page title is displayed in the browser title when the
+wiki page is accessed with the  Activity Panel collapsed or when not logged in.
+Similarly, in the collapsed or not logged in mode, if one looks as the HTML
+page source for the page,  in the head of document, &lt;meta&gt; tags for author,
+robots, and description are set according to these fields. These fields can
+be useful for search engine optimization. The robots meta tag can be
+used to control how search engine robots index the page. Wikipedia has more information on
+[[https://en.wikipedia.org/wiki/Meta_element|Meta Elements]].
+
+: The &#039;&#039;&#039;Standard&#039;&#039;&#039; page type treats the page as a usual wiki page.
+
+: &#039;&#039;&#039;Page Alias&#039;&#039;&#039; type redirects the current page to another page name. This can
+be used to handle things like different names for the same topic or to do localization
+of pages. For example, if you switch the locale from English to French and
+you were on the wiki page dental_floss when you switch to French the article
+dental_floss might redirect to the page dentrifice.
+
+: &#039;&#039;&#039;Media List&#039;&#039;&#039; type means that the page, when read, should display just the
+resources in the page as a list of thumbnails and links. These links for the
+resources go to a separate pages used to display these resources.
+This kind of page is useful for a gallery of
+images or a collection of audio or video files.
+
+: &#039;&#039;&#039;Presentation&#039;&#039;&#039; type is for a wiki page whose purpose is a slide presentation. In this mode,
+....
+on a line by itself is used to separate one slide. If presentation type is a selected a new
+slide icon appears in the wiki edit bar allowining one to easily add new slides.
+When the Activity panel is not collapsed and you are reading a presentation, it just
+displays as a single page with all slides visible. Collapsing the Activity panel presents
+the slides as a typical slide presentation using the
 [[www.w3.org/Talks/Tools/Slidy2/Overview.html|Slidy]] javascript.
 EOD;
 $public_pages["en-US"]["ad_program_terms"] = <<< 'EOD'
@@ -896,7 +896,7 @@ page_footer=

 sort=aname

-END_HEAD_VARSThe Ad Server field-set is used to control whether, where,
+END_HEAD_VARSThe Ad Server field-set is used to control whether, where,
 and what external advertisements should be displayed by this Yioop instance.
 EOD;
 $help_pages["en-US"]["Add_Locale"] = <<< EOD
@@ -921,6 +921,9 @@ different languages and for different regions.
 the language of the locale.
 * So for French you would put :Fran&amp;ccedil;ais. The locale tag should be the
 IETF language tag.
+EOD;
+$help_pages["en-US"]["Add_or_Edit_Pattern"] = <<< EOD
+
 EOD;
 $help_pages["en-US"]["Adding_Examples_to_a_Classifier"] = <<< EOD
 page_type=standard
@@ -1083,13 +1086,52 @@ page_footer=

 sort=aname

-END_HEAD_VARSThe Bot Configuration field-set is used to control whether user&#039;s of this Yioop instance can be chat bots.
-&lt;br/&gt;
+END_HEAD_VARSThe Bot Configuration field-set is used to control whether user&#039;s of this Yioop instance can be chat bots.
+&lt;br/&gt;
+
+If enabled under &#039;&#039;&#039;Manage Accounts&#039;&#039;&#039; a Yioop user can declare themselves a chat bot and give a callback url.
+&lt;br/&gt;
+
+Suppose a chat bot user has a name user name, &#039;&#039;user1&#039;&#039;. If that chat bot user belongs to a group, and in an already existing thread, someone posts a follow up comment containing &#039;&#039;user1&#039;&#039;, then that message will be sent in a post field together with a bot_token field to the callback url. The response from the url will then be used in a response to the comment (if any).
+EOD;
+$help_pages["en-US"]["Bot_Story_Patterns"] = <<< EOD
+page_type=standard

-If enabled under &#039;&#039;&#039;Manage Accounts&#039;&#039;&#039; a Yioop user can declare themselves a chat bot and give a callback url.
-&lt;br/&gt;
+page_alias=
+
+page_border=solid-border
+
+toc=true
+
+title=
+
+author=
+
+robots=
+
+description=
+
+alternative_path=
+
+page_header=
+
+page_footer=
+
+sort=aname
+
+END_HEAD_VARSHow a Chat Bot in Yioop behaves is determined by how it is configured in its Bot Story activity.
+A Bot Story is a set of patterns that control how a chat bot reacts to group threads posts
+for groups to which it belongs. A bot story pattern consists of the following components which are
+configurable in the Bot Story activity:
+
+; &#039;&#039;&#039;Request Expression&#039;&#039;&#039; : This and the trigger state are used to determine if a bot will react to a post. If a post contains @name_of_the_bot followed by some phrase or phrases which match the expression and the trigger state matches the trigger state of the bot for that user, then the pattern will apply. Request expressions are allowed to contain variables. They are strings beginning with $ followed by a sequence of word characters. For example, the expression:&lt;br /&gt;&#039;&#039;What is the weather in &#36;location?&#039;&#039;&lt;br /&gt;would match the string&lt;br /&gt;&#039;&#039;What is the weather in San Jose?&#039;&#039;&lt;br /&gt; and the value of &#36;location would get bound to San Jose in this match.
+; &#039;&#039;&#039;Trigger State&#039;&#039;&#039; : A chat bot has a particular state it is in with respect to each user in a group. This state can be any string, but it starts at being the string &quot;0&quot;. If the current state of the bot for a user matches a pattern&#039;s trigger state and the last post of a user matches the request expression for the pattern then the pattern is activated. In the add pattern/edit pattern forms one can use simple strings or strings containing variables in defining a trigger state. For example, &quot;0&quot;, &quot;asleep&quot; are simple trigger states. One can also have &quot;1&#36;location&quot;. If the request expression for a pattern was &quot;What is the weather in &#36;location?&quot; and the user was in state &quot;1San Jose&quot; and posted a message &quot;What is the weather in San Jose?&quot; then this pattern would activate.
+; &#039;&#039;&#039;Remote Message&#039;&#039;&#039; : If a bot url has been configured for a chat bot, then when a pattern is activated a request will be made to that url as part of computing the response the chat bot makes to the message which was just posted. The url request will have as part of its query string a variable &#039;&#039;remote_message&#039;&#039; which comes from this field of the Bot Pattern. The Remote Message can be any string and is allowed to have variables in it. So for example, a pattern&#039;s Remote Message might be getWeather,&#36;location. When the value of &#36;location is substituted with might become getWeather,San Jose. This tells the bot url site what action to perform with what value.
+; &#039;&#039;&#039;Result State&#039;&#039;&#039; : This is the state the chat bot should enter for that user after the pattern is applied. It is allowed to be an arbitrary string and can have variables in it. These will be interpolated when the pattern is applied.
+; &#039;&#039;&#039;Response&#039;&#039;&#039; : This is the text that the chat bot will post back to the thread in question in response to a user request. It is a string and can have variables. In addition, to variables bound from the Request Expression, it can make use of &#36;REMOTE_RESPONSE which has the string returned from the Bot url call (if there was one), and it can make use of &#36;USER_NAME, the name of the user that the post was in response to.
+
+

-Suppose a chat bot user has a name user name, &#039;&#039;user1&#039;&#039;. If that chat bot user belongs to a group, and in an already existing thread, someone posts a follow up comment containing &#039;&#039;user1&#039;&#039;, then that message will be sent in a post field together with a bot_token field to the callback url. The response from the url will then be used in a response to the comment (if any).
 EOD;
 $help_pages["en-US"]["Bot_User"] = <<< EOD

@@ -1311,40 +1353,40 @@ page_footer=

 sort=aname

-END_HEAD_VARS&#039;&#039;This form appears when the Group Name is available to create a new Group. &#039;&#039;
-----
-
-&#039;&#039;&#039;Name&#039;&#039;&#039; Field is used to specify the name of the new Group.
-&lt;br /&gt;
-&#039;&#039;&#039;Register&#039;&#039;&#039; dropdown says how other users are allowed to join the group:
-* &lt;u&gt;No One&lt;/u&gt; means no other user can join the group (you can still invite
-other users).
-* &lt;u&gt;By Request&lt;/u&gt; means that other users can request the group owner to join
-the group.
-* &lt;u&gt;Anyone&lt;/u&gt; means all users are allowed to join the group.
-
-
-&#039;&#039;&#039;Access&#039;&#039;&#039; dropdown controls how users who belong/subscribe to a group
-other than the owner can access that group.
-* &lt;u&gt;No Read&lt;/u&gt; means that a non-owner member of the group cannot read or
-write the group news feed and cannot read the group wiki.
-* &lt;u&gt;Read&lt;/u&gt; means that a non-owner member of the group can read the group
-news feed and the groups wiki page.
-* &lt;u&gt;Read&lt;/u&gt; Comment means that a non-owner member of the group can read the
-group feed and wikis and can comment on any existing threads, but cannot start
-new ones.
-* &lt;u&gt;Read Write&lt;/u&gt;, means that a non-owner member of the group can start new
-threads and comment on existing ones in the group feed and can edit and create
-wiki pages for the group&#039;s wiki.
-
-
-&#039;&#039;&#039;Voting&#039;&#039;&#039;
-* Specify the kind of voting allowed in the new group. + Voting allows users to
-vote up, -- Voting allows users to vote down. +/- allows Voting up and down.
-&#039;&#039;&#039;Post Life time&#039;&#039;&#039; - Specifies How long the posts should be kept.
-
-&#039;&#039;&#039;Encryption&#039;&#039;&#039;
-* Whether the posts in this group should be encrypted on the server. Drawback is
+END_HEAD_VARS&#039;&#039;This form appears when the Group Name is available to create a new Group. &#039;&#039;
+----
+
+&#039;&#039;&#039;Name&#039;&#039;&#039; Field is used to specify the name of the new Group.
+&lt;br /&gt;
+&#039;&#039;&#039;Register&#039;&#039;&#039; dropdown says how other users are allowed to join the group:
+* &lt;u&gt;No One&lt;/u&gt; means no other user can join the group (you can still invite
+other users).
+* &lt;u&gt;By Request&lt;/u&gt; means that other users can request the group owner to join
+the group.
+* &lt;u&gt;Anyone&lt;/u&gt; means all users are allowed to join the group.
+
+
+&#039;&#039;&#039;Access&#039;&#039;&#039; dropdown controls how users who belong/subscribe to a group
+other than the owner can access that group.
+* &lt;u&gt;No Read&lt;/u&gt; means that a non-owner member of the group cannot read or
+write the group news feed and cannot read the group wiki.
+* &lt;u&gt;Read&lt;/u&gt; means that a non-owner member of the group can read the group
+news feed and the groups wiki page.
+* &lt;u&gt;Read&lt;/u&gt; Comment means that a non-owner member of the group can read the
+group feed and wikis and can comment on any existing threads, but cannot start
+new ones.
+* &lt;u&gt;Read Write&lt;/u&gt;, means that a non-owner member of the group can start new
+threads and comment on existing ones in the group feed and can edit and create
+wiki pages for the group&#039;s wiki.
+
+
+&#039;&#039;&#039;Voting&#039;&#039;&#039;
+* Specify the kind of voting allowed in the new group. + Voting allows users to
+vote up, -- Voting allows users to vote down. +/- allows Voting up and down.
+&#039;&#039;&#039;Post Life time&#039;&#039;&#039; - Specifies How long the posts should be kept.
+
+&#039;&#039;&#039;Encryption&#039;&#039;&#039;
+* Whether the posts in this group should be encrypted on the server. Drawback is
 in future group will not be as searchable as a non-encrypted group.
 EOD;
 $help_pages["en-US"]["Database_Setup"] = <<< EOD
@@ -2158,10 +2200,10 @@ page_footer=

 sort=aname

-END_HEAD_VARSThe privacy fieldset controls a variety of options with respect to how analytics from individual users is collected by a Yioop instance.
-
-*&#039;&#039;&#039;Differential Privacy&#039;&#039;&#039; controls whether group and thread view statistics which are displayed under the Manage Groups and Feeds and Wikis activities are fuzzified to try to prevent individual users from being identified by change in counts.
-*&#039;&#039;&#039;Group Analytics&#039;&#039;&#039; controls whether information about group and thread views is collected and aggregated.
+END_HEAD_VARSThe privacy fieldset controls a variety of options with respect to how analytics from individual users is collected by a Yioop instance.
+
+*&#039;&#039;&#039;Differential Privacy&#039;&#039;&#039; controls whether group and thread view statistics which are displayed under the Manage Groups and Feeds and Wikis activities are fuzzified to try to prevent individual users from being identified by change in counts.
+*&#039;&#039;&#039;Group Analytics&#039;&#039;&#039; controls whether information about group and thread views is collected and aggregated.
 *&#039;&#039;&#039;Search Analytics&#039;&#039;&#039; controls whether information about search queries is collected and aggregated.
 EOD;
 $help_pages["en-US"]["Proxy_Server"] = <<< EOD
diff --git a/src/configs/TokenTool.php b/src/configs/TokenTool.php
index 291dbb86a..5f0c88dbf 100644
--- a/src/configs/TokenTool.php
+++ b/src/configs/TokenTool.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -30,8 +30,8 @@
  *
  * @author Ravi Dhillon  ravi.dhillon@yahoo.com, Chris Pollett (modified for n
  *     ngrams)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/configs/default_crawl.ini b/src/configs/default_crawl.ini
index 0ebe63324..1e965e531 100644
--- a/src/configs/default_crawl.ini
+++ b/src/configs/default_crawl.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; crawl.ini
diff --git a/src/controllers/AdminController.php b/src/controllers/AdminController.php
index a05e4fddc..da1c6243c 100755
--- a/src/controllers/AdminController.php
+++ b/src/controllers/AdminController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/ApiController.php b/src/controllers/ApiController.php
index b4c7a8ec2..89f55393e 100644
--- a/src/controllers/ApiController.php
+++ b/src/controllers/ApiController.php
@@ -18,13 +18,13 @@
  *  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/>.
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  *  END LICENSE
  *
  *  @author Eswara Rajesh Pinapala epinapala@live.com
- *  @license http://www.gnu.org/licenses/ GPL3
- *  @link http://www.seekquarry.com/
+ *  @license https://www.gnu.org/licenses/ GPL3
+ *  @link https://www.seekquarry.com/
  *  @copyright 2009 - 2018
  *  @filesource
  */
diff --git a/src/controllers/ArchiveController.php b/src/controllers/ArchiveController.php
index 4d816340f..94f62cc5a 100755
--- a/src/controllers/ArchiveController.php
+++ b/src/controllers/ArchiveController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/ClassifierController.php b/src/controllers/ClassifierController.php
index b0e1e1217..68efab6e0 100644
--- a/src/controllers/ClassifierController.php
+++ b/src/controllers/ClassifierController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/Controller.php b/src/controllers/Controller.php
index 5870f97ab..0a86c7a8c 100755
--- a/src/controllers/Controller.php
+++ b/src/controllers/Controller.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/CrawlController.php b/src/controllers/CrawlController.php
index fd31ba809..df0ceb356 100644
--- a/src/controllers/CrawlController.php
+++ b/src/controllers/CrawlController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/FetchController.php b/src/controllers/FetchController.php
index e1f51d7b1..24ef1758a 100755
--- a/src/controllers/FetchController.php
+++ b/src/controllers/FetchController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/GroupController.php b/src/controllers/GroupController.php
index 43e43e6ff..8d0bfc4ef 100644
--- a/src/controllers/GroupController.php
+++ b/src/controllers/GroupController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/JobsController.php b/src/controllers/JobsController.php
index 2a42a32b1..d7f44b7ef 100644
--- a/src/controllers/JobsController.php
+++ b/src/controllers/JobsController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/MachineController.php b/src/controllers/MachineController.php
index 4eac5af00..0e3c3d3ea 100644
--- a/src/controllers/MachineController.php
+++ b/src/controllers/MachineController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/RegisterController.php b/src/controllers/RegisterController.php
index ed80ab015..10891cc3f 100755
--- a/src/controllers/RegisterController.php
+++ b/src/controllers/RegisterController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/ResourceController.php b/src/controllers/ResourceController.php
index fb538e817..1fa618bde 100644
--- a/src/controllers/ResourceController.php
+++ b/src/controllers/ResourceController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/SearchController.php b/src/controllers/SearchController.php
index 89f718ad8..2ff91fe0e 100755
--- a/src/controllers/SearchController.php
+++ b/src/controllers/SearchController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/SettingsController.php b/src/controllers/SettingsController.php
index 693670bdf..3404884c3 100755
--- a/src/controllers/SettingsController.php
+++ b/src/controllers/SettingsController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/StaticController.php b/src/controllers/StaticController.php
index 378fb4e24..cfc4b6f21 100644
--- a/src/controllers/StaticController.php
+++ b/src/controllers/StaticController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/TestsController.php b/src/controllers/TestsController.php
index 96738ee2e..aabb57dda 100644
--- a/src/controllers/TestsController.php
+++ b/src/controllers/TestsController.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/components/AccountaccessComponent.php b/src/controllers/components/AccountaccessComponent.php
index 51a819264..1c469ef6a 100644
--- a/src/controllers/components/AccountaccessComponent.php
+++ b/src/controllers/components/AccountaccessComponent.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -308,24 +308,25 @@ class AccountaccessComponent extends Component
                     $data['USER']['IS_ADVERTISER'] = $user['IS_ADVERTISER'];
                     $role_model->deleteUserRole($user_id, $business_id);
                 }
-                $bot_role_id=$role_model->getRoleId('Bot User');
-                if (isset($_REQUEST['IS_BOT_USER']) && $bot_role_id){
+                $is_bot_updated = false;
+                $bot_role_id = $role_model->getRoleId('Bot User');
+                if (isset($_REQUEST['IS_BOT_USER']) && $bot_role_id) {
                     $data['USER']['IS_BOT_USER'] = 1;
+                    $is_bot_updated = true;
                     $role_model->addUserRole($user_id, $bot_role_id);
                 } else if ($bot_role_id) {
                     $data['USER']['IS_BOT_USER'] = 0;
                     $role_model->deleteUserRole($user_id, $bot_role_id);
                 }
-                $is_bot_updated = false;
                 if (isset($_REQUEST['BOT_TOKEN'])){
                     $user['BOT_TOKEN'] = $_REQUEST['BOT_TOKEN'];
                     $data['USER']['BOT_TOKEN'] = $user['BOT_TOKEN'];
-                    $is_bot_updated=true;
+                    $is_bot_updated = true;
                 }
                 if (isset($_REQUEST['BOT_CALLBACK_URL'])){
                     $user['CALLBACK_URL'] = $_REQUEST['BOT_CALLBACK_URL'];
                     $data['USER']['CALLBACK_URL'] = $user['CALLBACK_URL'];
-                    $is_bot_updated=true;
+                    $is_bot_updated = true;
                 }
                 if (isset($_FILES['user_icon']['name']) &&
                     $_FILES['user_icon']['name'] !="") {
diff --git a/src/controllers/components/AdvertisementComponent.php b/src/controllers/components/AdvertisementComponent.php
index 08836ddea..17390ee68 100644
--- a/src/controllers/components/AdvertisementComponent.php
+++ b/src/controllers/components/AdvertisementComponent.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Pushkar Umaranikar
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/components/ChatbotComponent.php b/src/controllers/components/ChatbotComponent.php
index 1255cd5a3..89e414f58 100644
--- a/src/controllers/components/ChatbotComponent.php
+++ b/src/controllers/components/ChatbotComponent.php
@@ -18,353 +18,142 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
 namespace seekquarry\yioop\controllers\components;

-use seekquarry\yioop as B;
 use seekquarry\yioop\configs as C;
-use seekquarry\yioop\library as L;
-use seekquarry\yioop\library\PhraseParser;
-

 /**
- * Provides activities to AdminController related to creating,
- * managing, editing, deleting bot stories.
+ * Provides the AdminController activity that allows users to
+ * create Chat Bot Stories. A Chat Bot story is a collection of patterns
+ * (expression, trigger state, remote call, result state, responses) that
+ * govern how a chat bot will behave under various circumstances
  *
- * @author Harika Nukala
+ * @author Harika Nukala (simplified and rewritten Chris Pollett)
  */
 class ChatbotComponent extends Component
 {
     /**
-     * @return array $data
+     * Handles addpattern, editpattern, deletepattern requests for the
+     * Chat Bot story of the current user.
+     *
+     * @return array $data field variables (PATTERN_FORM_TYPE,
+     *      CURRENT_PATTERN, PATTERNS) used by BotstoryElement to
+     *      render the view in which people can see the current pattern to add
+     *      or edit as well as an array of patterns that have current been added
+     *      for this bot
      */
     public function botStory()
     {
         $parent = $this->parent;
         $bot_model = $parent->model("bot");
-        $user_model = $parent->model("user");
         $data["ELEMENT"] = "botstory";
-        $data['SCRIPT']="";
-        $allowed_options = ['create_intent', 'create_entity',
-            'create_expressions'];
-        if (isset($_REQUEST['option_type']) &&
-            in_array($_REQUEST['option_type'], $allowed_options)) {
-            $data['option_type'] = $_REQUEST['option_type'];
-        } else {
-            $data['option_type'] = 'create_intent';
-        }
-        if ($data['option_type'] == 'create_intent') {
-            $data['create_intent_active'] = "active";
-            $data['create_entity_active'] = "";
-            $data['create_expressions_active'] = "";
-            $data['SCRIPT'] .= "\nswitchTab('createintenttab',".
-                "'createentitytab','createexpressionstab')\n";
-        } else if ($data['option_type'] == 'create_entity') {
-            $data['create_entity_active'] = "active";
-            $data['create_intent_active'] = "";
-            $data['create_expressions_active'] = "";
-            $data['SCRIPT'] .= "\nswitchTab('createentitytab',".
-                "'createintenttab', 'createexpressionstab')\n";
-        } else {
-            $data['create_entity_active'] = "";
-            $data['create_intent_active'] = "";
-            $data['create_expressions_active'] = "active";
-            $data['SCRIPT'] .= "\nswitchTab('createexpressionstab',".
-                "'createintenttab', 'createentitytab');\n";
-        }
-        $data['MESSAGE'] = "";
-        $data['INTENT_LISTS']="";
-        $data["CURRENT_STORY"] = [
-            "INTENT_ID" => "","EXPRESSION"=>""];
-        $intent = "";
-        $entity_name = "";
-        $entity_value = "";
+        $data['SCRIPT'] = "";
+        $data["CURRENT_PATTERN"] = ['request' => "", 'trigger_state' => 0,
+            'remote_message' => "", 'result_state' => 0, 'response' => ""];
+        $must_have = ['REQUEST'];
+        $to_clean = ['REQUEST' => 'string', 'TRIGGER_STATE' => 'string',
+            'REMOTE_MESSAGE' => 'string', 'RESULT_STATE' => 'string',
+            'RESPONSE' => 'string'];
         $user_id = $_SESSION['USER_ID'];
-        $intents = $bot_model->getIntents($user_id);
-        foreach ($intents as $intent) {
-            $data['INTENT_LISTS'][$intent['INTENT_ID']]=$intent['INTENT'];
-        }
-        $data['BOT_INTENT'] = "";
-        $data['BOT_ENTITY_NAME'] = "";
-        $data['BOT_ENTITY_VALUE'] = "";
-        if (isset($_REQUEST['BOT_INTENT'])) {
-            $intent = $_REQUEST['BOT_INTENT'];
-        }
-        if (isset($_REQUEST['BOT_ENTITY_NAME'])) {
-            $entity_name = $_REQUEST['BOT_ENTITY_NAME'];
-        }
-        if (isset($_REQUEST['BOT_ENTITY_VALUE'])) {
-            $entity_value = $_REQUEST['BOT_ENTITY_VALUE'];
+        $remote_call_pattern =
+            '/^[a-zA-Z]\w+\s*\(\s*(\$\w+(\,\s*\$\w+)*)?\)\;?$/';
+        $data["PATTERN_FORM_TYPE"] = (empty($_REQUEST['pattern_form_type']) ||
+            !in_array($_REQUEST['pattern_form_type'],
+            ["addpattern", "editpattern"]) ) ?  "addpattern" :
+            $_REQUEST['pattern_form_type'];
+        $pattern = [];
+        if (!empty($_REQUEST['pattern_id'])) {
+            $pattern_id = $parent->clean($_REQUEST['pattern_id'], "int");
+            $pattern = $bot_model->getPatternById($pattern_id);
+            if (empty($pattern)) {
+                return $parent->redirectWithMessage(
+                    tl('chatbot_component_bot_lookup_error'));
+            }
+            foreach ($data["CURRENT_PATTERN"]  as $field => $value) {
+                $data["CURRENT_PATTERN"][$field] = $pattern[strtoupper($field)];
+            }
         }
-        $data['INTENT_FORM_TYPE'] = "addintent";
-        $data["ENTITY_FORM_TYPE"] = "addentity";
-        $data["EXPRESSION_FORM_TYPE"] = "addnewexpression";
         if (isset($_REQUEST['arg'])) {
             switch ($_REQUEST['arg']) {
-                case "addintent":
-                    if ($intent != "") {
-                           $bot_model->addIntent($intent);
-                    } else {
-                        $data['SCRIPT'] .= "doMessage('<h1 class=\"red\" >".
-                            tl('chatbot_component_intent_blank').
-                            "</h1>')";
-                    }
-                    break;
-                case "addentity":
-                    $data['option_type'] = "create_entity";
-                    if ($entity_name != "") {
-                        $bot_model->addEntity($entity_name);
-                    } else {
-                        $data['SCRIPT'] .= "doMessage('<h1 class=\"red\" >".
-                            tl('chatbot_component_entity_blank').
-                            "</h1>')";
-                    }
-                    break;
-                case "addnewexpression":
-                    $data['option_type'] = "create_expression";
-                    $to_clean = ["INTENT_ID", 'EXPRESSION'];
-                    $entities = $bot_model->getEntities($user_id);
-                    foreach ($entities as $entity) {
-                        $to_clean[] = $entity['ENTITY_ID'];
-                    }
-                    $must_have = $to_clean;
-                    foreach ($to_clean as $clean_me) {
-                        $r[$clean_me] = (isset($_REQUEST[$clean_me])) ?
-                            trim($parent->clean($_REQUEST[$clean_me],
-                                "string")) : "";
-                    }
-                    $change_exp = $r['EXPRESSION'];
-                    $phrase_string = $r['EXPRESSION'];
-                    foreach ($entities as $entity) {
-                        if($r[$entity['ENTITY_ID']]!="") {
-                            $change_exp = str_replace($r[$entity['ENTITY_ID']],
-                                '&'.$entity['ENTITY_NAME'], $change_exp);
-                            $phrase_string = str_replace(
-                                $r[$entity['ENTITY_ID']], '', $phrase_string);
-                        }
-                    }
-                    $bot_model->addExpression($change_exp, $r['INTENT_ID']);
-                    $expression_id = $bot_model->getExpressionId(
-                        $change_exp,$r['INTENT_ID']);
-                    foreach ($entities as $entity) {
-                        if($r[$entity['ENTITY_ID']]!="") {
-                            $bot_model->addEntityValue($expression_id,
-                                $r['INTENT_ID'], $entity['ENTITY_ID'],
-                                $r[$entity['ENTITY_ID']]);
-                        }
-                    }
-                    $stop_obj = PhraseParser::getTokenizer(C\DEFAULT_LOCALE);
-                    if ($stop_obj && method_exists($stop_obj,
-                            "stopwordsRemover")) {
-                        $phrase_string = $stop_obj->stopwordsRemover(
-                            $phrase_string);
-                    }
-                    $terms = PhraseParser::stemTerms($phrase_string,
-                        C\DEFAULT_LOCALE);
-                    foreach ($terms as $term) {
-                        $bot_model->addTermFrequency($term, $r['INTENT_ID']);
-                    }
-                    break;
-                case "editintent":
-                    $data['INTENT_FORM_TYPE'] = "editintent";
-                    $update = false;
-                    if (isset($_REQUEST['id'])) {
-                        $data['id'] = $_REQUEST['id'];
-                        $obj = $bot_model->getIntent($data['id']);
-                        $data['BOT_INTENT'] = $obj['INTENT'];
-                        if(isset($_REQUEST['BOT_INTENT']))
-                            $update = true;
-                    }
-                    if ($update) {
-                        $obj['INTENT_ID'] = $_REQUEST['id'];
-                        $obj['INTENT'] = $intent;
-                        $bot_model->updateIntent($obj);
-                        return $parent->redirectWithMessage(
-                            tl('chatbot_component_intent_modified'));
-                    }
-                    break;
-                case "deleteintent":
-                    if (!isset($_REQUEST['id'])) {
+                case "addpattern":
+                    $data['PATTERN_FORM_TYPE'] = "addpattern";
+                    $num_patterns = $bot_model->countPatterns($user_id);
+                    if ($num_patterns > C\MAX_BOT_PATTERNS) {
                         return $parent->redirectWithMessage(
-                            tl('chatbot_component_no_delete_intent'));
-                    }
-                    $intent_id = $_REQUEST['id'];
-                    $bot_model->deleteIntent($intent_id);
-                    return $parent->redirectWithMessage(
-                        tl('chatbot_component_intent_deleted'));
-                    break;
-                case "editentity":
-                    $data['ENTITY_FORM_TYPE'] = "editentity";
-                    $update = false;
-                    if (isset($_REQUEST['id'])) {
-                        $data['id'] = $_REQUEST['id'];
-                        $obj = $bot_model->getEntity($data['id']);
-                        $data['BOT_ENTITY_NAME'] = $obj['ENTITY_NAME'];
-                        $search_array3[] = ["ID, ENTITY_VALUE", "", "", "ASC"];
-                        $parent->pagingLogic($data, $bot_model, "ENTITY_VALUES",
-                            C\DEFAULT_ADMIN_PAGING_NUM, $search_array3, "",
-                            ["ENTITY_VALUES", [$_REQUEST['id']]]);
-                        if (isset($_REQUEST['BOT_ENTITY_NAME']))
-                            $update=true;
-                    }
-                    if ($update) {
-                        $obj['ENTITY_ID'] = $_REQUEST['id'];
-                        $obj['ENTITY_NAME'] = $entity_name;
-                        $obj['ENTITY_VALUE'] = $entity_value;
-                        $bot_model->updateEntity($obj);
-                        return $parent->redirectWithMessage(
-                            tl('chatbot_component_entity_modified'));
-                    }
-                    break;
-                case "deleteentity":
-                    if (!isset($_REQUEST['id'])) {
-                        return $parent->redirectWithMessage(
-                            tl('chabot_component_no_delete_entity'));
-                    }
-                    $entity_id = $_REQUEST['id'];
-                    $bot_model->deleteEntity($entity_id);
+                            tl('chatbot_component_max_patterns_exceeded'));
+                    }
+                    $p = [];
+                    foreach ($to_clean as $clean_me => $type) {
+                        $lower_clean = strtolower($clean_me);
+                        if (in_array($clean_me, $must_have) &&
+                            empty($_REQUEST[$lower_clean])) {
+                            return $parent->redirectWithMessage(
+                                tl('chatbot_component_missing_required'));
+                        }
+                        $p[$clean_me] = (empty($_REQUEST[$lower_clean])) ?
+                            $data["CURRENT_PATTERN"][$lower_clean] :
+                            trim($parent->clean($_REQUEST[$lower_clean],$type));
+                        $data["CURRENT_PATTERN"][$lower_clean] =
+                            $p[$clean_me];
+                    }
+                    $bot_model->addPattern($user_id, $p['REQUEST'],
+                        $p['TRIGGER_STATE'], $p['REMOTE_MESSAGE'],
+                        $p['RESULT_STATE'], $p['RESPONSE']);
                     return $parent->redirectWithMessage(
-                        tl('chatbot_component_entity_deleted'));
+                        tl('chatbot_component_pattern_added'),
+                        ['PATTERN_FORM_TYPE']);
                     break;
-                case "editexpression":
-                    $data['EXPRESSION_FORM_TYPE'] = "editexpression";
-                    $update = false;
-                    $obj = "";
-                    $entity_matches = [];
-                    if (isset($_REQUEST['id'])) {
-                        $data['id'] = $_REQUEST['id'];
-                        $obj = $bot_model->getExpression($data['id']);
-                        foreach ($data['CURRENT_STORY'] as $field => $value) {
-                            $upper_field = strtoupper($field);
-                            if (isset($_REQUEST[$field])) {
-                                $obj[$upper_field] = $_REQUEST[$field];
-                                $data['CURRENT_STORY'][$field] =
-                                    $obj[$upper_field];
-                                $update = true;
-                            } else if (isset($obj[$upper_field])){
-                                $data['CURRENT_STORY'][$field] =
-                                    $obj[$upper_field];
-                            }
-                        }
-                        $intent_id = $obj['INTENT_ID'];
-                        $expressions = $bot_model->getExpressions($intent_id);
-                        $phrase_string = $obj['EXPRESSION'];
-                        $stop_obj = PhraseParser::getTokenizer(
-                            C\DEFAULT_LOCALE);
-                        if ($stop_obj && method_exists($stop_obj,
-                                "stopwordsRemover")) {
-                            $phrase_string = $stop_obj->stopwordsRemover(
-                                $phrase_string);
-                        }
-                        foreach ($expressions as $expression) {
-                            $entity_names = [];
-                            $expression = $stop_obj->stopwordsRemover(
-                                $expression);
-                            if($phrase_string!== $expression) {
-                                if (preg_match_all('/\&\w+/', $expression,
-                                    $matches)) {
-                                    foreach ($matches[0] as $match){
-                                        $expression = str_replace($match,'(.*)'
-                                            ,$expression);
-                                        $match = str_replace('&', '', $match);
-                                        $entity_names[] = $match;
-                                    }
-                                }
-                                if (preg_match_all('/' . trim($expression) .
-                                    '/', $phrase_string, $matches,
-                                    PREG_SET_ORDER, 0)) {
-                                    $i=0;
-                                    foreach (array_slice($matches[0], 1)
-                                             as $match) {
-                                        $entity_id = $bot_model->getEntityId(
-                                            $entity_names[$i], $user_id);
-                                        $data[$entity_names[$i]]=$match;
-                                        $i++;
-                                    }
-                                }
-                            }
-                            if (count($entity_matches)>0) break;
-                        }
-                    }
-                    if ($update) {
-                        $entities = $bot_model->getEntities($user_id);
-                        foreach ($entities as $entity) {
-                            $to_clean[] = $entity['ENTITY_ID'];
-                        }
-                        $must_have = $to_clean;
-                        foreach ($to_clean as $clean_me) {
-                            $r[$clean_me] = (isset($_REQUEST[$clean_me])) ?
-                                trim($parent->clean($_REQUEST[$clean_me],
-                                    "string")) : "";
-                        }
-                        $change_exp=$obj['EXPRESSION'];
-                        $phrase_string=$obj['EXPRESSION'];
-                        foreach ($entities as $entity) {
-                            if ($r[$entity['ENTITY_ID']]!="") {
-                                $change_exp = str_replace(
-                                    $r[$entity['ENTITY_ID']],
-                                    '&'.$entity['ENTITY_NAME'], $change_exp);
-                                $phrase_string = str_replace(
-                                  $r[$entity['ENTITY_ID']], '', $phrase_string);
+                case "editpattern":
+                    $data['PATTERN_FORM_TYPE'] = "editpattern";
+                    $pattern = ["PATTERN_ID" => $pattern_id];
+                    foreach ($data['CURRENT_PATTERN'] as $field => $value) {
+                        $upper_field = strtoupper($field);
+                        if (isset($_REQUEST[$field])) {
+                            $pattern[$upper_field] = $parent->clean(
+                                $_REQUEST[$field], $to_clean[$upper_field]);
+                            if (in_array($upper_field, $must_have) &&
+                                empty($pattern[$upper_field])) {
+                                return $parent->redirectWithMessage(
+                                    tl('chatbot_component_missing_required'));
                             }
+                            $data['CURRENT_PATTERN'][$field] =
+                                $pattern[$upper_field];
+                        } else {
+                            $pattern[$upper_field] = $value;
                         }
-                        $obj['EXPRESSION']=$change_exp;
-                        $bot_model->updateExpression($obj);
-                        $expression_id = $bot_model->getExpressionId(
-                            $change_exp,$r['INTENT_ID']);
-                        foreach ($entities as $entity) {
-                            if ($r[$entity['ENTITY_ID']]!="") {
-                                $bot_model->addEntityValue(
-                                    $expression_id, $r['INTENT_ID'],
-                                    $entity['ENTITY_ID'],
-                                    $r[$entity['ENTITY_ID']]);
-                            }
-                        }
-                        return $parent->redirectWithMessage(
-                            tl('chatbot_component_expression_modified'));
-                    }
-                    break;
-                case "deleteexpression":
-                    if (!isset($_REQUEST['id'])) {
-                        return $parent->redirectWithMessage(
-                            tl('chatbot_component_no_delete_expression'));
                     }
-                    $expression_id = $_REQUEST['id'];
-                    $bot_model->deleteExpression($expression_id);
+                    $bot_model->updatePattern($pattern);
                     return $parent->redirectWithMessage(
-                        tl('chatbot_component_expression_deleted'));
+                        tl('chatbot_component_pattern_updated'),
+                        ['pattern_form_type', 'pattern_id']);
                     break;
-                case "deleteentityvalue":
-                    if (!isset($_REQUEST['id'])) {
+                case "deletepattern":
+                    if (empty($_REQUEST['pattern_id'])) {
                         return $parent->redirectWithMessage(
-                            tl('chatbot_component_no_delete_entityvalue'));
+                            tl('chatbot_component_no_delete_pattern'),
+                            ['PATTERN_FORM_TYPE']);
                     }
-                    $id = $_REQUEST['id'];
-                    $bot_model->deleteEntityValue($id);
+                    $pattern_id = $parent->clean($_REQUEST['pattern_id'],
+                        "int");
+                    $bot_model->deletePattern($pattern_id);
                     return $parent->redirectWithMessage(
-                        tl('chatbot_component_entityvalue_deleted'));
+                        tl('chatbot_component_pattern_deleted'));
                     break;
             }
         }
-                $search_array[]=["INTENT", "", "", "ASC"];
-        $parent->pagingLogic($data, $bot_model, "INTENTS",
-            C\DEFAULT_ADMIN_PAGING_NUM, $search_array, "", ["INTENTS", null]);
-        $search_array1[]=["ENTITY_ID, ENTITY_NAME", "", "", "ASC"];
-        $parent->pagingLogic($data, $bot_model, "ENTITIES",
-            C\DEFAULT_ADMIN_PAGING_NUM, $search_array1, "",["ENTITIES",null]);
-        $search_array2[]=["EXPRESSION, INTENT", "", "", "ASC"];
-        $parent->pagingLogic($data, $bot_model, "EXPRESSIONS",
-            C\DEFAULT_ADMIN_PAGING_NUM, $search_array2, "",
-            ["EXPRESSIONS", null]);
+        $search_array[]=["PATTERN_ID", "", "", "ASC"];
+        $parent->pagingLogic($data, $bot_model, "PATTERNS",
+            C\DEFAULT_ADMIN_PAGING_NUM, $search_array, "", [$user_id]);
         return $data;
     }
 }
diff --git a/src/controllers/components/Component.php b/src/controllers/components/Component.php
index 0835aa99e..e67eb645f 100644
--- a/src/controllers/components/Component.php
+++ b/src/controllers/components/Component.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/controllers/components/CrawlComponent.php b/src/controllers/components/CrawlComponent.php
index 248b496e7..a6409b84f 100644
--- a/src/controllers/components/CrawlComponent.php
+++ b/src/controllers/components/CrawlComponent.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -1330,8 +1330,7 @@ class CrawlComponent extends Component implements CrawlConstants
         } else {
             $data['page_rules'] = "";
         }
-        $allowed_options = ['crawl_time', 'search_time', 'named_entity',
-            'test_options'];
+        $allowed_options = ['crawl_time', 'search_time', 'test_options'];
         if (isset($_REQUEST['option_type']) &&
             in_array($_REQUEST['option_type'], $allowed_options)) {
             $data['option_type'] = $_REQUEST['option_type'];
@@ -1341,35 +1340,24 @@ class CrawlComponent extends Component implements CrawlConstants
         if ($data['option_type'] == 'crawl_time') {
             $data['crawl_time_active'] = "active";
             $data['search_time_active'] = "";
-            $data['named_entity_active'] = "";
             $data['test_options_active'] = "";
             $data['SCRIPT'] .= "\nswitchTab('crawltimetab',".
-                "'searchtimetab', 'namedentitytab', 'testoptionstab')\n";
+                "'searchtimetab', 'testoptionstab')\n";
         } else if ($data['option_type'] == 'search_time') {
             $data['search_time_active'] = "active";
             $data['crawl_time_active'] = "";
-            $data['named_entity_active'] = "";
             $data['test_options_active'] = "";
             $data['SCRIPT'] .= "\nswitchTab('searchtimetab',".
-                "'crawltimetab', 'namedentitytab', 'testoptionstab')\n";
-        } else if ($data['option_type'] == 'named_entity') {
-            $data['search_time_active'] = "";
-            $data['crawl_time_active'] = "";
-            $data['named_entity_active'] = "active";
-            $data['test_options_active'] = "";
-            $data['SCRIPT'] .= "\nswitchTab('namedentitytab'," .
-                "'crawltimetab', 'searchtimetab', 'testoptionstab');\n";
+                "'crawltimetab', 'testoptionstab')\n";
         } else {
             $data['search_time_active'] = "";
             $data['crawl_time_active'] = "";
-            $data['named_entity_active'] = "";
             $data['test_options_active'] = "active";
             $data['SCRIPT'] .= "\nswitchTab('testoptionstab',".
-                "'crawltimetab', 'searchtimetab', 'namedentitytab');\n";
+                "'crawltimetab', 'searchtimetab');\n";
         }
         $crawl_model->setSeedInfo($seed_info);
-        if ($change == true && $data['option_type'] != 'test_options' &&
-            $data['option_type'] != 'named_entity') {
+        if ($change == true && $data['option_type'] != 'test_options') {
             return $parent->redirectWithMessage(
                 tl('crawl_component_page_options_updated'),
                 ["option_type"], true);
@@ -1542,9 +1530,8 @@ class CrawlComponent extends Component implements CrawlConstants
                         substr($site[self::DESCRIPTION], 0,
                         C\AD_HOC_TITLE_LENGTH), $lang);
                 }
-                $word_lists =
-                    PhraseParser::extractPhrasesInLists($phrase_string,
-                        $lang);
+                $word_lists = PhraseParser::extractPhrasesInLists(
+                    $phrase_string, $lang);
                 $len = strlen($phrase_string);
                 if (PhraseParser::computeSafeSearchScore(
                     $word_lists['WORD_LIST'], $len) < 0.012) {
@@ -1572,35 +1559,7 @@ class CrawlComponent extends Component implements CrawlConstants
             $data['PROCESS_TIMES']['TOTAL'] = L\changeInMicrotime($start_time);
             $data['PROCESS_TIMES'] = array_merge($data['PROCESS_TIMES'],
                 $word_lists['TIMES']);
-        } else if ($data['option_type'] == 'named_entity') {
-            $data= array_merge($data, CrawlComponent::addNamedEntites($data));
-        }
-        $languages = $parent->model("locale")->getLocaleList();
-        foreach ($languages as $language) {
-            $data['LOCALES'][$language['LOCALE_TAG']] =
-                $language['LOCALE_NAME'];
-        }
-        $entity_model = $parent->model("entity");
-        $locale_model = $parent->model("locale");
-        $locale_tag = L\getLocaleTag();
-        $data['CURRENT_LOCALE_TAG'] =
-        !empty($_REQUEST['LOCALE_TAG']) ? $_REQUEST['LOCALE_TAG'] : $locale_tag;
-        //$locale_tag = $data['CURRENT_LOCALE_TAG'];
-        $locale_tag = $data['CURRENT_LOCALE_TAG'];
-        $data['CURRENT_LOCALE_NAME'] =
-            $locale_model->getLocaleName($locale_tag);
-        $data['ENTITIES'] = $entity_model->viewAll($locale_tag);
-        $data['NUM_ENTITIES_SHOW'] = 100;
-        $data['TOTAL_ENTITIES'] = count($data['ENTITIES']);
-        $data['LIMIT'] = (isset($_REQUEST['limit'])) ?
-            min($parent->clean($_REQUEST['limit'], 'int'),
-            $data['TOTAL_ENTITIES']) : 0;
-        $data['ENTITIES'] = array_slice($data['ENTITIES'],
-            $data['LIMIT'], $data['NUM_ENTITIES_SHOW']);
-        $data['upload_options'] = [tl('pageoptions_element_actions'),
-         tl('pageoptions_element_add_entity'),
-         tl('pageoptions_element_file_upload')];
-        $data['entity_default'] = [tl('pageoptions_element_actions')];
+        }
         return $data;
     }
     /**
@@ -2141,39 +2100,4 @@ class CrawlComponent extends Component implements CrawlConstants
             "switchSourceType()";
         return $data;
     }
-    /**
-     *
-     * @param array $data
-     */
-    public function addNamedEntites($data)
-    {
-        $parent = $this->parent;
-        $entity_model = $parent->model("entity");
-        $locale_model = $parent->model("locale");
-        if (isset($_REQUEST['ENTITY_NAME'])) {
-            $entity = $_REQUEST['ENTITY_NAME'];
-            $locale = $_REQUEST['LOCALE_TAG'];
-            $entity_model->addEntity($entity, $locale);
-        } else if (isset($_FILES['ENTITY_FILE'])) {
-            $file_name = $_FILES['ENTITY_FILE']['tmp_name'];
-            if (!empty($file_name)) {
-                $locale = $_REQUEST['LOCALE_TAG'];
-                $entity_model->addEntities($file_name, $locale);
-            }
-        } else {
-            if (!empty($_REQUEST['arg'])) {
-                switch ($_REQUEST['arg']) {
-                    case 'deleteentities':
-                        if (isset($_REQUEST['value']) &&
-                            isset($_REQUEST['LOCALE_TAG'])) {
-                            $entity = $_REQUEST['value'];
-                            $locale = $_REQUEST['LOCALE_TAG'];
-                            $entity_model->deleteEntity($entity, $locale);
-                        }
-                        break;
-                }
-            }
-        }
-        return $data;
-    }
 }
diff --git a/src/controllers/components/SocialComponent.php b/src/controllers/components/SocialComponent.php
index 84cdf46d7..6ff7213c1 100644
--- a/src/controllers/components/SocialComponent.php
+++ b/src/controllers/components/SocialComponent.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -1300,29 +1300,13 @@ class SocialComponent extends Component implements CrawlConstants
                             'GROUP_ID' => $group_id
                         ];
                     }
-                    $title = "-- ".$parent_item['TITLE'];
+                    $title = "-- " . $parent_item['TITLE'];
                     $id = $group_model->addGroupItem($parent_item["ID"],
                         $group_id, $user_id, $title, $description);
-                    $bot_followers = $group_model->getGroupBots($group_id);
-                    $bots = [];
-                    $bots_called = [];
-                    $post_followed = "";
-                    foreach ($bot_followers as $bot_follower) {
-                        $bots[] = $bot_follower['USER_NAME'];
-                    }
-                    if (preg_match_all('/(?<!\w)@(\w+) (.*)/si', $description,
-                        $matches)) {
-                        foreach ($matches[1] as $match) {
-                            $match = mb_strtolower($match);
-                            $index = array_search($match, $bots);
-                            if ($index !== false) {
-                                $bots_called[] = $bot_followers[$index];
-                            }
-                        }
-                        $post_followed = $matches[2][0];
-                    }
+                    list($bots_called, $post_parts) =
+                        $this->getRequestedBots($group_id, $description);
                     $result = $this->handleResourceUploads(
-                            $group_id, "post".$id);
+                            $group_id, "post" . $id);
                     if ($result == self::UPLOAD_FAILED) {
                         return $parent->redirectWithMessage(
                             tl('social_component_upload_error'));
@@ -1355,42 +1339,10 @@ class SocialComponent extends Component implements CrawlConstants
                             $message .= $body;
                             $server->send($subject, C\MAIL_SENDER,
                                 $follower['EMAIL'], $message);
-                        } else {
-                            //call bot URL
-                            $index = array_search($follower['USER_NAME'],
-                                $bots);
-                            $bots_called[] = $bot_followers[$index];
                         }
                     }
-                    $num_bots = count($bots_called);
-                    $sites = [];
-                    $post_data = [];
-                    $time = time();
-                    for ($i = 0; $i < $num_bots; $i++) {
-                        $intent = $this->classifyIntent(
-                            $post_followed,$bots_called[$i]['USER_ID']);
-                        $intent_name=$intent['INTENT'];
-                        $entities = $this->extractEntities($post_followed,
-                            $intent_name, $bots_called[$i]['USER_ID']);
-                        $sites[$i][CrawlConstants::URL] =
-                            $bots_called[$i]['CALLBACK_URL'];
-                        $post_data[$i] =
-                            "a=$intent_name&post=$post_followed&bot_token=" .
-                            hash("sha256", $bots_called[$i]['BOT_TOKEN'] .
-                                $time . $post_followed) . "*" . $time .
-                            "&bot_name=". $bots_called[$i]['USER_NAME'].
-                            "&entities=".serialize($entities);
-                    }
-                    $outputs = [];
-                    if (count($sites) > 0) {
-                        $outputs = FetchUrl::getPages($sites, false, 0, null,
-                            self::URL, self::PAGE, true, $post_data);
-                    }
-                    foreach ($outputs as $index => $output) {
-                        $id = $group_model->addGroupItem($parent_item["ID"],
-                            $group_id, $bots_called[$index]['USER_ID'],
-                            $title, $output["q"]);
-                    }
+                    $this->addAnyBotResponses($parent_item["ID"], $group_id,
+                        $bots_called, $title, $post_parts);
                     return $parent->redirectWithMessage(
                         tl('social_component_comment_added'));
                     break;
@@ -1480,8 +1432,7 @@ class SocialComponent extends Component implements CrawlConstants
                             tl('social_component_need_title_description'));
                     }
                     $group_id = $parent->clean($_REQUEST['group_id'], "int");
-                    $group =
-                        $group_model->getGroupById($group_id,
+                    $group = $group_model->getGroupById($group_id,
                         $user_id, true);
                     $new_thread = [C\GROUP_READ_WRITE, C\GROUP_READ_WIKI];
                     if (!$group || ($group["OWNER_ID"] != $user_id &&
@@ -1492,8 +1443,10 @@ class SocialComponent extends Component implements CrawlConstants
                     }
                     $thread_id = $group_model->addGroupItem(0,
                         $group_id, $user_id, $title, $description);
+                    list($bots_called, $post_parts) =
+                        $this->getRequestedBots($group_id, $description);
                     $result = $this->handleResourceUploads(
-                            $group_id, "post".$thread_id);
+                            $group_id, "post" . $thread_id);
                     if ($result == self::UPLOAD_FAILED) {
                         return $parent->redirectWithMessage(
                             tl('social_component_upload_error'));
@@ -1531,6 +1484,8 @@ class SocialComponent extends Component implements CrawlConstants
                                 $follower['EMAIL'], $message);
                         }
                     }
+                    $this->addAnyBotResponses($thread_id, $group_id,
+                        $bots_called, "--" . $title, $post_parts);
                     return $parent->redirectWithMessage(
                         tl('social_component_thread_created'));
                     break;
@@ -1802,6 +1757,196 @@ class SocialComponent extends Component implements CrawlConstants
         $this->initializeWikiEditor($data, -1);
         return $data;
     }
+    /**
+     * Determines a list of posts that might need to reply to a post in
+     * a group
+     *
+     * @param int $group_id get chat bots following this group
+     * @param string $description post message to see if called any bots
+     *      by using a phrase like: @bot_name some request
+     * @return array [array of bots referred to in post, array of post
+     *      portions for each robot]
+     */
+    private function getRequestedBots($group_id, $description)
+    {
+        $parent = $this->parent;
+        $group_model = $parent->model("group");
+        $bot_followers = $group_model->getGroupBots($group_id);
+        $bots = [];
+        $bots_called = [];
+        $post_parts = [];
+        foreach ($bot_followers as $bot_follower) {
+            $bots[] = $bot_follower['USER_NAME'];
+        }
+        if (preg_match_all('/(?<!\w)@(\w+)\s([^@]*)/si', $description,
+            $matches)) {
+            foreach ($matches[1] as $match) {
+                $match = mb_strtolower($match);
+                $index = array_search($match, $bots);
+                if ($index !== false) {
+                    $bots_called[] = $bot_followers[$index];
+                } else {
+                    $bots_called[] = null;
+                }
+            }
+            $post_parts = $matches[2];
+        }
+        return [$bots_called, $post_parts];
+    }
+    /**
+     * This follows up to the thread post $thread_id to $group_id any
+     * response that $bots following this group might have
+     *
+     * @param int $thread_id id of the thread post to follow up
+     * @param int $group_id of group thread post was posted to
+     * @param array $bots list of chat bot users following group
+     * @param string $title title of thread post to follow up
+     * @param array $posts for each bot the contents of message applicable
+     *      to that bot
+     */
+    private function addAnyBotResponses($thread_id, $group_id, $bots, $title,
+        $posts)
+    {
+        $parent = $this->parent;
+        $group_model = $parent->model("group");
+        $num_bots = count($bots);
+        $sites = [];
+        $post_data = [];
+        $time = time();
+        $user_id = (empty($_SESSION['USER_ID'])) ? C\PUBLIC_USER_ID:
+            $_SESSION['USER_ID'];
+        $user_name = (empty($_SESSION['USER_NAME'])) ? "PUBLIC" :
+            $_SESSION['USER_NAME'];
+        if (empty($_SESSION["CHAT_BOT_STATES"])) {
+            $_SESSION["CHAT_BOT_STATES"] = [];
+        }
+        for ($i = 0; $i < $num_bots; $i++) {
+            if (empty($bots[$i]['USER_ID'])) {
+                continue;
+            }
+            $bot_id = $bots[$i]['USER_ID'];
+            if (empty($_SESSION["CHAT_BOT_STATES"][$bot_id])) {
+                $_SESSION["CHAT_BOT_STATES"][$bot_id] = "0";
+            }
+            $bots[$i]['PATTERN'] =
+                $this->computeBotPattern($bot_id, $posts[$i]);
+            if (!empty($bots[$i]['PATTERN'])) {
+                $bots[$i]['PATTERN']['VARS']['REMOTE_MESSAGE'] =
+                    $this->interpolateBotVariables(
+                    $bots[$i]['PATTERN']['REMOTE_MESSAGE'],
+                    $bots[$i]['PATTERN']['VARS']);
+            }
+            if (empty($bots[$i]['PATTERN']['VARS']['REMOTE_MESSAGE'])) {
+                $sites[$i] = [];
+            } else {
+                $sites[$i][CrawlConstants::URL] = $bots[$i]['CALLBACK_URL'];
+                $post_data[$i] = "remote_message=".
+                    urlencode($bots[$i]['PATTERN']['VARS']['REMOTE_MESSAGE']) .
+                    "&post=" . urlencode($posts[$i]) . "&bot_token=" .
+                    hash("sha256", $bots[$i]['BOT_TOKEN'] .
+                        $time . $posts[$i]) . "*" . $time .
+                    "&bot_name=" . $bots[$i]['USER_NAME'];
+            }
+        }
+        $outputs = [];
+        if (count($sites) > 0) {
+            $outputs = FetchUrl::getPages($sites, false, 0, null,
+                self::URL, self::PAGE, true, $post_data);
+        }
+        for ($i = 0;  $i < $num_bots; $i++) {
+            if (!empty($bots[$i]['PATTERN']) &&
+                isset($outputs[$i][self::PAGE]) ) {
+                $bots[$i]['PATTERN']['VARS']['REMOTE_RESPONSE'] =
+                    $outputs[$i][self::PAGE];
+            }
+        }
+        foreach ($bots as $bot) {
+            if (empty($bot['PATTERN'])) {
+                continue;
+            }
+            $bot_id = $bot['USER_ID'];
+            $result_state = $this->interpolateBotVariables(
+                $bot['PATTERN']['RESULT_STATE'],
+                $bot['PATTERN']['VARS']);
+            $_SESSION["CHAT_BOT_STATES"][$bot_id] = (empty($result_state)) ?
+                "0" : $result_state;
+            $bot['PATTERN']['VARS']['RESULT_STATE'] = $result_state;
+            $response = $this->interpolateBotVariables(
+                $bot['PATTERN']['RESPONSE'],
+                $bot['PATTERN']['VARS']);
+            if (!empty($response)) {
+                $group_model->addGroupItem($thread_id,
+                    $group_id, $bot_id, $title, $response);
+            }
+        }
+    }
+    /**
+     * Determines which, if any, chat bot patterns of chat bot $bot_id are
+     * applicable to the post $post given the current state of the chat bot
+     * for the user who made $post.
+     *
+     * @param int $bot_id of chat bot to look for applicable pattern
+     * @param string $post messages to compare against pattern request
+     *      expressions
+     * @return array $pattern first pattern that matches. Its ['VARS'] field
+     *      will contain any binding values that were made to make the match
+     */
+    private function computeBotPattern($bot_id, $post)
+    {
+        $parent = $this->parent;
+        $bot_model = $parent->model("bot");
+        $total = 0;
+        $patterns = $bot_model->getRows(0, C\MAX_BOT_PATTERNS,
+            $total, [], [$bot_id]);
+        if (empty($patterns)) {
+            return [];
+        }
+        $post = preg_replace("/" . C\PUNCT . "/", " ", $post);
+        $post = trim(preg_replace("/\s+/mu", " ", $post));
+        foreach ($patterns as $pattern) {
+            $request = $pattern['REQUEST'];
+            $num_vars = preg_match_all('/\$(\w+)/', $request, $var_matches);
+            $request = preg_replace('/\$\w+/', "dzqqzd", $request);
+            $request = preg_replace("/" . C\PUNCT . "/", " ", $request);
+            $request = trim(preg_replace('/\s+/mu', " ", $request));
+            $request = preg_quote($request);
+            $request = preg_replace('/dzqqzd/', "(.+)", $request);
+            $num_matches = preg_match("/$request/iu", $post, $matches);
+            if ($num_matches > 0) {
+                array_shift($matches);
+                $bot_variables = array_combine($var_matches[1], $matches);
+                if (!empty($_SESSION['USER_NAME'])) {
+                    $bot_variables['USER_NAME'] = $_SESSION['USER_NAME'];
+                }
+                $state = $this->interpolateBotVariables(
+                    $pattern['TRIGGER_STATE'], $bot_variables);
+                if ($_SESSION["CHAT_BOT_STATES"][$bot_id] == $state) {
+                    $pattern['VARS'] = $bot_variables;
+                    return $pattern;
+                }
+            }
+        }
+        return [];
+    }
+    /**
+     * Given a string $to_interpolate with variables in it (strings of word
+     * characters beginning with a $) and given an array of variable =>
+     * value, replaces the variables in $to_inpolate with their corresponding
+     * value, returning the resulting string
+     *
+     * @param string $to_interpolate string to replace variables in
+     * @param array $bot_variables sequence of variable => value pairs to
+     *      replace in string.
+     * @return string $to_interpolate after substitutions have been made
+     */
+    private function interpolateBotVariables($to_interpolate, $bot_variables)
+    {
+        foreach ($bot_variables as $var => $value) {
+            $pattern = '/\$' . preg_quote($var) . '/u';
+            $to_interpolate = preg_replace($pattern, $value, $to_interpolate);
+        }
+        return $to_interpolate;
+    }
     /**
      * Used to compute set up a list of feed items to be displayed by the
      * groupFeeds activity
@@ -3385,6 +3530,7 @@ EOD;
              $folder_prefix .= "&amp;sf=" . urlencode($data['SUB_PATH']);
         }
         $url_prefix = $folder_prefix . "&amp;arg=media";
+        $mime_type = L\mimeType($media_name, true);
         $prev_name = ($i < $num_resources &&
             isset($resources[$i - 1]['name'])) ?
             $resources[$i - 1]['name'] : false;
@@ -3393,7 +3539,6 @@ EOD;
         $name_parts = pathinfo($media_name);
         $file_name = $name_parts['filename'];
         $data['MEDIA_NAME'] = $media_name;
-        $mime_type = L\mimeType($media_name, true);
         $page_string = "";
         $data['URL_PREFIX'] = $url_prefix;
         if (!empty($prev_name)) {
@@ -4276,118 +4421,4 @@ EOD;
         }
         $data['SCRIPT'] .= ']; drawFragments();';
     }
-    /**
-     * Intent Classifier for a user's message
-     *
-     * @param $post, the message posted in the group thread
-     * @param $user_id, the bot user to whom the message is posted
-     */
-    public function classifyIntent($post, $user_id)
-    {
-        $phrase_string = $post;
-        $stop_obj = PhraseParser::getTokenizer(C\DEFAULT_LOCALE);
-        if ($stop_obj && method_exists($stop_obj, "stopwordsRemover")) {
-            $phrase_string = $stop_obj->stopwordsRemover($phrase_string);
-        }
-        $terms = PhraseParser::stemTerms($phrase_string, C\DEFAULT_LOCALE);
-        $parent = $this->parent;
-        $bot_model = $parent->model("bot");
-        $intents = $bot_model->getIntents($user_id);
-        $values = [];
-        foreach ($intents as $intent) {
-            $values[$intent['INTENT_ID']] = $this->tfidf($terms,
-                $intent, $intents);
-        }
-        arsort($values);
-        foreach ($values as $key => $val) {
-            return $bot_model->getIntent($key);
-        }
-    }
-    /**
-     * tfidf calculation for each intent
-     *
-     * @param $terms, list of terms
-     * @param $intent, intent
-     * @param $intents, list of intents
-     * @return float $value, calculated tfidf value of intent
-     */
-    public function tfidf($terms, $intent, $intents)
-    {
-        $value=0.0;
-        foreach ($terms as $term) {
-            $idf = $this->idf($term,$intents);
-            $value = $value+($this->tf($term, $intent['INTENT_ID'])*$idf);
-        }
-        return $value;
-    }
-    /**
-     * idf-inverse document frequency calculation for each term in all intents
-     *
-     * @param $term, term
-     * @param $intents, list of intents
-     * @return float $idf, calculated idf value of term
-     */
-    public function idf($term, $intents)
-    {
-        $parent = $this->parent;
-        $bot_model = $parent->model("bot");
-        $total = count($intents);
-        $intent_ids = [];
-        foreach ($intents as $intent) {
-            $intent_ids[] = $intent['INTENT_ID'];
-        }
-        $intentsWithTerm = $bot_model->getIntentsWithTerm($term, $intent_ids);
-        $idf = 1 + log(($total) / ( 1 + $intentsWithTerm ));
-        return $idf;
-    }
-    /**
-     * tf-term frequency calculation for each term in each intent
-     *
-     * @param $term, term
-     * @param $intent, intent
-     * @return float $termFrequency, calculated tf value
-     */
-    public function tf($term, $intent)
-    {
-        $parent = $this->parent;
-        $bot_model = $parent->model("bot");
-        $termFrequency = $bot_model->getTermFrequency($term, $intent);
-        return $termFrequency ? $termFrequency : 0;
-    }
-    /**
-     * Extract entities for a user's message
-     *
-     * @param $post_followed, the message posted in the group thread
-     * @param $intent_name, classified intent
-     * @param $user_id, the bot user to whom the message is posted
-     * @return array $entities, extracted entities
-     */
-    public function extractEntities($post_followed, $intent_name, $user_id)
-    {
-        $entities = [];
-        $parent = $this->parent;
-        $bot_model = $parent->model("bot");
-        $intent_id = $bot_model->getIntentId($intent_name, $user_id);
-        $expressions = $bot_model->getExpressions($intent_id);
-        $phrase_string = $post_followed;
-        $stop_obj = PhraseParser::getTokenizer(C\DEFAULT_LOCALE);
-        if ($stop_obj && method_exists($stop_obj, "stopwordsRemover")) {
-            $phrase_string = $stop_obj->stopwordsRemover($phrase_string);
-        }
-        foreach ($expressions as $expression) {
-            if (preg_match_all('/\&\w+/', $expression, $matches)) {
-                foreach ($matches[0] as $match) {
-                    $expression = str_replace($match,'(.*)',$expression);
-                }
-            }
-            $expression = $stop_obj->stopwordsRemover($expression);
-            if (preg_match_all('/' . trim($expression) . '/', $phrase_string,
-                $matches, PREG_SET_ORDER, 0)) {
-                foreach (array_slice($matches[0], 1) as $match) {
-                    $entities[] = $match;
-                }
-            }
-        }
-        return $entities;
-    }
 }
diff --git a/src/controllers/components/SystemComponent.php b/src/controllers/components/SystemComponent.php
index c098b84d7..937f195ad 100755
--- a/src/controllers/components/SystemComponent.php
+++ b/src/controllers/components/SystemComponent.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/css/editor.css b/src/css/editor.css
index 27fc30ab6..8d1ec83fe 100755
--- a/src/css/editor.css
+++ b/src/css/editor.css
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/css/search.css b/src/css/search.css
index ecb808e4b..d2a8a41c0 100755
--- a/src/css/search.css
+++ b/src/css/search.css
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/data/default.db b/src/data/default.db
index 654fdc0ab..546b596f9 100644
Binary files a/src/data/default.db and b/src/data/default.db differ
diff --git a/src/error.php b/src/error.php
index dd67c7915..c65c7c36e 100755
--- a/src/error.php
+++ b/src/error.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * the SeekQuarry/Yioop Search engine
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/examples/QueryCacher.php b/src/examples/QueryCacher.php
index 373ac2fe1..813504083 100644
--- a/src/examples/QueryCacher.php
+++ b/src/examples/QueryCacher.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/examples/SearchApi.php b/src/examples/SearchApi.php
index ee2006a6d..5900c1bcd 100644
--- a/src/examples/SearchApi.php
+++ b/src/examples/SearchApi.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/examples/StockBot.php b/src/examples/StockBot.php
index 3d204a1e7..f84c23228 100644
--- a/src/examples/StockBot.php
+++ b/src/examples/StockBot.php
@@ -18,15 +18,16 @@
  *  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/>.
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  *  END LICENSE
  *
- * @author Harika Nukala harikanukala9@gmail.com
+ * @author Harika Nukala harikanukala9@gmail.co
+ *      (updated after yahoo stock quotes went dark, by Chris Pollett)
  * @package seek_quarry
  * @subpackage examples
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -40,17 +41,67 @@ namespace seekquarry\yioop\examples\stockbot;
  *     Denote by some_url the url of this folder. If you point your
  *     browser at this folder you should see a message that begins with:
  *     There was a configuration issue with your query.
- * (2) Create a new Yioop User.
- * (3) Under Manage Accounts, click on the lock symbol next to Account Details
- * (4) Check the Bot User check bot, click save.
- * (5) Two form variables should appear: Bot Unique Token and Bot Callback URL.
+ * (2) Under STOCK_URL below change the apikey value to your apikey value
+ *      that you get from https://www.alphavantage.co/
+ * (3) Create a new Yioop User.
+ * (4) Under Manage Accounts, click on the lock symbol next to Account Details
+ * (5) Check the Bot User check bot, click save.
+ * (6) Two form variables should appear: Bot Unique Token and Bot Callback URL.
  *      Fill in a value for Bot Unique Token that matches the value set
- *      for ACCESS_TOKEN in the code within the WeatherBot class.
+ *      for ACCESS_TOKEN in the code within the StockBot class.
  *      Fill in some_url (as defined in step (1)) for the value of Bot Callback
  *      URL
- * (6) Add the the user you created in Yioop to the group that you would like
+ * (7) Add the the user you created in Yioop to the group that you would like
  *     the bot to service. Let the name of this user be user_name.
- * (7) Talk to your bot in yioop in this groups by commenting on an
+ * (8) When logged into the user_name account you should now see a Bot Story
+ *     activity in the activity side bar. Click on Bot Story. This activity
+ *     lets you add patterns that tell your chat bot how to react when it
+ *     sees various expresssions. To demo your bot add the following three
+ *     patterns:
+ *      (a) Request Expression: What is your name?
+ *          Trigger State: 0
+ *          Remote Message:
+ *          Result State: 0
+ *          Response: Stockbot
+ *          This first pattern just says if someone does a query of the form:
+ *          @user_name What is your name?
+ *          your bot should respond with:
+ *          Stockbot
+ *      (b) Request Expression: What is the price of $stock?
+ *          Trigger State: 0
+ *          Remote Message: getStockPrice,$stock
+ *          Result State: 0
+ *          Response: $REMOTE_RESPONSE
+ *          This second pattern will respond to queries of the form
+ *          "What is the price of $stock?" For example,
+ *          What is the price of Tesla?
+ *          It will then use the Bot Callback url to make a request of
+ *          this script where the remote_message variable is set to
+ *          getStockPrice,$stock For example, in the case above,
+ *          getStockPrice,Tesla
+ *          The script below uses alphavantage's Api to get the price for the
+ *          requested stock and generate a response that it
+ *          sends back to the chatbot in a variable $REMOTE_RESPONSE which
+ *          it then uses in its response. This might look like:
+ *          The stock price of TSLA is 294.0900.
+ *      (c) Request Expression: What is the symbol $name?
+ *          Trigger State: 0
+ *          Remote Message: getSymbol,$stock
+ *          Result State: 0
+ *          Response: $REMOTE_RESPONSE
+ *          This last pattern will respond to queries of the form
+ *          "What is the symbol of $name?" For example,
+ *          What is the symbol of Tesla?
+ *          It will then use the Bot Callback url to make a request of
+ *          this script where the remote_message variable is set to
+ *          getSymbol,$name For example, in the case above,
+ *          getSymbol,Tesla
+ *          The script below uses yahoo fincance's Api to get the symbol for the
+ *          requested stock and generate a response that it
+ *          sends back to the chatbot in a variable $REMOTE_RESPONSE which
+ *          it then uses in its response. This might look like:
+ *          TSLA.
+ * (9) Talk to your bot in yioop in this groups by commenting on an
  *     already existing thread with a message beginning with @user_name.
  */
 class StockBot
@@ -62,7 +113,9 @@ class StockBot
     /**
      * Url of site that this bot gets stock price from
      */
-    const STOCK_URL = "http://query.yahooapis.com/v1/public/yql";
+    const STOCK_URL =
+        "https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY".
+        "&apikey=289TVF6Y8CH12BRD&interval=1min&symbol=";
     /**
      * Token given when setting up the bot in Yioop  for callback requests
      * This bots checks that a request from a Yioop Intance  sends
@@ -83,24 +136,25 @@ class StockBot
     {
         $result = "There was a configuration issue with your query.";
         if ($this->checkBotToken() && !empty($_REQUEST['post']) &&
-            !empty($_REQUEST['bot_name']) && !empty($_REQUEST['a'])) {
-            $entities=unserialize($_REQUEST['entities']);
-            $action = $_REQUEST['a'];
-            $result = $this->$action($entities[0]);
-            if (empty($result)) {
-                $result = "I failed to find the stock price for that symbol.\n".
-                    "I respond to queries in the format:\n" .
-                    " @{$_REQUEST['bot_name']} stock price of some_symbol";
+            !empty($_REQUEST['bot_name']) &&
+            !empty($_REQUEST['remote_message'])) {
+            $message = filter_var($_REQUEST['remote_message'],
+                FILTER_SANITIZE_STRING);
+            $args = explode(",", $message);
+            $action = array_shift($args);
+            if (in_array($action, ["getStockPrice", "getSymbol"])) {
+                $result = $this->$action($args);
             }
         }
         echo $result;
     }
     /**
      * This method is used to check a request that it comes from a site
-     * that knows the bot_token in use by this WeatherBot.
+     * that knows the bot_token in use by this StockBot.
      */
     function checkBotToken()
     {
+        return true;
         if (!empty($_REQUEST['bot_token'])) {
             $token_parts = explode("*", $_REQUEST['bot_token']);
             $post = empty($_REQUEST["post"]) ? "" : $_REQUEST["post"];
@@ -121,44 +175,34 @@ class StockBot
     /**
      * Get stock price information for a ticker symbol
      *
-     * @param string $symbol the ticker to get stock price for
+     * @param string $args[0] should be the name to get stock price for
      * @return string stock price information
      */
-    function getStockPrice($name)
+    function getStockPrice($args)
     {
-        $symbol = $this->getSymbol($name);
-        $symbol = '("'.$symbol.'")';
-        $yql_query = "select * from yahoo.finance.quotes where symbol in
-                      $symbol";
-        $url = self::STOCK_URL . "?q=" .
-            urlencode($yql_query) .
-            "&env=store://datatables.org/alltableswithkeys&format=json";
+        $symbol = $this->getSymbol($args);
+        $url = self::STOCK_URL . $symbol;
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
         $data = curl_exec($ch);
         curl_close($ch);
-        $result = json_decode($data);
-        $price = empty($result->query->results->quote->Ask) ?
-            "" : $result->query->results->quote->Ask;
-        $percentChange = empty($result->query->results->quote->PercentChange) ?
-            "" : $result->query->results->quote->PercentChange;
-        if (empty($price) || empty($percentChange)) {
-            return "";
-        }
-        return "The current stock price of $symbol is $price and percentage
-            change is $percentChange.";
+        $result = json_decode($data, true);
+        $time_series = $result["Time Series (1min)"];
+        $most_recent_time = key($time_series);
+        $most_recent_info = $time_series[$most_recent_time];
+        $close = $most_recent_info["4. close"];
+        return "The stock price of $symbol is $close.";
     }
     /**
      * Get ticker symbol for a company name
      *
-     * @param string $name the company name to get ticker symbol for
+     * @param array $args[0] should be the company name to get ticker symbol for
      * @return string ticker symbol
      */
-    function getSymbol($name)
+    function getSymbol($args)
     {
-        $query = $name;
-        $url = self::SYMBOL_URL . "?region=1&query=" . $query ."&lang=en";
+        $url = self::SYMBOL_URL . "?region=1&query=" . $args[0] ."&lang=en";
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@@ -171,4 +215,3 @@ class StockBot
 }
 $bot = new StockBot();
 $bot->processRequest();
-
diff --git a/src/examples/WeatherBot.php b/src/examples/WeatherBot.php
index cf7e351b0..5f7f94719 100644
--- a/src/examples/WeatherBot.php
+++ b/src/examples/WeatherBot.php
@@ -18,15 +18,15 @@
  *  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/>.
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  *  END LICENSE
  *
  * @author Harika Nukala harika.nukala@sjsu.edu
  * @package seek_quarry
  * @subpackage examples
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -42,7 +42,7 @@ namespace seekquarry\yioop\examples\weatherbot;
  *     There was a configuration issue with your query.
  * (2) Create a new Yioop User.
  * (3) Under Manage Accounts, click on the lock symbol next to Account Details
- * (4) Check the Bot User check bot, click save.
+ * (4) Check the Bot User check box, click save.
  * (5) Two form variables should appear: Bot Unique Token and Bot Callback URL.
  *      Fill in a value for Bot Unique Token that matches the value set
  *      for ACCESS_TOKEN in the code within the WeatherBot class.
@@ -50,8 +50,54 @@ namespace seekquarry\yioop\examples\weatherbot;
  *      URL
  * (6) Add the the user you created in Yioop to the group that you would like
  *     the bot to service. Let the name of this user be user_name.
- * (7) Talk to your bot in yioop in this groups by commenting on an
- *     already existing thread with a message beginning with @user_name.
+ * (7) When logged into the user_name account you should now see a Bot Story
+ *     activity in the activity side bar. Click on Bot Story. This activity
+ *     lets you add patterns that tell your chat bot how to react when it
+ *     sees various expresssions. To demo your bot add the following three
+ *     patterns:
+ *      (a) Request Expression: What is your name?
+ *          Trigger State: 0
+ *          Remote Message:
+ *          Result State: 0
+ *          Response: Weatherbot
+ *          This first pattern just says if someone does a query of the form:
+ *          @user_name What is your name?
+ *          your bot should respond with:
+ *          Weatherbot
+ *      (b) Request Expression: What is the weather in $location?
+ *          Trigger State: 0
+ *          Remote Message: getWeather,$location
+ *          Result State: 0
+ *          Response: $REMOTE_RESPONSE
+ *          This second pattern will respond to queries of the form
+ *          "What is the weather in $location?" For example,
+ *          What is the weather in San Jose?
+ *          It will then use the Bot Callback url to make a request of
+ *          this script where the remote_message variable is set to
+ *          getWeather,$location For example, in the case above,
+ *          getWeather,San Jose
+ *          The script below uses Yahoo's Api to get the weather for the
+ *          request location and generate a response that it
+ *          sends back to the chatbot in a variable $REMOTE_RESPONSE which
+ *          it then uses in its response. This might look like:
+ *          The weather is 55 and partly cloudy in San Jose.
+ *      (c) Request Expression: Which is warmer $location1 or $location2?
+ *          Trigger State: 0
+ *          Remote Message: getWarmer,$location1,$location2
+ *          Result State: 0
+ *          Response: $REMOTE_RESPONSE
+ *          This pattern is similar to (b) except it demonstrate that you
+ *          are allowed to have multiple variables in the Request Expression.
+ *          This particular rules matches queries like:
+ *          Which is warmer San Jose or Toronto?
+ *          Sends a request to this script with a remote_message:
+ *          getWarmer,San Jose,Toronto
+ *          This script then generates a response that the bot receives as
+ *          $REMOTE_RESPONSE and the bot echos it:
+ *          San Jose at 56 is warmer than Toronto at 52
+ * (8) Talk to your bot in yioop in this groups by logging in as a different
+ *     user and posting a thread or commenting on a thread in a group you added
+ *     the bot to with a message beginning with @user_name.
  */
 class WeatherBot
 {
@@ -73,20 +119,20 @@ class WeatherBot
     const TIME_WINDOW = 60;
     /**
      * This is the method called to get the WeatherBot to handle an incoming
-     * HTTP request, and echo a weather realted message
+     * HTTP request, and echo a weather related message
      */
     function processRequest()
     {
         $result = "There was a configuration issue with your query.";
         if ($this->checkBotToken() && !empty($_REQUEST['post']) &&
-            !empty($_REQUEST['bot_name']) && !empty($_REQUEST['a'])) {
-            $entities=unserialize($_REQUEST['entities']);
-            $action = $_REQUEST['a'];
-            $result = $this->$action($entities[0]);
-            if (empty($result)) {
-                $result = "I failed to find the weather for that location.\n".
-                    "I respond to queries in the format:\n" .
-                    " @{$_REQUEST['bot_name']} some_location";
+            !empty($_REQUEST['bot_name']) &&
+            !empty($_REQUEST['remote_message'])) {
+            $message = filter_var($_REQUEST['remote_message'],
+                FILTER_SANITIZE_STRING);
+            $args = explode(",", $message);
+            $action = array_shift($args);
+            if (in_array($action, ["getWeather", "getWarmer"])) {
+                $result = $this->$action($args);
             }
         }
         echo $result;
@@ -117,10 +163,63 @@ class WeatherBot
     /**
      * Get weather information about a location
      *
-     * @param string $location the location to get weather updates for
+     * @param array $args[0] should have the location to get weather update for
      * @return string weather information
      */
-    function getWeather($location)
+    function getWeather($args)
+    {
+        $result = $this->getRawWeatherData($args[0]);
+        $temp = empty($result->query->results->channel->item->condition->temp) ?
+            "" : $result->query->results->channel->item->condition->temp;
+        $text = empty($result->query->results->channel->item->condition->text) ?
+            "" : mb_strtolower(
+            $result->query->results->channel->item->condition->text);
+        if (empty($temp) || empty($text)) {
+            return "";
+        }
+        return "The weather is $temp and $text in {$args[0]}.";
+    }
+    /**
+     * Return which location is warmer, the one stored in $args[0] or the
+     * one stored in $args[1]
+     *
+     * @param array $args[0] should have the location to get weather update for
+     * @return string weather information
+     */
+    function getWarmer($args)
+    {
+        if (empty($args[0]) || empty($args[1])) {
+            return "";
+        }
+        $result = $this->getRawWeatherData($args[0]);
+        $tmp0 = empty($result->query->results->channel->item->condition->temp) ?
+            "" : $result->query->results->channel->item->condition->temp;
+        if (empty($tmp0)) {
+            return "";
+        }
+        $result = $this->getRawWeatherData($args[1]);
+        $tmp1 = empty($result->query->results->channel->item->condition->temp) ?
+            "" : $result->query->results->channel->item->condition->temp;
+        if (empty($tmp1)) {
+            return "";
+        }
+        $out = "";
+        if (intval($tmp0) < intval($tmp1)) {
+            $out = "{$args[1]} at $tmp1 is warmer than {$args[0]} at $tmp0";
+        } else if (intval($tmp0) == intval($tmp1)) {
+            $out = "{$args[0]} and {$args[1]} are both $tmp0";
+        } else {
+            $out = "{$args[0]} at $tmp0 is warmer than {$args[1]} at $tmp1";
+        }
+        return $out;
+    }
+    /**
+     * Get json data about a location from weather service
+     *
+     * @param array $location to get weather update for
+     * @return object weather information
+     */
+    function getRawWeatherData($location)
     {
         $yql_query = "select * from weather.forecast where woeid in
             (select woeid from geo.places(1) where text='" . $location
@@ -132,18 +231,8 @@ class WeatherBot
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
         $data = curl_exec($ch);
         curl_close($ch);
-        $result = @json_decode($data);
-        $temp = empty($result->query->results->channel->item->condition->temp) ?
-            "" : $result->query->results->channel->item->condition->temp;
-        $text = empty($result->query->results->channel->item->condition->text) ?
-            "" : mb_strtolower(
-            $result->query->results->channel->item->condition->text);
-        if (empty($temp) || empty($text)) {
-            return "";
-        }
-        return "The weather is $temp and $text in $location.";
+        return @json_decode($data);
     }
 }
 $bot = new WeatherBot();
 $bot->processRequest();
-
diff --git a/src/executables/ArcTool.php b/src/executables/ArcTool.php
index 1f2f15468..80f424aef 100755
--- a/src/executables/ArcTool.php
+++ b/src/executables/ArcTool.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/executables/ClassifierTool.php b/src/executables/ClassifierTool.php
index d0c0de7e7..baac93b67 100755
--- a/src/executables/ClassifierTool.php
+++ b/src/executables/ClassifierTool.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/executables/ClassifierTrainer.php b/src/executables/ClassifierTrainer.php
index 1a50cd2cf..61085c249 100755
--- a/src/executables/ClassifierTrainer.php
+++ b/src/executables/ClassifierTrainer.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/executables/CodeTool.php b/src/executables/CodeTool.php
index f528eff28..4e0c4a145 100755
--- a/src/executables/CodeTool.php
+++ b/src/executables/CodeTool.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -27,8 +27,8 @@
  * replaces.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/executables/Fetcher.php b/src/executables/Fetcher.php
index e5e1ff760..fd81f39cb 100755
--- a/src/executables/Fetcher.php
+++ b/src/executables/Fetcher.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/executables/MediaUpdater.php b/src/executables/MediaUpdater.php
index 68603da22..f2cd220f5 100644
--- a/src/executables/MediaUpdater.php
+++ b/src/executables/MediaUpdater.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/executables/Mirror.php b/src/executables/Mirror.php
index f43c38265..3aa603c15 100644
--- a/src/executables/Mirror.php
+++ b/src/executables/Mirror.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/executables/QueryTool.php b/src/executables/QueryTool.php
index 529c00afd..0cf09c645 100755
--- a/src/executables/QueryTool.php
+++ b/src/executables/QueryTool.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/executables/QueueServer.php b/src/executables/QueueServer.php
index da5dd64f0..cc87316cc 100755
--- a/src/executables/QueueServer.php
+++ b/src/executables/QueueServer.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/index.php b/src/index.php
index 68efc0d16..a449e59f2 100644
--- a/src/index.php
+++ b/src/index.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -28,8 +28,8 @@
  * communication during crawling
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/AnalyticsManager.php b/src/library/AnalyticsManager.php
index 0deb54d68..ff0fa8f20 100644
--- a/src/library/AnalyticsManager.php
+++ b/src/library/AnalyticsManager.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/BTree.php b/src/library/BTree.php
index 5a6214ba3..ee93e640a 100644
--- a/src/library/BTree.php
+++ b/src/library/BTree.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/BloomFilterBundle.php b/src/library/BloomFilterBundle.php
index 127edf361..b1f0c5fc5 100644
--- a/src/library/BloomFilterBundle.php
+++ b/src/library/BloomFilterBundle.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/BloomFilterFile.php b/src/library/BloomFilterFile.php
index 5b4a3fd52..6d9d3c6f9 100755
--- a/src/library/BloomFilterFile.php
+++ b/src/library/BloomFilterFile.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/BrowserRunner.php b/src/library/BrowserRunner.php
index bb9a07e0b..f098d2440 100644
--- a/src/library/BrowserRunner.php
+++ b/src/library/BrowserRunner.php
@@ -13,12 +13,12 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala epinapala@live.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/Bzip2BlockIterator.php b/src/library/Bzip2BlockIterator.php
index 7c5bad235..4e5bb7bed 100644
--- a/src/library/Bzip2BlockIterator.php
+++ b/src/library/Bzip2BlockIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Shawn Tice, (docs added by Chris Pollett chris@pollett.org)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/CrawlConstants.php b/src/library/CrawlConstants.php
index 2026e6e71..7a632d132 100755
--- a/src/library/CrawlConstants.php
+++ b/src/library/CrawlConstants.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/CrawlDaemon.php b/src/library/CrawlDaemon.php
index 137b7bea8..f1f2fab8d 100644
--- a/src/library/CrawlDaemon.php
+++ b/src/library/CrawlDaemon.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/FetchGitRepositoryUrls.php b/src/library/FetchGitRepositoryUrls.php
index 3fdf82dc7..39e399a8b 100755
--- a/src/library/FetchGitRepositoryUrls.php
+++ b/src/library/FetchGitRepositoryUrls.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Snigdha Rao Parvatneni
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/FetchUrl.php b/src/library/FetchUrl.php
index c218e4529..a6fbaf903 100755
--- a/src/library/FetchUrl.php
+++ b/src/library/FetchUrl.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -96,35 +96,35 @@ class FetchUrl implements CrawlConstants
         for ($i = 0; $i < $num_sites; $i++) {
             $is_gopher = false;
             $sites[$i][CrawlConstants::IS_GOPHER_URL] = $is_gopher;
-            $host = @parse_url($sites[$i][$key], PHP_URL_HOST);
-            $local_hosts = ['localhost', '::1', '0.0.0.0',
-                '127.0.0.1'];
-            if (!empty($_SERVER['SERVER_NAME'])) {
-                $local_hosts[] = $_SERVER['SERVER_NAME'];
-                if (substr($_SERVER['SERVER_NAME'], 0, 3) != "www") {
-                    $local_hosts[] = "www." . $_SERVER['SERVER_NAME'];
-                }
-            }
-            if (C\nsdefined("IS_OWN_WEB_SERVER") &&
-                in_array($host, $local_hosts)) {
-                $port = @parse_url($sites[$i][$key], PHP_URL_PORT);
-                if (empty($port)) {
-                    $port = $_SERVER['SERVER_PORT'];
+            if (isset($sites[$i][$key])) {
+                $host = @parse_url($sites[$i][$key], PHP_URL_HOST);
+                $local_hosts = ['localhost', '::1', '0.0.0.0',
+                    '127.0.0.1'];
+                if (!empty($_SERVER['SERVER_NAME'])) {
+                    $local_hosts[] = $_SERVER['SERVER_NAME'];
+                    if (substr($_SERVER['SERVER_NAME'], 0, 3) != "www") {
+                        $local_hosts[] = "www." . $_SERVER['SERVER_NAME'];
+                    }
                 }
-                if ($port == $_SERVER['SERVER_PORT']) {
-                    $sites[$i][0] = "INTERNAL";
-                    if (empty($GLOBALS['web_site'])) {
-                        $sites[$i][$value] = "";
+                if (C\nsdefined("IS_OWN_WEB_SERVER") &&
+                    in_array($host, $local_hosts)) {
+                    $port = @parse_url($sites[$i][$key], PHP_URL_PORT);
+                    if (empty($port)) {
+                        $port = $_SERVER['SERVER_PORT'];
+                    }
+                    if ($port == $_SERVER['SERVER_PORT']) {
+                        $sites[$i][0] = "INTERNAL";
+                        if (empty($GLOBALS['web_site'])) {
+                            $sites[$i][$value] = "";
+                            continue;
+                        }
+                        $web_site = $GLOBALS['web_site'];
+                        $sites[$i][0] = "INTERNAL";
+                        $sites[$i][$value] = $web_site->processInternalRequest(
+                            $sites[$i][$key], !$minimal, $post_data);
                         continue;
                     }
-                    $web_site = $GLOBALS['web_site'];
-                    $sites[$i][0] = "INTERNAL";
-                    $sites[$i][$value] = $web_site->processInternalRequest(
-                        $sites[$i][$key], !$minimal, $post_data);
-                    continue;
                 }
-            }
-            if (isset($sites[$i][$key])) {
                 list($sites[$i][$key], $url, $headers) =
                     self::prepareUrlHeaders($sites[$i][$key], $minimal,
                     $proxy_servers);
diff --git a/src/library/FileCache.php b/src/library/FileCache.php
index adeaccf78..6876b17af 100644
--- a/src/library/FileCache.php
+++ b/src/library/FileCache.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/HashTable.php b/src/library/HashTable.php
index ffac1ef1e..8d5114235 100755
--- a/src/library/HashTable.php
+++ b/src/library/HashTable.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/IndexArchiveBundle.php b/src/library/IndexArchiveBundle.php
index 6f8f36c81..d2343cce0 100644
--- a/src/library/IndexArchiveBundle.php
+++ b/src/library/IndexArchiveBundle.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/IndexDictionary.php b/src/library/IndexDictionary.php
index 86478f610..af324a20b 100644
--- a/src/library/IndexDictionary.php
+++ b/src/library/IndexDictionary.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/IndexManager.php b/src/library/IndexManager.php
index 761987690..af6d718ae 100644
--- a/src/library/IndexManager.php
+++ b/src/library/IndexManager.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/IndexShard.php b/src/library/IndexShard.php
index 7b9f28282..0b24c8df7 100644
--- a/src/library/IndexShard.php
+++ b/src/library/IndexShard.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/JavascriptUnitTest.php b/src/library/JavascriptUnitTest.php
index 33f41e2dd..e147b3f8c 100644
--- a/src/library/JavascriptUnitTest.php
+++ b/src/library/JavascriptUnitTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/Join.php b/src/library/Join.php
index 9110197bb..c58364058 100644
--- a/src/library/Join.php
+++ b/src/library/Join.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/LocaleFunctions.php b/src/library/LocaleFunctions.php
index c15e9b4d3..49dd94d30 100755
--- a/src/library/LocaleFunctions.php
+++ b/src/library/LocaleFunctions.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * are used throughout the web site part of Yioop!
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/MailServer.php b/src/library/MailServer.php
index ad04b5718..d9f82d7da 100644
--- a/src/library/MailServer.php
+++ b/src/library/MailServer.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/MediaConstants.php b/src/library/MediaConstants.php
index 4e6af17c6..241da077b 100644
--- a/src/library/MediaConstants.php
+++ b/src/library/MediaConstants.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/NWordGrams.php b/src/library/NWordGrams.php
index f9242d372..7fb269f54 100644
--- a/src/library/NWordGrams.php
+++ b/src/library/NWordGrams.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Ravi Dhillon ravi.dhillon@yahoo.com, Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/Notifier.php b/src/library/Notifier.php
index 37a9a6bc3..e14a93dc1 100755
--- a/src/library/Notifier.php
+++ b/src/library/Notifier.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/PageRuleParser.php b/src/library/PageRuleParser.php
index 717e29d84..7e031d4b9 100644
--- a/src/library/PageRuleParser.php
+++ b/src/library/PageRuleParser.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/PartialZipArchive.php b/src/library/PartialZipArchive.php
index add8c6213..306bccd62 100644
--- a/src/library/PartialZipArchive.php
+++ b/src/library/PartialZipArchive.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/PersistentStructure.php b/src/library/PersistentStructure.php
index 3818c5167..feddf55ea 100755
--- a/src/library/PersistentStructure.php
+++ b/src/library/PersistentStructure.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/PhraseParser.php b/src/library/PhraseParser.php
index 623884b49..63177a66d 100755
--- a/src/library/PhraseParser.php
+++ b/src/library/PhraseParser.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/PriorityQueue.php b/src/library/PriorityQueue.php
index 22535a63e..4e792765b 100755
--- a/src/library/PriorityQueue.php
+++ b/src/library/PriorityQueue.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/ScraperManager.php b/src/library/ScraperManager.php
index 17777d9e6..59a4b8722 100644
--- a/src/library/ScraperManager.php
+++ b/src/library/ScraperManager.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://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/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -182,4 +182,4 @@ class ScraperManager
         set_error_handler(C\NS_CONFIGS . "yioop_error_handler");
         return $result;
     }
-}
\ No newline at end of file
+}
diff --git a/src/library/StringArray.php b/src/library/StringArray.php
index a77272c5d..2388aaa4f 100755
--- a/src/library/StringArray.php
+++ b/src/library/StringArray.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/SuffixTree.php b/src/library/SuffixTree.php
index f7320fccf..59430075f 100644
--- a/src/library/SuffixTree.php
+++ b/src/library/SuffixTree.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/Thesaurus.php b/src/library/Thesaurus.php
index 9594daf23..77dd37858 100644
--- a/src/library/Thesaurus.php
+++ b/src/library/Thesaurus.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Shailesh Padave shaileshpadave49@gmail.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/Trie.php b/src/library/Trie.php
index 448ac20ee..3021033ed 100644
--- a/src/library/Trie.php
+++ b/src/library/Trie.php
@@ -18,14 +18,14 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sandhya Vissapragada, Chris Pollett (separated out this
  *     code into a separate file and cleaned up)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/UnitTest.php b/src/library/UnitTest.php
index d704246cb..964935bc2 100644
--- a/src/library/UnitTest.php
+++ b/src/library/UnitTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/UpgradeFunctions.php b/src/library/UpgradeFunctions.php
index f8e699e5a..ea8c10f9a 100644
--- a/src/library/UpgradeFunctions.php
+++ b/src/library/UpgradeFunctions.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -28,8 +28,8 @@
  * upgrades between versions
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/UrlParser.php b/src/library/UrlParser.php
index 69b7ae1b1..2ab932772 100755
--- a/src/library/UrlParser.php
+++ b/src/library/UrlParser.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/Utility.php b/src/library/Utility.php
index a814a047f..0c9529911 100755
--- a/src/library/Utility.php
+++ b/src/library/Utility.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * functions
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/VersionFunctions.php b/src/library/VersionFunctions.php
index e6b7f64f1..1c2943ecb 100644
--- a/src/library/VersionFunctions.php
+++ b/src/library/VersionFunctions.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * between different versions of Yioop!
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -1368,7 +1368,7 @@ function upgradeDatabaseVersion50(&$db)
     $private_serial = $private_db->serialType($private_dbinfo);
     $private_db->execute("CREATE TABLE TYPE_KEYS (KEY_ID
         $private_serial PRIMARY KEY $private_auto_increment,
-        TYPE_ID INTEGER, KEY_NAME VARCHAR(30)");
+        TYPE_ID INTEGER, KEY_NAME VARCHAR(30) )");
     $db->execute("CREATE TABLE GROUPS_OLD (GROUP_ID $serial PRIMARY KEY
         $auto_increment, GROUP_NAME VARCHAR(" . C\SHORT_TITLE_LEN."),
         CREATED_TIME VARCHAR(" . C\MICROSECOND_TIMESTAMP_LEN . "),
@@ -1396,7 +1396,8 @@ function upgradeDatabaseVersion50(&$db)
  * Upgrades a Version 50 version of the Yioop! database to a Version 51 version
  * @param object $db datasource to use to upgrade.
  */
-function upgradeDatabaseVersion51(&$db){
+function upgradeDatabaseVersion51(&$db)
+{
     $role_model = new M\RoleModel(C\DB_NAME, false);
     $role_model->db = $db;
     $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST,
@@ -1559,16 +1560,15 @@ function upgradeDatabaseVersion54(&$db)
         }
 }
 /**
- * Upgrades a Version 54 version of the Yioop! database to a Version 55 version
+ * Upgrades a Version 54 version of the Yioop database to a Version 55 version
  * @param object $db datasource to use to upgrade.
  */
 function upgradeDatabaseVersion55(&$db)
 {
     $db->execute("CREATE TABLE LEXICON(
-                TERM VARCHAR(". C\LONG_NAME_LEN ."),
-                LOCALE VARCHAR(" . C\NAME_LEN . "),
-                PART_OF_SPEECH VARCHAR(16), PRIMARY KEY(TERM, LOCALE))");
-
+        TERM VARCHAR(". C\LONG_NAME_LEN ."),
+        LOCALE VARCHAR(" . C\NAME_LEN . "),
+        PART_OF_SPEECH VARCHAR(16), PRIMARY KEY(TERM, LOCALE))");
     // Retrieve the locales added to the Locale table
     $sql = "SELECT LOCALE_TAG from LOCALE";
     $result = $db->execute($sql);
@@ -1610,9 +1610,32 @@ function upgradeDatabaseVersion55(&$db)
             if ($count > 0) {
                 $insert_values = rtrim($insert_values, ',');
                 $query = "INSERT INTO LEXICON (TERM, LOCALE, PART_OF_SPEECH)
-                 VALUES {$insert_values}";
+                    VALUES $insert_values";
                 $db->exec($query);
             }
         }
     }
 }
+/**
+ * Upgrades a Version 55 version of the Yioop! database to a Version 5 version
+ * @param object $db datasource to use to upgrade.
+ */
+function upgradeDatabaseVersion56(&$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 CHAT_BOT_PATTERN(
+        PATTERN_ID $serial PRIMARY KEY $auto_increment,
+        USER_ID  INTEGER,
+        REQUEST VARCHAR(" . C\MAX_DESCRIPTION_LEN ."),
+        TRIGGER_STATE VARCHAR(" . C\NAME_LEN . "),
+        REMOTE_MESSAGE VARCHAR(" . C\MAX_DESCRIPTION_LEN . "),
+        RESULT_STATE VARCHAR(" . C\NAME_LEN . "),
+        RESPONSE VARCHAR(" . C\MAX_DESCRIPTION_LEN ."))");
+    foreach (["INTENT", "EXPRESSION", "ENTITY", "INTENT_EXPRESSION_ENTITY",
+        "BOT_TERM_FREQUENCY"] as $table) {
+        $db->execute("DROP TABLE $table");
+    }
+}
diff --git a/src/library/VersionManager.php b/src/library/VersionManager.php
index dad6b49e0..4245344a1 100644
--- a/src/library/VersionManager.php
+++ b/src/library/VersionManager.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/WebArchive.php b/src/library/WebArchive.php
index 96099cdc3..9052732b5 100755
--- a/src/library/WebArchive.php
+++ b/src/library/WebArchive.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/WebArchiveBundle.php b/src/library/WebArchiveBundle.php
index ab1403098..65ab1e202 100755
--- a/src/library/WebArchiveBundle.php
+++ b/src/library/WebArchiveBundle.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/WebQueueBundle.php b/src/library/WebQueueBundle.php
index d2fb724ec..caf46bd9e 100755
--- a/src/library/WebQueueBundle.php
+++ b/src/library/WebQueueBundle.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/WebSite.php b/src/library/WebSite.php
index 5baa8e0f9..5f83f926e 100644
--- a/src/library/WebSite.php
+++ b/src/library/WebSite.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2018
  * @filesource
  */
diff --git a/src/library/WikiParser.php b/src/library/WikiParser.php
index 582f6b409..621afa46d 100644
--- a/src/library/WikiParser.php
+++ b/src/library/WikiParser.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/archive_bundle_iterators/ArcArchiveBundleIterator.php b/src/library/archive_bundle_iterators/ArcArchiveBundleIterator.php
index 6b1cc2b6f..a939a0895 100644
--- a/src/library/archive_bundle_iterators/ArcArchiveBundleIterator.php
+++ b/src/library/archive_bundle_iterators/ArcArchiveBundleIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/archive_bundle_iterators/ArchiveBundleIterator.php b/src/library/archive_bundle_iterators/ArchiveBundleIterator.php
index b84075701..1ec2146b3 100644
--- a/src/library/archive_bundle_iterators/ArchiveBundleIterator.php
+++ b/src/library/archive_bundle_iterators/ArchiveBundleIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/archive_bundle_iterators/DatabaseBundleIterator.php b/src/library/archive_bundle_iterators/DatabaseBundleIterator.php
index f7bfce16d..c3682751d 100644
--- a/src/library/archive_bundle_iterators/DatabaseBundleIterator.php
+++ b/src/library/archive_bundle_iterators/DatabaseBundleIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/archive_bundle_iterators/MediaWikiArchiveBundleIterator.php b/src/library/archive_bundle_iterators/MediaWikiArchiveBundleIterator.php
index 9ac75dda4..c2a427304 100644
--- a/src/library/archive_bundle_iterators/MediaWikiArchiveBundleIterator.php
+++ b/src/library/archive_bundle_iterators/MediaWikiArchiveBundleIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/archive_bundle_iterators/MixArchiveBundleIterator.php b/src/library/archive_bundle_iterators/MixArchiveBundleIterator.php
index a754a6a92..f4c3925bc 100644
--- a/src/library/archive_bundle_iterators/MixArchiveBundleIterator.php
+++ b/src/library/archive_bundle_iterators/MixArchiveBundleIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/archive_bundle_iterators/OdpRdfArchiveBundleIterator.php b/src/library/archive_bundle_iterators/OdpRdfArchiveBundleIterator.php
index 2ae2ec8dc..9965a25cf 100644
--- a/src/library/archive_bundle_iterators/OdpRdfArchiveBundleIterator.php
+++ b/src/library/archive_bundle_iterators/OdpRdfArchiveBundleIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/archive_bundle_iterators/TextArchiveBundleIterator.php b/src/library/archive_bundle_iterators/TextArchiveBundleIterator.php
index 1bf2835a8..1ca89a46a 100644
--- a/src/library/archive_bundle_iterators/TextArchiveBundleIterator.php
+++ b/src/library/archive_bundle_iterators/TextArchiveBundleIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/archive_bundle_iterators/WarcArchiveBundleIterator.php b/src/library/archive_bundle_iterators/WarcArchiveBundleIterator.php
index 1299444e7..18afd4491 100644
--- a/src/library/archive_bundle_iterators/WarcArchiveBundleIterator.php
+++ b/src/library/archive_bundle_iterators/WarcArchiveBundleIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/archive_bundle_iterators/WebArchiveBundleIterator.php b/src/library/archive_bundle_iterators/WebArchiveBundleIterator.php
index 14c644b2d..712d4a97d 100644
--- a/src/library/archive_bundle_iterators/WebArchiveBundleIterator.php
+++ b/src/library/archive_bundle_iterators/WebArchiveBundleIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/classifiers/BinaryFeatures.php b/src/library/classifiers/BinaryFeatures.php
index 066dea0e5..2877a156f 100644
--- a/src/library/classifiers/BinaryFeatures.php
+++ b/src/library/classifiers/BinaryFeatures.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/classifiers/ChiSquaredFeatureSelection.php b/src/library/classifiers/ChiSquaredFeatureSelection.php
index 6c9897b9e..5c12a8511 100644
--- a/src/library/classifiers/ChiSquaredFeatureSelection.php
+++ b/src/library/classifiers/ChiSquaredFeatureSelection.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/classifiers/Classifier.php b/src/library/classifiers/Classifier.php
index 8a272820e..8f5954d30 100644
--- a/src/library/classifiers/Classifier.php
+++ b/src/library/classifiers/Classifier.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/classifiers/ClassifierAlgorithm.php b/src/library/classifiers/ClassifierAlgorithm.php
index 23a0fdb73..fcba83507 100644
--- a/src/library/classifiers/ClassifierAlgorithm.php
+++ b/src/library/classifiers/ClassifierAlgorithm.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/classifiers/FeatureSelection.php b/src/library/classifiers/FeatureSelection.php
index d155ca297..2b62dbf60 100644
--- a/src/library/classifiers/FeatureSelection.php
+++ b/src/library/classifiers/FeatureSelection.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/classifiers/Features.php b/src/library/classifiers/Features.php
index 2ba25204d..dccde36a3 100644
--- a/src/library/classifiers/Features.php
+++ b/src/library/classifiers/Features.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/classifiers/LassoRegression.php b/src/library/classifiers/LassoRegression.php
index f5fba24db..c03159d04 100644
--- a/src/library/classifiers/LassoRegression.php
+++ b/src/library/classifiers/LassoRegression.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/classifiers/NaiveBayes.php b/src/library/classifiers/NaiveBayes.php
index f8fd88dd0..c62536e3d 100644
--- a/src/library/classifiers/NaiveBayes.php
+++ b/src/library/classifiers/NaiveBayes.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/classifiers/SparseMatrix.php b/src/library/classifiers/SparseMatrix.php
index c3772ea6d..0b8950801 100644
--- a/src/library/classifiers/SparseMatrix.php
+++ b/src/library/classifiers/SparseMatrix.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/classifiers/WeightedFeatures.php b/src/library/classifiers/WeightedFeatures.php
index b05dec25e..618d722e2 100644
--- a/src/library/classifiers/WeightedFeatures.php
+++ b/src/library/classifiers/WeightedFeatures.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/compressors/Compressor.php b/src/library/compressors/Compressor.php
index f9f183b61..30ec503cb 100755
--- a/src/library/compressors/Compressor.php
+++ b/src/library/compressors/Compressor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/compressors/GzipCompressor.php b/src/library/compressors/GzipCompressor.php
index 944bb2160..97a6bd14c 100755
--- a/src/library/compressors/GzipCompressor.php
+++ b/src/library/compressors/GzipCompressor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/compressors/NonCompressor.php b/src/library/compressors/NonCompressor.php
index 52d4238d4..0cc46257e 100755
--- a/src/library/compressors/NonCompressor.php
+++ b/src/library/compressors/NonCompressor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/index_bundle_iterators/DisjointIterator.php b/src/library/index_bundle_iterators/DisjointIterator.php
index 4b91126da..682e7526b 100644
--- a/src/library/index_bundle_iterators/DisjointIterator.php
+++ b/src/library/index_bundle_iterators/DisjointIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/index_bundle_iterators/DocIterator.php b/src/library/index_bundle_iterators/DocIterator.php
index 8b9811aca..a4d89da5f 100755
--- a/src/library/index_bundle_iterators/DocIterator.php
+++ b/src/library/index_bundle_iterators/DocIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/index_bundle_iterators/GroupIterator.php b/src/library/index_bundle_iterators/GroupIterator.php
index 692217384..841524820 100644
--- a/src/library/index_bundle_iterators/GroupIterator.php
+++ b/src/library/index_bundle_iterators/GroupIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -396,7 +396,7 @@ class GroupIterator extends IndexBundleIterator
      * aggregate of the ranks, proximity, and relevance scores, and a count.
      * Stores this information in the first element of the array of pages.
      * This process is described in detail at:
-     * http://www.seekquarry.com/?c=main&p=ranking#search
+     * https://www.seekquarry.com/?c=main&p=ranking#search
      *
      * @param string $hash_url the crawlHash of the url of the page we are
      *      scoring which will be compared with that of the host to see if
diff --git a/src/library/index_bundle_iterators/IndexBundleIterator.php b/src/library/index_bundle_iterators/IndexBundleIterator.php
index fd5bf6385..16041c1df 100644
--- a/src/library/index_bundle_iterators/IndexBundleIterator.php
+++ b/src/library/index_bundle_iterators/IndexBundleIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/index_bundle_iterators/IntersectIterator.php b/src/library/index_bundle_iterators/IntersectIterator.php
index acf4d19ab..5d22d4f2e 100644
--- a/src/library/index_bundle_iterators/IntersectIterator.php
+++ b/src/library/index_bundle_iterators/IntersectIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/index_bundle_iterators/NegationIterator.php b/src/library/index_bundle_iterators/NegationIterator.php
index d8ce9def0..52439b70d 100644
--- a/src/library/index_bundle_iterators/NegationIterator.php
+++ b/src/library/index_bundle_iterators/NegationIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/index_bundle_iterators/NetworkIterator.php b/src/library/index_bundle_iterators/NetworkIterator.php
index 9fd657bb0..7b0ba5880 100644
--- a/src/library/index_bundle_iterators/NetworkIterator.php
+++ b/src/library/index_bundle_iterators/NetworkIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/index_bundle_iterators/UnionIterator.php b/src/library/index_bundle_iterators/UnionIterator.php
index a61768714..a061eb8c7 100644
--- a/src/library/index_bundle_iterators/UnionIterator.php
+++ b/src/library/index_bundle_iterators/UnionIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/index_bundle_iterators/WordIterator.php b/src/library/index_bundle_iterators/WordIterator.php
index d6a308420..1fa4d0cab 100644
--- a/src/library/index_bundle_iterators/WordIterator.php
+++ b/src/library/index_bundle_iterators/WordIterator.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/indexing_plugins/AddressesPlugin.php b/src/library/indexing_plugins/AddressesPlugin.php
index 68c3d67f5..9e2b5cd4d 100644
--- a/src/library/indexing_plugins/AddressesPlugin.php
+++ b/src/library/indexing_plugins/AddressesPlugin.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/indexing_plugins/IndexingPlugin.php b/src/library/indexing_plugins/IndexingPlugin.php
index 3b3222e93..fc831851e 100644
--- a/src/library/indexing_plugins/IndexingPlugin.php
+++ b/src/library/indexing_plugins/IndexingPlugin.php
@@ -19,13 +19,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Priya Gangaraju priya.gangaraju@gmail.com, Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2011 - 2014
  * @filesource
  */
diff --git a/src/library/indexing_plugins/RecipePlugin.php b/src/library/indexing_plugins/RecipePlugin.php
index 102d01620..63cc4ce78 100644
--- a/src/library/indexing_plugins/RecipePlugin.php
+++ b/src/library/indexing_plugins/RecipePlugin.php
@@ -19,14 +19,14 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Priya Gangaraju priya.gangaraju@gmail.com, Chris Pollett
  *     chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2011 -2017
  * @filesource
  */
diff --git a/src/library/indexing_plugins/WordfilterPlugin.php b/src/library/indexing_plugins/WordfilterPlugin.php
index f3add7ac7..5ad5b6b5c 100644
--- a/src/library/indexing_plugins/WordfilterPlugin.php
+++ b/src/library/indexing_plugins/WordfilterPlugin.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/media_jobs/AnalyticsJob.php b/src/library/media_jobs/AnalyticsJob.php
index 331ee5b42..13827679f 100644
--- a/src/library/media_jobs/AnalyticsJob.php
+++ b/src/library/media_jobs/AnalyticsJob.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/media_jobs/BulkEmailJob.php b/src/library/media_jobs/BulkEmailJob.php
index 7c3657279..e91fd1ca5 100644
--- a/src/library/media_jobs/BulkEmailJob.php
+++ b/src/library/media_jobs/BulkEmailJob.php
@@ -18,14 +18,14 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org (initial MediaJob class
  *      and subclasses based on work of Pooja Mishra for her master's)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/media_jobs/FeedsUpdateJob.php b/src/library/media_jobs/FeedsUpdateJob.php
index 38f433393..b68fb6025 100644
--- a/src/library/media_jobs/FeedsUpdateJob.php
+++ b/src/library/media_jobs/FeedsUpdateJob.php
@@ -18,14 +18,14 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org (initial MediaJob class
  *      and subclasses based on work of Pooja Mishra for her master's)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/media_jobs/MediaJob.php b/src/library/media_jobs/MediaJob.php
index 98566893a..c47a422d6 100644
--- a/src/library/media_jobs/MediaJob.php
+++ b/src/library/media_jobs/MediaJob.php
@@ -18,14 +18,14 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org (initial MediaJob class
  *      and subclasses based on work of Pooja Mishra for her master's)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/media_jobs/RecommendationJob.php b/src/library/media_jobs/RecommendationJob.php
index 815583b28..5ccf7ff89 100644
--- a/src/library/media_jobs/RecommendationJob.php
+++ b/src/library/media_jobs/RecommendationJob.php
@@ -18,14 +18,14 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sarika Padmashali padmashalisarika@gmail.com
  * (Reworked so could scale for yioop.com by Chris Pollett)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/media_jobs/VideoConvertJob.php b/src/library/media_jobs/VideoConvertJob.php
index 911873cbd..ba9210516 100644
--- a/src/library/media_jobs/VideoConvertJob.php
+++ b/src/library/media_jobs/VideoConvertJob.php
@@ -18,14 +18,14 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org (initial MediaJob class
  *      and subclasses based on work of Pooja Mishra for her master's)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/BmpProcessor.php b/src/library/processors/BmpProcessor.php
index c68acc769..ca9a1fc51 100644
--- a/src/library/processors/BmpProcessor.php
+++ b/src/library/processors/BmpProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/DocProcessor.php b/src/library/processors/DocProcessor.php
index c914017a3..97b2997ac 100755
--- a/src/library/processors/DocProcessor.php
+++ b/src/library/processors/DocProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/DocxProcessor.php b/src/library/processors/DocxProcessor.php
index 479da1983..56b070098 100644
--- a/src/library/processors/DocxProcessor.php
+++ b/src/library/processors/DocxProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/EpubProcessor.php b/src/library/processors/EpubProcessor.php
index a8e9520f1..2a2afda7f 100644
--- a/src/library/processors/EpubProcessor.php
+++ b/src/library/processors/EpubProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Vijeth Patil vijeth.patil@gmail.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/GifProcessor.php b/src/library/processors/GifProcessor.php
index e7274b65c..a079a2720 100755
--- a/src/library/processors/GifProcessor.php
+++ b/src/library/processors/GifProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/GitXmlProcessor.php b/src/library/processors/GitXmlProcessor.php
index 166fec7c4..349c6bf1f 100755
--- a/src/library/processors/GitXmlProcessor.php
+++ b/src/library/processors/GitXmlProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Snigdha Rao Parvatneni
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/GopherProcessor.php b/src/library/processors/GopherProcessor.php
index fb1f8fb7e..a4be6af6a 100644
--- a/src/library/processors/GopherProcessor.php
+++ b/src/library/processors/GopherProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/HtmlProcessor.php b/src/library/processors/HtmlProcessor.php
index 675574272..a980a76ef 100755
--- a/src/library/processors/HtmlProcessor.php
+++ b/src/library/processors/HtmlProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -350,7 +350,11 @@ class HtmlProcessor extends TextProcessor
      */
     public static function crudeDescription($page)
     {
-        $body = parent::getBetweenTags($page, 0, "<body", "</body");
+        if (stripos($page, "<body") !== false) {
+            $body = parent::getBetweenTags($page, 0, "<body", "</body");
+        } else {
+            $body = [strlen($page) + 1, ">" . $page];
+        }
         $body = preg_replace("/\</", " <", $body);
         $body = strip_tags("<body".$body[1]."</body>");
         if ($body == "") { return $body; }
@@ -381,7 +385,7 @@ class HtmlProcessor extends TextProcessor
                from above code, then concatenate body of doc
                after stripping tags, return result
              */
-            $description .= "\n".self::crudeDescription($page);
+            $description .= "\n" . self::crudeDescription($page);
             return $description;
         }
         /*
diff --git a/src/library/processors/ImageProcessor.php b/src/library/processors/ImageProcessor.php
index 72dd4622f..9205b1312 100755
--- a/src/library/processors/ImageProcessor.php
+++ b/src/library/processors/ImageProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/JavaProcessor.php b/src/library/processors/JavaProcessor.php
index 7a0662ceb..65973c057 100755
--- a/src/library/processors/JavaProcessor.php
+++ b/src/library/processors/JavaProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Snigdha Rao Parvatneni
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/JpgProcessor.php b/src/library/processors/JpgProcessor.php
index 95b70c1dd..35909110d 100755
--- a/src/library/processors/JpgProcessor.php
+++ b/src/library/processors/JpgProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/PageProcessor.php b/src/library/processors/PageProcessor.php
index de02e7b78..445d2e508 100644
--- a/src/library/processors/PageProcessor.php
+++ b/src/library/processors/PageProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/PdfProcessor.php b/src/library/processors/PdfProcessor.php
index 4fccdf38c..bbc178311 100755
--- a/src/library/processors/PdfProcessor.php
+++ b/src/library/processors/PdfProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/PngProcessor.php b/src/library/processors/PngProcessor.php
index f2372a5b3..253fcb89b 100755
--- a/src/library/processors/PngProcessor.php
+++ b/src/library/processors/PngProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/PptProcessor.php b/src/library/processors/PptProcessor.php
index ccce818eb..69a10eb05 100755
--- a/src/library/processors/PptProcessor.php
+++ b/src/library/processors/PptProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/PptxProcessor.php b/src/library/processors/PptxProcessor.php
index 129158873..082b4f342 100644
--- a/src/library/processors/PptxProcessor.php
+++ b/src/library/processors/PptxProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Nakul Natu nakul.natu@gmail.com
- * @license http://www.gnu.org/licenses/ GPLv3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPLv3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/PythonProcessor.php b/src/library/processors/PythonProcessor.php
index 12b1cce05..b618b4bb6 100755
--- a/src/library/processors/PythonProcessor.php
+++ b/src/library/processors/PythonProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Snigdha Rao Parvatneni
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/RobotProcessor.php b/src/library/processors/RobotProcessor.php
index 5e74af1c7..0960339f4 100644
--- a/src/library/processors/RobotProcessor.php
+++ b/src/library/processors/RobotProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/RssProcessor.php b/src/library/processors/RssProcessor.php
index eeaf3c9e0..dc50a86b7 100644
--- a/src/library/processors/RssProcessor.php
+++ b/src/library/processors/RssProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/RtfProcessor.php b/src/library/processors/RtfProcessor.php
index e153d8afd..4e9c8a296 100755
--- a/src/library/processors/RtfProcessor.php
+++ b/src/library/processors/RtfProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/SitemapProcessor.php b/src/library/processors/SitemapProcessor.php
index 42197ccb1..b26284221 100644
--- a/src/library/processors/SitemapProcessor.php
+++ b/src/library/processors/SitemapProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/SvgProcessor.php b/src/library/processors/SvgProcessor.php
index 390ce1c0a..1f38a58a3 100644
--- a/src/library/processors/SvgProcessor.php
+++ b/src/library/processors/SvgProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/TextProcessor.php b/src/library/processors/TextProcessor.php
index 4c7c6e041..901e4ff02 100755
--- a/src/library/processors/TextProcessor.php
+++ b/src/library/processors/TextProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/XlsxProcessor.php b/src/library/processors/XlsxProcessor.php
index 1c2227460..167d7418c 100644
--- a/src/library/processors/XlsxProcessor.php
+++ b/src/library/processors/XlsxProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Tarun Ramaswamy tarun.pepira@gmail.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/processors/XmlProcessor.php b/src/library/processors/XmlProcessor.php
index e11534fec..da3a6faec 100644
--- a/src/library/processors/XmlProcessor.php
+++ b/src/library/processors/XmlProcessor.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/summarizers/CentroidSummarizer.php b/src/library/summarizers/CentroidSummarizer.php
index 355ac8077..8fc24adb1 100644
--- a/src/library/summarizers/CentroidSummarizer.php
+++ b/src/library/summarizers/CentroidSummarizer.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Mangesh Dahale mangeshadahale@gmail.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/summarizers/CentroidWeightedSummarizer.php b/src/library/summarizers/CentroidWeightedSummarizer.php
index fa4dd92d6..6b3b91728 100644
--- a/src/library/summarizers/CentroidWeightedSummarizer.php
+++ b/src/library/summarizers/CentroidWeightedSummarizer.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett (chris@pollett.org)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/summarizers/GraphBasedSummarizer.php b/src/library/summarizers/GraphBasedSummarizer.php
index 954ca110b..87b27a562 100644
--- a/src/library/summarizers/GraphBasedSummarizer.php
+++ b/src/library/summarizers/GraphBasedSummarizer.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://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/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/library/summarizers/ScrapeSummarizer.php b/src/library/summarizers/ScrapeSummarizer.php
index 25a024302..9f1b38293 100644
--- a/src/library/summarizers/ScrapeSummarizer.php
+++ b/src/library/summarizers/ScrapeSummarizer.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://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/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -33,7 +33,8 @@ namespace seekquarry\yioop\library\summarizers;
 use seekquarry\yioop\configs as C;
 use seekquarry\yioop\library\CrawlConstants;
 use seekquarry\yioop\library\PhraseParser;
-use seekquarry\yioop\library\processors\PageProcessor;
+use seekquarry\yioop\library\processors\TextProcessor;
+use seekquarry\yioop\library\processors\HtmlProcessor;

 /**
  * Class which may be used by TextProcessors to get a summary for a text
@@ -87,12 +88,12 @@ class ScrapeSummarizer extends Summarizer
                 $description .= " .. ".$meta->getAttribute('content');
             }
         }
-        if (PageProcessor::$max_description_len > 2 * C\MAX_DESCRIPTION_LEN) {
+        if (TextProcessor::$max_description_len > strlen($page)/1.1) {
             /* if don't need to summarize much, take meta description
                from above code, then concatenate body of doc
                after stripping tags, return result
              */
-            $description .= "\n".self::crudeDescription($page);
+            $description .= "\n" . HtmlProcessor::crudeDescription($page);
             if (self::OUTPUT_TO_FILE) {
                 file_put_contents(C\WORK_DIRECTORY . self::OUTPUT_FILE_PATH,
                     $description);
@@ -104,34 +105,34 @@ class ScrapeSummarizer extends Summarizer
           the limit of description length. Choose tags in order of likely
           importance to this doc
         */
-        $page_parts = ["/html//p[1]",
-            "/html//div[1]", "/html//p[2]", "/html//div[2]", "/html//p[3]",
-            "/html//div[3]", "/html//p[4]", "/html//div[4]",
-            "/html//td", "/html//li", "/html//dt", "/html//dd",
-            "/html//pre", "/html//a", "/html//article",
-            "/html//section", "/html//cite"];
+        $page_parts = ["//p[1]",
+            "//div[1]", "//p[2]", "//div[2]", "//p[3]",
+            "//div[3]", "//p[4]", "//div[4]",
+            "//td", "//li", "//dt", "//dd",
+            "//pre", "//a", "//article",
+            "//section", "//cite"];
         $para_data = [];
         $len = 0;
         foreach ($page_parts as $part) {
             $doc_nodes = $xpath->evaluate($part);
             foreach ($doc_nodes as $node) {
-                if ($part == "/html//a") {
+                if ($part == "//a") {
                     $content = $node->getAttribute('href')." = ";
-                    $add_len  = min(PageProcessor::$max_description_len / 2,
+                    $add_len  = min(TextProcessor::$max_description_len / 2,
                         mb_strlen($content));
                     $para_data[$add_len][] = mb_substr($content, 0, $add_len);
                 }
-                $node_text = self::domNodeToString($node);
-                $add_len  = min(PageProcessor::$max_description_len / 2,
+                $node_text = HtmlProcessor::domNodeToString($node);
+                $add_len  = min(TextProcessor::$max_description_len / 2,
                     mb_strlen($node_text));
                 $para_data[$add_len][] = mb_substr($node_text, 0, $add_len);
                 $len += $add_len;
-                if ($len > PageProcessor::$max_description_len) {
+                if ($len > TextProcessor::$max_description_len) {
                     break 2;
                 }
-                if (in_array($part, ["/html//p[1]", "/html//div[1]",
-                    "/html//div[2]", "/html//p[2]", "/html//p[3]",
-                    "/html//div[3]", "/html//div[4]", "/html//p[4]"])){
+                if (in_array($part, ["//p[1]", "//div[1]",
+                    "//div[2]", "//p[2]", "//p[3]",
+                    "//div[3]", "//div[4]", "//p[4]"])) {
                     break;
                 }
             }
@@ -162,36 +163,4 @@ class ScrapeSummarizer extends Summarizer
         }
         return $description;
     }
-    /**
-     * Returns summary of body of a web page based on crude regex matching
-     *     used as a fall back if dom parsing did not work.
-     *
-     * @param string $page to extract description from
-     * @return string  a title of the page
-     */
-    public static function crudeDescription($page)
-    {
-        $body = parent::getBetweenTags($page, 0, "<body", "</body");
-        $body = preg_replace("/\</", " <", $body);
-        $body = strip_tags("<body".$body[1]."</body>");
-        if ($body == "") {
-            return $body;
-        }
-        $body= preg_replace("/\s+/", " ", $body);
-        return mb_substr($body, 0, self::$max_description_len);
-    }
-    /**
-     * This returns the text content of a node but with spaces
-     * where tags were (unlike just using textContent)
-     *
-     * @param object $node a DOMNode
-     * @return string its text content with spaces
-     */
-    public static function domNodeToString($node)
-    {
-        $text = $node->ownerDocument->saveHTML($node);
-        $text = html_entity_decode($text);
-        $text = preg_replace('/\</', ' <', $text);
-        return strip_tags($text);
-    }
 }
diff --git a/src/library/summarizers/Summarizer.php b/src/library/summarizers/Summarizer.php
index 6e89ff07a..8d6f02796 100644
--- a/src/library/summarizers/Summarizer.php
+++ b/src/library/summarizers/Summarizer.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://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/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/ar/configure.ini b/src/locale/ar/configure.ini
index a480b4944..66382c07f 100755
--- a/src/locale/ar/configure.ini
+++ b/src/locale/ar/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = "الزحف ميكس التغييرات المحفوظة!"
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = "خيارات الصفحة تحديث!"
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = "الحقول المفقودة من نمو
 system_component_machine_doesnt_exists = "اسم الجهاز غير موجود!"
 system_component_stop_service_first = "الجهاز قيد الاستخدام. الرجاء إيقاف خدمة قيد التشغيل على ذلك! "
 system_component_machine_deleted = "حذف آلة!"
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = "لا يوجد ملف السجل وجدت."
 system_component_machine_servers_updated = "آلة #039;s Servers Updated!"
 system_component_machine_no_action = "غير قادر على تنفيذ الإجراء!"
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = "وأضاف لغة!"
@@ -816,35 +806,20 @@ search_view_score = "نقاط: %s"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = "خيارات الصفحة وقت الزحف"
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = "نطاق البايت للتحميل  (0-القيمة):"
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = "ربط الوزن:"
 pageoptions_element_results_grouping_options = "تجميع نتائج البحث"
 pageoptions_element_min_results_to_group = "نتائج الحد الأدنى للمجموعة:"
 pageoptions_element_server_alpha = "ألفا الخادم:"
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = "حفظ"
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = "حفظ"
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/ar/resources/Tokenizer.php b/src/locale/ar/resources/Tokenizer.php
index 4607566fb..7709f64d5 100755
--- a/src/locale/ar/resources/Tokenizer.php
+++ b/src/locale/ar/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/ar/resources/locale.js b/src/locale/ar/resources/locale.js
index 69384af6f..86db1db01 100755
--- a/src/locale/ar/resources/locale.js
+++ b/src/locale/ar/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/bn/configure.ini b/src/locale/bn/configure.ini
index 5e8ef4174..cc5afd834 100755
--- a/src/locale/bn/configure.ini
+++ b/src/locale/bn/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = ""
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/bn/resources/Tokenizer.php b/src/locale/bn/resources/Tokenizer.php
index a265dd6fd..6d918e5c5 100755
--- a/src/locale/bn/resources/Tokenizer.php
+++ b/src/locale/bn/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Snigdha Rao Parvatneni
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/bn/resources/locale.js b/src/locale/bn/resources/locale.js
index 22cde7ebf..1a42a2ab9 100755
--- a/src/locale/bn/resources/locale.js
+++ b/src/locale/bn/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Snigdha Rao Parvatneni
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/de/configure.ini b/src/locale/de/configure.ini
index 659e2e033..d04c162d7 100755
--- a/src/locale/de/configure.ini
+++ b/src/locale/de/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = ""
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/de/resources/Tokenizer.php b/src/locale/de/resources/Tokenizer.php
index 39b1c8f88..545df2fbe 100755
--- a/src/locale/de/resources/Tokenizer.php
+++ b/src/locale/de/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/de/resources/locale.js b/src/locale/de/resources/locale.js
index ae4762924..283711400 100755
--- a/src/locale/de/resources/locale.js
+++ b/src/locale/de/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/en_US/configure.ini b/src/locale/en_US/configure.ini
index 4b6084b69..26286a8ff 100644
--- a/src/locale/en_US/configure.ini
+++ b/src/locale/en_US/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = "Too Many Search Result Fragments!"
 social_component_mix_saved = "Crawl Mix Changes Saved!"
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = "Intent can&#039;t be blank"
-chatbot_component_entity_blank = "Entity can&#039;t be blank"
-chatbot_component_intent_modified = "Intent updated"
-chatbot_component_no_delete_intent = "Intent not found"
-chatbot_component_intent_deleted = "Intent deleted"
-chatbot_component_entity_modified = "Entity updated"
-chabot_component_no_delete_entity = "Entity not found"
-chatbot_component_entity_deleted = "Entity deleted"
-chatbot_component_expression_modified = "Expression updated"
-chatbot_component_no_delete_expression = "Expression not found"
-chatbot_component_expression_deleted = "Expression deleted"
-chatbot_component_no_delete_entityvalue = "Entity value not found"
-chatbot_component_entityvalue_deleted = "Entity value deleted"
+chatbot_component_bot_lookup_error = "Pattern Lookup Error!"
+chatbot_component_missing_required = "Missing Required Fields (Request)!"
+chatbot_component_pattern_added = "Pattern Added!"
+chatbot_component_pattern_updated = "Pattern Updated!"
+chatbot_component_no_delete_pattern = "Could not find pattern id, pattern not deleted!"
+chatbot_component_pattern_deleted = "Pattern Deleted!"
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = "Number of Credits to Buy"
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = "Centroid-Weighted"
 crawl_component_graph_based = "Graph-Based"
 crawl_component_page_options_updated = "Page Options Updated!"
 crawl_component_page_options_running_tests = "Running Tests!"
-pageoptions_element_actions = "Actions"
-pageoptions_element_add_entity = "Add Entity"
-pageoptions_element_file_upload = "Upload File"
 crawl_component_scraper_missing = "Missing Scraper Fields!"
 crawl_component_scraper_added = "Scraper added!"
 crawl_component_no_delete_scraper = "Scraper not deleted!"
@@ -496,10 +486,10 @@ system_component_machine_incomplete = "Missing Fields From Machine Form!"
 system_component_machine_doesnt_exists = "Machine Name does not Exists!"
 system_component_stop_service_first = "Machine in use. Please stop the service running on it!"
 system_component_machine_deleted = "Machine Deleted!"
-system_component_updatemode_toggled = "Media Update Mode Toggled!"
 system_component_no_machine_log = "No Log File Found."
 system_component_machine_servers_updated = "Machine&#039;s Servers Updated!"
 system_component_machine_no_action = "Unable to Perform Action!"
+system_component_updatemode_toggled = "Media Update Mode Toggled!"
 system_component_select_mode = "Select Mode"
 system_component_locale_missing_info = "Field values missing or invalid!"
 system_component_locale_added = "Locale Added!"
@@ -816,35 +806,20 @@ search_view_score = "Score:%s"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = "Intent"
-botstory_element_create_entity = "Entity"
-botstory_element_create_expressions = "Expression"
-botstory_element_addintent_form = "Add intent"
-botstory_element_edit_intent = "Edit intent"
-botstory_element_intent = "Intent"
-bot_intent_save = "Save"
-botstory_element_intentname = "Name"
+botstory_element_addpattern_form = "Add Pattern Form"
+botstory_element_edit_pattern = "Edit Pattern"
+botstory_element_add_pattern = "Add Pattern"
+botstory_element_request = "Request Expression:"
+botstory_element_trigger_state = "Trigger State:"
+botstory_element_remote_message = "Remote Message:"
+botstory_element_result_state = "Result State:"
+botstory_element_response = "Response:"
+botstory_element_save = "Save"
+botstory_element_pattern_header = "Pattern"
 botstory_element_actions = "Actions"
-botstory_element_editintent = "Edit"
-botstory_element_delete_operation = "Successfully deleted"
-botstory_element_deleteintent = "Delete"
-botstory_element_addentity_form = "Add Entity"
-botstory_element_edit_entity = "Edit Entity"
-botstory_element_new_entity = "Entity"
-botstory_element_new_entity_value = "Entity Value"
-botstory_element_deleteentityvalue = "Delete"
-bot_entity_save = "Save"
-botstory_element_entityname = "Entity Name"
-botstory_element_editentity = "Edit"
-botstory_element_deleteentity = "Delete"
-botstory_element_addexpression_form = "Add Expression"
-botstory_element_edit_expression = "Edit Expression"
-botstory_element_intentselect = "Intent"
-botstory_element_new_expressions = "Expression"
-bot_expression_save = "Save"
-botstory_element_expressionname = "Expression"
-botstory_element_editexpression = "Edit"
-botstory_element_deleteexpression = "Delete"
+botstory_element_editpattern = "Edit"
+botstory_element_delete_operation = "Do you really want to delete this pattern?"
+botstory_element_deletepattern = "Delete"
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = "Purchase Ad Credits"
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = "Edit Text Captcha Questions"
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = "Crawl Time"
 pageoptions_element_search_time = "Search Time"
-pageoptions_element_named_entity = "Named Entity"
 pageoptions_element_test_options = "Test Options"
 pageoptions_element_load_options = "Get Page Options From:"
 pageoptions_element_page_range = "Byte Range to Download (0 - Value):"
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = "Link Weight:"
 pageoptions_element_results_grouping_options = "Search Results Grouping"
 pageoptions_element_min_results_to_group = "Minimum Results to Group:"
 pageoptions_element_server_alpha = "Server Alpha:"
-editentities_confirm_delete = "Confirm Delete"
-editentities_element_delete = "Delete"
-pageoptions_element_save_options = "Save"
 pageoptions_element_test_page = "Test Page"
 pageoptions_element_page_type = "Type:"
+pageoptions_element_save_options = "Save"
 pageoptions_element_run_tests = "Test Process Page"
 pageoptions_element_test_results = "Test Results"
 pageoptions_element_page_truncated = "Page truncated from %s to %s bytes."
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = "Question Answer Extraction:"
 pageoptions_element_total_time = "Total Time:"
 pageoptions_element_time_seconds = "%s seconds"
 pageoptions_element_plugin_back = "Back"
-pageoptions_element_add_entity = "Add Entity"
-pageoptions_element_file_upload = "Upload File"
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = "Servers and Registration"
diff --git a/src/locale/en_US/resources/Tokenizer.php b/src/locale/en_US/resources/Tokenizer.php
index a33797275..473ce13eb 100755
--- a/src/locale/en_US/resources/Tokenizer.php
+++ b/src/locale/en_US/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/en_US/resources/locale.js b/src/locale/en_US/resources/locale.js
index ffe2cc26e..904b1658b 100755
--- a/src/locale/en_US/resources/locale.js
+++ b/src/locale/en_US/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sandhya Vissapragada
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/es/configure.ini b/src/locale/es/configure.ini
index cfa1772ce..e113282ae 100755
--- a/src/locale/es/configure.ini
+++ b/src/locale/es/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = "Guardados los Cambios del Rastreo Mix!"
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = "Falta de Campos, en el Formulario de la M
 system_component_machine_doesnt_exists = "El Nombre de la M&aacute;quina no Existe!"
 system_component_stop_service_first = "M&aacute;quina en Uso. Por favor, Detenga el Servicio que se Ejecuta en &eacute;l!"
 system_component_machine_deleted = "M&aacute;quina Eliminada!"
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = "No se Encontr&oacute; el Archivo de Registro."
 system_component_machine_servers_updated = "Servidores de M&aacute;quina&#039;s Actualizados!"
 system_component_machine_no_action = "No se Puede Realizar la Acci&oacute;n!"
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = "Configuraci&oacute;n Regional Agregada!"
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/es/resources/Tokenizer.php b/src/locale/es/resources/Tokenizer.php
index 3ec72cbb4..cdc63905c 100755
--- a/src/locale/es/resources/Tokenizer.php
+++ b/src/locale/es/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/es/resources/locale.js b/src/locale/es/resources/locale.js
index baa786c6b..97e6a1da4 100755
--- a/src/locale/es/resources/locale.js
+++ b/src/locale/es/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/fa/configure.ini b/src/locale/fa/configure.ini
index 8b40c2449..11b686c20 100755
--- a/src/locale/fa/configure.ini
+++ b/src/locale/fa/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = "تغییرات ترکیب خزش ذخیره شد!"
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = "تنظیمات صفحه به روز شد!"
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = "بعضی قسمت&zwnj;های فرم دس
 system_component_machine_doesnt_exists = "این دستگاه وجود ندارد!"
 system_component_stop_service_first = "دستگاه در حال استفاده است. لطفن کاری که انجام می&zwnj;دهد را متوقف کنید!"
 system_component_machine_deleted = "دستگاه حذف شد!"
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = "Log File پیدا نشد."
 system_component_machine_servers_updated = "سرورهای دستگاه به روز شدند!"
 system_component_machine_no_action = "نمی&zwnj;توان این فرمان را اجرا کرد!"
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = "زبان اضافه شد!"
@@ -816,35 +806,20 @@ search_view_score = "امتیاز: %s"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = "تنظیمات صفحه در هنگام خزش"
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = "دامنهٔ میزان بایتی که بارگذاری می&zwnj;شود (۰ - میزان):"
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = "وزن پیوند:"
 pageoptions_element_results_grouping_options = "دسته&zwnj;بندی نتایج جستجو"
 pageoptions_element_min_results_to_group = "حداقل تعداد هر دسته:"
 pageoptions_element_server_alpha = "آلفای سرور:"
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = "ذخیره"
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = "ذخیره"
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/fa/resources/Tokenizer.php b/src/locale/fa/resources/Tokenizer.php
index a20fd3556..d76065fd8 100755
--- a/src/locale/fa/resources/Tokenizer.php
+++ b/src/locale/fa/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/fa/resources/locale.js b/src/locale/fa/resources/locale.js
index 874b6792d..b33d83090 100755
--- a/src/locale/fa/resources/locale.js
+++ b/src/locale/fa/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/fa/statistics.txt b/src/locale/fa/statistics.txt
index 750f01032..0f66448e8 100755
--- a/src/locale/fa/statistics.txt
+++ b/src/locale/fa/statistics.txt
@@ -1 +1 @@
-d:23;
\ No newline at end of file
+d:24;
\ No newline at end of file
diff --git a/src/locale/fr_FR/configure.ini b/src/locale/fr_FR/configure.ini
index 55d818a63..c087e5256 100755
--- a/src/locale/fr_FR/configure.ini
+++ b/src/locale/fr_FR/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = ""
@@ -816,35 +806,20 @@ search_view_score = "Total: %s"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/fr_FR/resources/Tokenizer.php b/src/locale/fr_FR/resources/Tokenizer.php
index 62ec4c7c7..cb3460642 100755
--- a/src/locale/fr_FR/resources/Tokenizer.php
+++ b/src/locale/fr_FR/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/fr_FR/resources/locale.js b/src/locale/fr_FR/resources/locale.js
index e6d9b299b..5b776883f 100755
--- a/src/locale/fr_FR/resources/locale.js
+++ b/src/locale/fr_FR/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/general.ini b/src/locale/general.ini
index 57bddb870..2dfadc705 100755
--- a/src/locale/general.ini
+++ b/src/locale/general.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; general.ini
diff --git a/src/locale/he/configure.ini b/src/locale/he/configure.ini
index 45b2072da..dce7e34b2 100755
--- a/src/locale/he/configure.ini
+++ b/src/locale/he/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = ""
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/he/resources/Tokenizer.php b/src/locale/he/resources/Tokenizer.php
index 37c028bf9..7f1eb967b 100755
--- a/src/locale/he/resources/Tokenizer.php
+++ b/src/locale/he/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/he/resources/locale.js b/src/locale/he/resources/locale.js
index 72c4767b2..428ef363e 100755
--- a/src/locale/he/resources/locale.js
+++ b/src/locale/he/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/hi/configure.ini b/src/locale/hi/configure.ini
index afff6ce9f..1a56bfcd9 100755
--- a/src/locale/hi/configure.ini
+++ b/src/locale/hi/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = ""
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/hi/resources/Tokenizer.php b/src/locale/hi/resources/Tokenizer.php
index 25aa2603f..47db3ecf2 100755
--- a/src/locale/hi/resources/Tokenizer.php
+++ b/src/locale/hi/resources/Tokenizer.php
@@ -18,17 +18,17 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
 namespace seekquarry\yioop\locale\hi\resources;

-use seekquarry\yioop\models as M;
+use seekquarry\yioop\configs as C;
 /**
  * Hindi specific tokenization code. In particular, it has a stemmer,
  * The stemmer is my stab at porting Ljiljana Dolamic (University of Neuchatel,
@@ -138,38 +138,48 @@ class Tokenizer
      * @param string $text input phrase which is to be tagged
      * @return string $result which is an array of token => tag
      */
-    public static function tagTokenizePartofSpeech($text)
+    public static function tagTokenizePartOfSpeech($text)
     {
+        static $dictionary = [];
+        if (empty($dictionary)) {
+            $serial_lex_file = C\LOCALE_DIR .
+                "/hi/resources/serial_lexicon.txt";
+            if (file_exists($serial_lex_file)) {
+                $dictionary = unserialize(file_get_contents($serial_lex_file));
+            } else {
+                $lines = gzfile(C\LOCALE_DIR . "/hi/resources/lexicon.txt.gz");
+                foreach ($lines as $line) {
+                    $tags = preg_split('/(\s+|\,)/u', trim($line));
+                    $dictionary[base64_encode(array_shift($tags))] =
+                        array_filter($tags);
+                }
+                $dictionary_string = serialize($dictionary);
+                file_put_contents($serial_lex_file, $dictionary_string);
+                chmod($serial_lex_file, 0777);
+            }
+        }
         $tokens = preg_split("/\s+/u", $text);
         $result = [];
         $tag_list = [];
         $i = 0;
-        $model = new M\Model();
         foreach ($tokens as $token)
         {
             //Tag the tokens as found in the Lexicon
             $token = trim($token);
             $current = ["token" => $token, "tag" => "UNKNOWN"];
             $term = $current["token"];
-            $sql = "SELECT PART_OF_SPEECH FROM LEXICON WHERE TERM = '{$term}'
-             AND LOCALE = 'hi'";
-            $queryResult = @$model->db->execute($sql);
-            if ($queryResult !== false) {
-                $row = $model->db->fetchArray($queryResult);
-                $current["tag"] = $row["PART_OF_SPEECH"];
+            if (!empty($dictionary[base64_encode($token)])) {
+                $tag_list = $dictionary[base64_encode($token)];
+                $current['tag'] = $tag_list[0];
             }
-
             if (is_numeric($token)) {
                 $current["tag"] = "NN";
-            } else if (strcmp($token,"है") == 0 ||
-                        strcmp($token, "हैं") == 0) {
+            } else if (strcmp($token,"है") == 0 || strcmp($token, "हैं") == 0) {
                 $current["tag"] = "VB";
             }
-
-            if (!isset($current["tag"])) {
+            if (empty($current["tag"])) {
                 $current["tag"] = "UNKNOWN";
             }
-
             $result[$i] = $current;
             $i++;
         }
diff --git a/src/locale/hi/resources/locale.js b/src/locale/hi/resources/locale.js
index 6f09fc9d4..b3d15e836 100755
--- a/src/locale/hi/resources/locale.js
+++ b/src/locale/hi/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Mallika Perepa
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/in_ID/configure.ini b/src/locale/in_ID/configure.ini
index bf02f91d5..46769424a 100755
--- a/src/locale/in_ID/configure.ini
+++ b/src/locale/in_ID/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = "Locale telah ditambah"
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/in_ID/resources/Tokenizer.php b/src/locale/in_ID/resources/Tokenizer.php
index 0d7b3ad2a..217c17607 100755
--- a/src/locale/in_ID/resources/Tokenizer.php
+++ b/src/locale/in_ID/resources/Tokenizer.php
@@ -19,11 +19,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/in_ID/resources/locale.js b/src/locale/in_ID/resources/locale.js
index 40ba4b8f7..fe6f982fd 100755
--- a/src/locale/in_ID/resources/locale.js
+++ b/src/locale/in_ID/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/it/configure.ini b/src/locale/it/configure.ini
index 68e244c42..30649e15b 100755
--- a/src/locale/it/configure.ini
+++ b/src/locale/it/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = "Cambiamenti Unione Scansioni effettuati!"
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = "Opzioni Pagina aggiornate!"
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = "Campi mancanti dal modulo Macchina!"
 system_component_machine_doesnt_exists = "Nome Macchina inesistente!"
 system_component_stop_service_first = "Macchina in uso. Ferma il servizio che sta svolgendo!"
 system_component_machine_deleted = "Macchina cancellata!"
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = "Nessun file di log trovato."
 system_component_machine_servers_updated = "Server macchina aggiornato!"
 system_component_machine_no_action = "Impossibile svolgere azione!"
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = "Lingua aggiunta!"
@@ -816,35 +806,20 @@ search_view_score = "Punteggio %s"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = "Opzioni temporali Scansion"
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = "Quantit&agrave; Byte da scaricare (0 - Valore):"
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = "Peso Link:"
 pageoptions_element_results_grouping_options = "Raggruppa risultati di ricerca"
 pageoptions_element_min_results_to_group = "Minimo risultati da raggruppare:"
 pageoptions_element_server_alpha = "Server Alpha:"
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = "Salva"
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = "Salva"
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/it/resources/Tokenizer.php b/src/locale/it/resources/Tokenizer.php
index c4801bf3b..f6968e4fa 100755
--- a/src/locale/it/resources/Tokenizer.php
+++ b/src/locale/it/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/it/resources/locale.js b/src/locale/it/resources/locale.js
index 3feadd099..119554250 100755
--- a/src/locale/it/resources/locale.js
+++ b/src/locale/it/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/ja/configure.ini b/src/locale/ja/configure.ini
index 4a2308957..d40c784c8 100755
--- a/src/locale/ja/configure.ini
+++ b/src/locale/ja/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = "ローケルが追加しました"
@@ -816,35 +806,20 @@ search_view_score = "スコア %s"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/ja/resources/Tokenizer.php b/src/locale/ja/resources/Tokenizer.php
index a0b505908..df5581803 100755
--- a/src/locale/ja/resources/Tokenizer.php
+++ b/src/locale/ja/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/ja/resources/locale.js b/src/locale/ja/resources/locale.js
index 320ae0180..42bd9f070 100755
--- a/src/locale/ja/resources/locale.js
+++ b/src/locale/ja/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sandhya Vissapragada
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/kn/configure.ini b/src/locale/kn/configure.ini
index 84060ffc1..454162f4d 100755
--- a/src/locale/kn/configure.ini
+++ b/src/locale/kn/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = "ಕ್ರಾವ್ಲ್ ಮಿಶ್ರಣದಲ್ಲಿ ಬದಲಾವಣೆಯನ್ನು ಉಳಿಸು"
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = "ಪ್ರದೇಶದ ಶಿಷ್ಟತೆ ಸೇರಿಸಲಾಗಿದೆ"
@@ -816,35 +806,20 @@ search_view_score = "ಅಂಕ: %s "
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/kn/resources/Tokenizer.php b/src/locale/kn/resources/Tokenizer.php
index 55bcab83a..0d270a551 100755
--- a/src/locale/kn/resources/Tokenizer.php
+++ b/src/locale/kn/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/kn/resources/locale.js b/src/locale/kn/resources/locale.js
index f55783d21..1fee1e9dd 100755
--- a/src/locale/kn/resources/locale.js
+++ b/src/locale/kn/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sandhya Vissapragada
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/ko/configure.ini b/src/locale/ko/configure.ini
index d4e6776bd..3fa1663f4 100755
--- a/src/locale/ko/configure.ini
+++ b/src/locale/ko/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = "로케일 추가!!"
@@ -816,35 +806,20 @@ search_view_score = "점수 %s"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/ko/resources/Tokenizer.php b/src/locale/ko/resources/Tokenizer.php
index 5107aa6d9..4ad4a97d8 100755
--- a/src/locale/ko/resources/Tokenizer.php
+++ b/src/locale/ko/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/ko/resources/locale.js b/src/locale/ko/resources/locale.js
index f55783d21..1fee1e9dd 100755
--- a/src/locale/ko/resources/locale.js
+++ b/src/locale/ko/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sandhya Vissapragada
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/nl/configure.ini b/src/locale/nl/configure.ini
index 3b5df4162..57a0b929f 100644
--- a/src/locale/nl/configure.ini
+++ b/src/locale/nl/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = "Too Many Zoekresultaat Fragmenten!"
 social_component_mix_saved = "Crawl Mix Wijzigingen opgeslagen!"
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = "Opties voor de pagina Bijgewerkt!"
 crawl_component_page_options_running_tests = "Uitvoeren van tests!"
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = "Ontbrekende of ongeldige Velden Van Machi
 system_component_machine_doesnt_exists = "Machine Naam bestaat niet!"
 system_component_stop_service_first = "Machine gebruikt. Stop aub de dienst draait op het!"
 system_component_machine_deleted = "Machine verwijderd!"
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = "Geen Log File Found."
 system_component_machine_servers_updated = "Servers machines Bijgewerkt!"
 system_component_machine_no_action = "Niet in staat om actie uit te voeren!"
+system_component_updatemode_toggled = ""
 system_component_select_mode = "Select Mode"
 system_component_locale_missing_info = "Veldwaarden ontbrekende of ongeldige!"
 system_component_locale_added = "Locale toegevoegd!"
@@ -816,35 +806,20 @@ search_view_score = "Score: %s"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = "Tekst bewerken Captcha Vragen"
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = "crawl Tijd"
 pageoptions_element_search_time = "Zoek Tijd"
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = "Test Opties"
 pageoptions_element_load_options = "Krijg Pagina opties van:"
 pageoptions_element_page_range = "Byte Range te downloaden (0 - Waarde):"
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = "Link Gewicht:"
 pageoptions_element_results_grouping_options = "Zoekresultaten Groepering"
 pageoptions_element_min_results_to_group = "Minimum Resultaten Groep:"
 pageoptions_element_server_alpha = "Server Alpha:"
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = "Opslaan"
 pageoptions_element_test_page = "testpagina"
 pageoptions_element_page_type = "Type:"
+pageoptions_element_save_options = "Opslaan"
 pageoptions_element_run_tests = "Test Process Pagina"
 pageoptions_element_test_results = "testresultaten"
 pageoptions_element_page_truncated = "Pagina afgekapt van %s naar %s bytes."
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = "Servers en Registratie"
diff --git a/src/locale/nl/resources/Tokenizer.php b/src/locale/nl/resources/Tokenizer.php
index de0c01007..16360915b 100755
--- a/src/locale/nl/resources/Tokenizer.php
+++ b/src/locale/nl/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/nl/resources/locale.js b/src/locale/nl/resources/locale.js
index fc75fe93d..5ea48bc97 100755
--- a/src/locale/nl/resources/locale.js
+++ b/src/locale/nl/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sandhya Vissapragada
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/nl/statistics.txt b/src/locale/nl/statistics.txt
index 9869bd6bd..1570063a7 100644
--- a/src/locale/nl/statistics.txt
+++ b/src/locale/nl/statistics.txt
@@ -1 +1 @@
-d:64;
\ No newline at end of file
+d:65;
\ No newline at end of file
diff --git a/src/locale/pl/configure.ini b/src/locale/pl/configure.ini
index 3916af022..5ef1973b8 100755
--- a/src/locale/pl/configure.ini
+++ b/src/locale/pl/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = ""
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/pl/resources/Tokenizer.php b/src/locale/pl/resources/Tokenizer.php
index 74b5c0498..72e852ce9 100755
--- a/src/locale/pl/resources/Tokenizer.php
+++ b/src/locale/pl/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/pl/resources/locale.js b/src/locale/pl/resources/locale.js
index da03c30bb..cad22a007 100755
--- a/src/locale/pl/resources/locale.js
+++ b/src/locale/pl/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/pt/configure.ini b/src/locale/pt/configure.ini
index 997502acc..4368ac8e2 100755
--- a/src/locale/pt/configure.ini
+++ b/src/locale/pt/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = ""
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/pt/resources/Tokenizer.php b/src/locale/pt/resources/Tokenizer.php
index e735c3340..9979820c0 100755
--- a/src/locale/pt/resources/Tokenizer.php
+++ b/src/locale/pt/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Niravkumar Patel niravkumar.patel1989@gmail.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/pt/resources/locale.js b/src/locale/pt/resources/locale.js
index 3feadd099..119554250 100755
--- a/src/locale/pt/resources/locale.js
+++ b/src/locale/pt/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/ru/configure.ini b/src/locale/ru/configure.ini
index 81bf06815..5e770badf 100755
--- a/src/locale/ru/configure.ini
+++ b/src/locale/ru/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = ""
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/ru/resources/Tokenizer.php b/src/locale/ru/resources/Tokenizer.php
index 83ad28298..78d3ff7b7 100755
--- a/src/locale/ru/resources/Tokenizer.php
+++ b/src/locale/ru/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/ru/resources/locale.js b/src/locale/ru/resources/locale.js
index 1a9f0b37d..4474b9292 100755
--- a/src/locale/ru/resources/locale.js
+++ b/src/locale/ru/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/te/configure.ini b/src/locale/te/configure.ini
index 3695c47f5..59f07eb13 100644
--- a/src/locale/te/configure.ini
+++ b/src/locale/te/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = "చాలా శోధన ఫలిత
 social_component_mix_saved = "క్రాల్ మిక్స్ మార్పులు సేవ్ చేయబడినవి!"
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = "పేజ్ ఆప్షన్లు అప్డేట్ అయినవి!"
 crawl_component_page_options_running_tests = "టెస్ట్లు నడుస్తున్నవి!"
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = "మెషిన్ ఫార్మ్ ల
 system_component_machine_doesnt_exists = "మెషిన్ పేరు సరిఅయినది కాదు!"
 system_component_stop_service_first = "మెషిన్ ఉపయోగంలో వున్నది. దయచేసి మొదట సర్వీసెస్ ని ఆపండి!"
 system_component_machine_deleted = "మెషిన్ డిలీట్ చేయబడినది!"
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = "లాగ్ ఫైల్ కనపడలేదు."
 system_component_machine_servers_updated = "మెషిన్ సర్వర్స్ అప్డేట్ చేయబడినవి!"
 system_component_machine_no_action = "ఏ ఏక్సన్ చేయుట కుదరలేదు!"
+system_component_updatemode_toggled = ""
 system_component_select_mode = "మోడ్ ఎంచుకోండి"
 system_component_locale_missing_info = "ఫీల్డ్  వేల్యూస్ మిస్సింగ్ లేదా చెల్లదు!"
 system_component_locale_added = "లొకేల్ ఆడ్ చేయబడినది!"
@@ -816,35 +806,20 @@ search_view_score = "స్కోర్:%s"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/te/resources/Tokenizer.php b/src/locale/te/resources/Tokenizer.php
index 32c24afd1..4f270b920 100755
--- a/src/locale/te/resources/Tokenizer.php
+++ b/src/locale/te/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/te/resources/locale.js b/src/locale/te/resources/locale.js
index 14d897eab..680511660 100755
--- a/src/locale/te/resources/locale.js
+++ b/src/locale/te/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sandhya Vissapragada
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/te/statistics.txt b/src/locale/te/statistics.txt
index 87b79e8b5..9be6a0c6e 100755
--- a/src/locale/te/statistics.txt
+++ b/src/locale/te/statistics.txt
@@ -1 +1 @@
-d:42;
\ No newline at end of file
+d:43;
\ No newline at end of file
diff --git a/src/locale/th/configure.ini b/src/locale/th/configure.ini
index 17e4cc183..ec5e24b08 100755
--- a/src/locale/th/configure.ini
+++ b/src/locale/th/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = ""
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/th/resources/Tokenizer.php b/src/locale/th/resources/Tokenizer.php
index 1e25ee9aa..e110af17b 100755
--- a/src/locale/th/resources/Tokenizer.php
+++ b/src/locale/th/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/th/resources/locale.js b/src/locale/th/resources/locale.js
index f55783d21..1fee1e9dd 100755
--- a/src/locale/th/resources/locale.js
+++ b/src/locale/th/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sandhya Vissapragada
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/tr/configure.ini b/src/locale/tr/configure.ini
index 009383432..e5d4c9644 100755
--- a/src/locale/tr/configure.ini
+++ b/src/locale/tr/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = ""
@@ -816,35 +806,20 @@ search_view_score = ""
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/tr/resources/Tokenizer.php b/src/locale/tr/resources/Tokenizer.php
index 41ffba29a..9d0a2209e 100755
--- a/src/locale/tr/resources/Tokenizer.php
+++ b/src/locale/tr/resources/Tokenizer.php
@@ -18,12 +18,12 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
  *
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/tr/resources/locale.js b/src/locale/tr/resources/locale.js
index faba0af84..aa7f997be 100755
--- a/src/locale/tr/resources/locale.js
+++ b/src/locale/tr/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/vi_VN/configure.ini b/src/locale/vi_VN/configure.ini
index 7ea71782d..09834a74d 100755
--- a/src/locale/vi_VN/configure.ini
+++ b/src/locale/vi_VN/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = "Kết hợp đ&atilde; được lưu dữ"
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = ""
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = ""
 system_component_machine_doesnt_exists = ""
 system_component_stop_service_first = ""
 system_component_machine_deleted = ""
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = ""
 system_component_machine_servers_updated = ""
 system_component_machine_no_action = ""
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = "Miền địa phương th&ecirc;m v&agrave;o"
@@ -816,35 +806,20 @@ search_view_score = "Điểm: %s"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/vi_VN/resources/Tokenizer.php b/src/locale/vi_VN/resources/Tokenizer.php
index f98f84867..900bf115f 100755
--- a/src/locale/vi_VN/resources/Tokenizer.php
+++ b/src/locale/vi_VN/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/vi_VN/resources/locale.js b/src/locale/vi_VN/resources/locale.js
index fa902888b..226793a13 100755
--- a/src/locale/vi_VN/resources/locale.js
+++ b/src/locale/vi_VN/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/locale/zh_CN/configure.ini b/src/locale/zh_CN/configure.ini
index a744da46d..c68a63f1a 100755
--- a/src/locale/zh_CN/configure.ini
+++ b/src/locale/zh_CN/configure.ini
@@ -13,7 +13,7 @@
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
@@ -298,19 +298,12 @@ social_component_too_many_fragments = ""
 social_component_mix_saved = ""
 ;
 ; ChatbotComponent.php
-chatbot_component_intent_blank = ""
-chatbot_component_entity_blank = ""
-chatbot_component_intent_modified = ""
-chatbot_component_no_delete_intent = ""
-chatbot_component_intent_deleted = ""
-chatbot_component_entity_modified = ""
-chabot_component_no_delete_entity = ""
-chatbot_component_entity_deleted = ""
-chatbot_component_expression_modified = ""
-chatbot_component_no_delete_expression = ""
-chatbot_component_expression_deleted = ""
-chatbot_component_no_delete_entityvalue = ""
-chatbot_component_entityvalue_deleted = ""
+chatbot_component_bot_lookup_error = ""
+chatbot_component_missing_required = ""
+chatbot_component_pattern_added = ""
+chatbot_component_pattern_updated = ""
+chatbot_component_no_delete_pattern = ""
+chatbot_component_pattern_deleted = ""
 ;
 ; AdvertisementComponent.php
 advertisement_component_credit_amounts = ""
@@ -414,9 +407,6 @@ crawl_component_centroid_weighted = ""
 crawl_component_graph_based = ""
 crawl_component_page_options_updated = "更新頁面選項"
 crawl_component_page_options_running_tests = ""
-pageoptions_element_actions = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 crawl_component_scraper_missing = ""
 crawl_component_scraper_added = ""
 crawl_component_no_delete_scraper = ""
@@ -496,10 +486,10 @@ system_component_machine_incomplete = "未完成"
 system_component_machine_doesnt_exists = "不存在"
 system_component_stop_service_first = "停止服務"
 system_component_machine_deleted = "刪除"
-system_component_updatemode_toggled = ""
 system_component_no_machine_log = "無紀錄"
 system_component_machine_servers_updated = "服務更新"
 system_component_machine_no_action = "無動作"
+system_component_updatemode_toggled = ""
 system_component_select_mode = ""
 system_component_locale_missing_info = ""
 system_component_locale_added = "增加語言"
@@ -816,35 +806,20 @@ search_view_score = "分數"
 ; /src/views/elements
 ;
 ; BotstoryElement.php
-botstory_element_create_intent = ""
-botstory_element_create_entity = ""
-botstory_element_create_expressions = ""
-botstory_element_addintent_form = ""
-botstory_element_edit_intent = ""
-botstory_element_intent = ""
-bot_intent_save = ""
-botstory_element_intentname = ""
+botstory_element_addpattern_form = ""
+botstory_element_edit_pattern = ""
+botstory_element_add_pattern = ""
+botstory_element_request = ""
+botstory_element_trigger_state = ""
+botstory_element_remote_message = ""
+botstory_element_result_state = ""
+botstory_element_response = ""
+botstory_element_save = ""
+botstory_element_pattern_header = ""
 botstory_element_actions = ""
-botstory_element_editintent = ""
+botstory_element_editpattern = ""
 botstory_element_delete_operation = ""
-botstory_element_deleteintent = ""
-botstory_element_addentity_form = ""
-botstory_element_edit_entity = ""
-botstory_element_new_entity = ""
-botstory_element_new_entity_value = ""
-botstory_element_deleteentityvalue = ""
-bot_entity_save = ""
-botstory_element_entityname = ""
-botstory_element_editentity = ""
-botstory_element_deleteentity = ""
-botstory_element_addexpression_form = ""
-botstory_element_edit_expression = ""
-botstory_element_intentselect = ""
-botstory_element_new_expressions = ""
-bot_expression_save = ""
-botstory_element_expressionname = ""
-botstory_element_editexpression = ""
-botstory_element_deleteexpression = ""
+botstory_element_deletepattern = ""
 ;
 ; ManagecreditsElement.php
 managecredits_element_purchase_credits = ""
@@ -1181,7 +1156,6 @@ security_element_edit_captcha = ""
 ; PageoptionsElement.php
 pageoptions_element_crawl_time = ""
 pageoptions_element_search_time = ""
-pageoptions_element_named_entity = ""
 pageoptions_element_test_options = ""
 pageoptions_element_load_options = ""
 pageoptions_element_page_range = ""
@@ -1216,11 +1190,9 @@ pageoptions_element_link_weight = ""
 pageoptions_element_results_grouping_options = ""
 pageoptions_element_min_results_to_group = ""
 pageoptions_element_server_alpha = ""
-editentities_confirm_delete = ""
-editentities_element_delete = ""
-pageoptions_element_save_options = ""
 pageoptions_element_test_page = ""
 pageoptions_element_page_type = ""
+pageoptions_element_save_options = ""
 pageoptions_element_run_tests = ""
 pageoptions_element_test_results = ""
 pageoptions_element_page_truncated = ""
@@ -1238,8 +1210,6 @@ pageoptions_element_qa_time = ""
 pageoptions_element_total_time = ""
 pageoptions_element_time_seconds = ""
 pageoptions_element_plugin_back = ""
-pageoptions_element_add_entity = ""
-pageoptions_element_file_upload = ""
 ;
 ; ServersettingsElement.php
 serversettings_element_server_settings = ""
diff --git a/src/locale/zh_CN/resources/Tokenizer.php b/src/locale/zh_CN/resources/Tokenizer.php
index 58f2999c6..b384371de 100755
--- a/src/locale/zh_CN/resources/Tokenizer.php
+++ b/src/locale/zh_CN/resources/Tokenizer.php
@@ -18,11 +18,11 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/locale/zh_CN/resources/locale.js b/src/locale/zh_CN/resources/locale.js
index fbfc05e1e..f0ca9f721 100755
--- a/src/locale/zh_CN/resources/locale.js
+++ b/src/locale/zh_CN/resources/locale.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sandhya Vissapragada
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/models/ActivityModel.php b/src/models/ActivityModel.php
index 1d191d6d5..61882bd7a 100755
--- a/src/models/ActivityModel.php
+++ b/src/models/ActivityModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/AdvertisementModel.php b/src/models/AdvertisementModel.php
index 385230fe1..5150b1ac9 100644
--- a/src/models/AdvertisementModel.php
+++ b/src/models/AdvertisementModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Pushkar Umaranikar
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/BotModel.php b/src/models/BotModel.php
index af9e46877..0ef0cd62a 100644
--- a/src/models/BotModel.php
+++ b/src/models/BotModel.php
@@ -18,220 +18,90 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
 namespace seekquarry\yioop\models;

-use seekquarry\yioop\configs as C;
-use seekquarry\yioop\library as L;
-use seekquarry\yioop\library\Processors\ImageProcessor;
-
-/** For getLocaleTag*/
-require_once __DIR__.'/../library/LocaleFunctions.php';
 /**
- * This class is used to handle database statements related to Bot User stories
+ * BotModel is used to handle database statements related to Bot User stories
+ * A Bot User Story consists of a sequence of patterns for what a bot should
+ * do when another user posts a request to the bot (a message beginning
+ * @bot_name) in a discussion group.
  *
- * @author Harika Nukala
+ * @author Chris Pollett rewritten from file creater Harika Nukala
  */
 class BotModel extends Model
 {
     /**
-     * Add an intent to the database using provided string
-     *
-     * @param string $intent the intent to be added
-     */
-    public function addIntent($intent)
-    {
-        $user_id = $_SESSION['USER_ID'];
-        $db = $this->db;
-        $intent_id = $this->getIntentId($intent, $user_id);
-        if (!$intent_id) {
-            $sql = "INSERT INTO INTENT(INTENT, USER_ID) VALUES (?,?)";
-            $result = $db->execute($sql, [$intent, $user_id]);
-        }
-    }
-    /**
-     * Add an expression to the database using provided string
-     *
-     * @param string $expression the expression to be added
-     * @param int $intent_id the provided intent
-     */
-    public function addExpression($expression, $intent_id)
-    {
-        $db = $this->db;
-        $sql = "INSERT INTO EXPRESSION(EXPRESSION, INTENT_ID) VALUES (?, ?)";
-        $result = $db->execute($sql, [$expression, $intent_id]);
-    }
-    /**
-     * Add an entity value to the database using provided string
-     *
-     * @param int $expression_id id of particular expression
-     * @param int $intent_id id of intent under which expression belongs
-     * @param int $entity_id id of entity name
-     * @param string $entity_value value of entity
-     */
-    public function addEntityValue($expression_id, $intent_id,
-        $entity_id, $entity_value){
-        $db = $this->db;
-        $sql = "INSERT INTO INTENT_EXPRESSION_ENTITY(INTENT_ID, EXPRESSION_ID,
-                ENTITY_ID, ENTITY_VALUE) VALUES (?, ?, ?, ?)";
-        $result = $db->execute($sql, [$intent_id, $expression_id,
-            $entity_id, $entity_value]);
-    }
-    /**
-     * Add an entity name to the database using provided string
-     *
-     * @param string $entity_name name of entity
-     */
-    public function addEntity($entity_name)
-    {
-        $user_id = $_SESSION['USER_ID'];
-        $db = $this->db;
-        $entity_id = $this->getEntityId($entity_name, $user_id);
-        if(!$entity_id)
-        {
-            $sql = "INSERT INTO ENTITY(ENTITY_NAME, USER_ID) VALUES (?, ?)";
-            $result = $db->execute($sql, [$entity_name, $user_id]);
-        }
-    }
-    /**
-     * Get intent associated with intent_id
-     *
-     * @param int $intent_id to use to look up an intent
-     * @return array $row corresponding to the intent.
-     */
-    public function getIntent($intent_id)
-    {
-        $db = $this->db;
-        $sql = "SELECT * FROM INTENT WHERE INTENT_ID = (?)".
-            $db->limitOffset(1);
-        $result = $db->execute($sql, [$intent_id]);
-        if (!$result) {
-            return false;
-        }
-        $row = $db->fetchArray($result);
-        return $row;
-    }
-    /**
-     * Get intent id associated with intent (so intents better be unique)
-     * and userId
-     *
-     * @param string $intent to use to look up a intent_id
-     * @param int $user_id associated with this user id
-     * @return int $intent_id corresponding to the intent and userId.
-     */
-    public function getIntentId($intent, $user_id)
-    {
-        $db = $this->db;
-        $sql = "SELECT INTENT_ID FROM INTENT WHERE
-            LOWER(INTENT) = LOWER(?) AND USER_ID = (?)". $db->limitOffset(1);
-        $result = $db->execute($sql, [$intent, $user_id]);
-        if (!$result) {
-            return false;
-        }
-        $row = $db->fetchArray($result);
-        $intent_id = $row['INTENT_ID'];
-        return $intent_id;
-    }
-    /**
-     * Get entity id associated with $entity_name and $user_id
-     *
-     * @param string $entity_name to use to look up an $entity_id
-     * @param string $user_id id of bot user
-     * @return int $entity_id corresponding to the $entity_name.
-     */
-    public function getEntityId($entity_name, $user_id)
-    {
-        $db = $this->db;
-        $sql = "SELECT ENTITY_ID FROM ENTITY WHERE
-            LOWER(ENTITY_NAME) = LOWER (?) AND USER_ID = (?)".
-            $db->limitOffset(1);
-        $result = $db->execute($sql, [$entity_name, $user_id]);
-        if (!$result) {
-            return false;
-        }
-        $row = $db->fetchArray($result);
-        $entity_id = $row['ENTITY_ID'];
-        return $entity_id;
-    }
-    /**
-     * Get expression id associated with expression
-     *
-     * @param string $expression to use to look up a expression id
-     * @param int $intent_id to use to look up a expression id
-     * @return int  expression id corresponding to the expression and intent.
-     */
-    public function getExpressionId($expression, $intent_id)
-    {
-        $db = $this->db;
-        $sql = "SELECT EXPRESSION_ID FROM EXPRESSION WHERE EXPRESSION = (?)
-                AND INTENT_ID=(?)". $db->limitOffset(1);
-        $result = $db->execute($sql, [$expression, $intent_id]);
-        if (!$result) {
-            return false;
-        }
-        $row = $db->fetchArray($result);
-        return $row['EXPRESSION_ID'];
+     * Add a new pattern to the chat bot $user_id
+     *
+     * @param int $user_id of the chat bot user adding pattern for
+     * @param string $request the from a different user to try to match against
+     * @param string $trigger_state only match if the internal state of the
+     *      bot for the rquesting user is this value
+     * @param string $remote_call rest method on the chat bot external site to
+     *      call (if any) when $request and $trigger_state conditions met
+     * @param string $result_state internal state to switch to for that user
+     * @param string $response to echo back to request user in a follow up
+     *      post
+     */
+    public function addPattern($user_id, $request, $trigger_state,
+        $remote_call, $result_state, $response)
+    {
+        $sql = "INSERT INTO CHAT_BOT_PATTERN (USER_ID, REQUEST,
+            TRIGGER_STATE, REMOTE_MESSAGE, RESULT_STATE, RESPONSE)
+            VALUES (?, ?, ?, ?, ?, ?)";
+        $params = [intval($user_id), $request, $trigger_state,
+            $remote_call, $result_state, $response];
+        $this->db->execute($sql, $params);
     }
     /**
-     * Get entity associated with entity_id
+     * Returns the number of patterns associated with a bot user_id
      *
-     * @param int $entity_id to use to look up an entity
-     * @return array associative array containing information about
-     *      the entity that was looked up
+     * @param int $user_id id of bot to count the number of patterns for
+     * @return int $number of patterns
      */
-    public function getEntity($entity_id)
+    public function countPatterns($user_id)
     {
         $db = $this->db;
-        $sql = "SELECT * FROM ENTITY WHERE ENTITY_ID = (?)".
-            $db->limitOffset(1);
-        $result = $db->execute($sql, [$entity_id]);
+        $sql = "SELECT COUNT(*) AS NUM FROM CHAT_BOT_PATTERN WHERE USER_ID = ?";
+        $result = $db->execute($sql, [$pattern_id]);
         if (!$result) {
-            return false;
+            return 0;
         }
         $row = $db->fetchArray($result);
-        return $row;
+        return $row['NUM'];
     }
     /**
-     * Get all entities associated with user
+     * Deletes a pattern using its id.
      *
-     * @param int $user_id to use to look up list of entities
-     * @return array entities corresponding to the userid.
+     * @param int $pattern_id of pattern to delete
      */
-    public function getEntities($user_id)
+    public function deletePattern($pattern_id)
     {
-        $entities=[];
-        $db = $this->db;
-        $sql = "SELECT ENTITY_ID, ENTITY_NAME FROM ENTITY WHERE USER_ID = (?)";
-        $result = $db->execute($sql, [$user_id]);
-        if (!$result) {
-            return false;
-        }
-        while ($row = $db->fetchArray($result)) {
-            $entities[] = $row;
-        }
-        return $entities;
+        $sql = "DELETE FROM CHAT_BOT_PATTERN WHERE PATTERN_ID = ?";
+        $this->db->execute($sql, [$pattern_id]);
     }
     /**
-     * Get expression associated with expressionid
+     * Get pattern the its id
      *
      * @param int $expression_id to use to look up an expression
      * @return array expression corresponding to the expressionid.
      */
-    public function getExpression($expression_id)
+    public function getPatternById($pattern_id)
     {
         $db = $this->db;
-        $sql = "SELECT * FROM EXPRESSION WHERE EXPRESSION_ID = (?)".
+        $sql = "SELECT * FROM CHAT_BOT_PATTERN WHERE PATTERN_ID = (?)" .
             $db->limitOffset(1);
-        $result = $db->execute($sql, [$expression_id]);
+        $result = $db->execute($sql, [$pattern_id]);
         if (!$result) {
             return false;
         }
@@ -239,302 +109,51 @@ class BotModel extends Model
         return $row;
     }
     /**
-     * Get all expressions associated with intent
+     * Update an existing pattern for a chat bot
      *
-     * @param int $intent_id to use to look up expressions
-     * @return array expressions corresponding to the intent.
+     * @param array $pattern object to update
      */
-    public function getExpressions($intent_id)
+    public function updatePattern($pattern)
     {
-        $expressions=[];
-        $db = $this->db;
-        $sql = "SELECT EXPRESSION FROM EXPRESSION WHERE INTENT_ID = (?)";
-        $result = $db->execute($sql, [$intent_id]);
-        if (!$result) {
-            return false;
-        }
-        while ($row = $db->fetchArray($result)) {
-            $expressions[] = $row['EXPRESSION'];
-        }
-        return $expressions;
-    }
-    /**
-     * Delete an intent
-     *
-     * @param int $intent_id to use to look up intent
-     */
-    public function deleteIntent($intent_id)
-    {
-        $sql = "SELECT * FROM INTENT WHERE INTENT_ID = '$intent_id'";
-        $result = $this->db->execute($sql);
-        if ($result) {
-            $sql = "DELETE FROM EXPRESSION WHERE INTENT_ID = ?";
-            $this->db->execute($sql, [$intent_id]);
-        }
-        $sql = "DELETE FROM INTENT WHERE INTENT_ID = ?";
-        $this->db->execute($sql, [$intent_id]);
-    }
-    /**
-     * Update an intent
-     *
-     * @param array $intent intent object to update
-     */
-    public function updateIntent($intent)
-    {
-        $intent_id = $intent['INTENT_ID'];
-        $sql = "UPDATE INTENT SET ";
+        $sql = "UPDATE CHAT_BOT_PATTERN SET ";
         $comma = "";
-        $params = [];
-        foreach ($intent as $field => $value) {
-            $sql .= "$comma $field = ? ";
-            $comma = ",";
-            $params[] = $value;
+        if (empty($pattern['PATTERN_ID'])) {
+            return;
         }
-        $sql .= " WHERE INTENT_ID = ?";
-        $params[] = $intent_id;
-        $this->db->execute($sql, $params);
-    }
-    /**
-     * Update an entity
-     *
-     * @param array $entity object to update
-     */
-    public function updateEntity($entity)
-    {
-        $db = $this->db;
-        $entity_id = $entity['ENTITY_ID'];
-        $sql = "UPDATE ENTITY SET ";
-        $comma = "";
-        $params = [];
-        foreach ($entity as $field => $value) {
-            $sql .= "$comma $field=? ";
-            $comma = ",";
-            $params[] = $value;
-        }
-        $sql .= " WHERE ENTITY_ID=?";
-        $params[] = $entity_id;
-        $db->execute($sql, $params);
-        if($entity['ENTITY_VALUE'] != ""){
-            $sql = "SELECT * FROM INTENT_EXPRESSION_ENTITY
-                    WHERE ENTITY_ID = (?) ". $db->limitOffset(1);
-            $result = $db->execute($sql, [$entity_id]);
-            $row = $db->fetchArray($result);
-            $this->addEntityValue($row['EXPRESSION_ID'], $row['INTENT_ID'],
-                $entity_id , $entity['ENTITY_VALUE']);
-        }
-    }
-    /**
-     * Delete an entity
-     *
-     * @param int $entity_id to use to look up entity
-     */
-    public function deleteEntity($entity_id)
-    {
-        $sql = "DELETE FROM ENTITY WHERE ENTITY_ID=?";
-        $this->db->execute($sql, [$entity_id]);
-    }
-    /**
-     * Update an expression
-     *
-     * @param array $expression object to update
-     */
-    public function updateExpression($expression)
-    {
-        $expression_id = $expression['EXPRESSION_ID'];
-        $sql = "UPDATE EXPRESSION SET ";
-        $comma = "";
         $params = [];
-        foreach ($expression as $field => $value) {
-            $sql .= "$comma $field = ?";
-            $comma = ",";
-            $params[] = $value;
+        foreach (['REQUEST', 'TRIGGER_STATE', 'REMOTE_MESSAGE',
+            'RESULT_STATE', 'RESPONSE'] as $field) {
+            if (isset($pattern[$field])) {
+                $sql .= "$comma $field = ?";
+                $comma = ",";
+                $params[] = $pattern[$field];
+            }
         }
-        $sql .= " WHERE EXPRESSION_ID=?";
-        $params[] = $expression_id;
+        $sql .= " WHERE PATTERN_ID=?";
+        $params[] = $pattern['PATTERN_ID'];
         $this->db->execute($sql, $params);
     }
-    /**
-     * Delete an expression
-     *
-     * @param int $expression_id to use to look up expression
-     */
-    public function deleteExpression($expression_id)
-    {
-        $sql = "DELETE FROM EXPRESSION WHERE EXPRESSION_ID=?";
-        $this->db->execute($sql, [$expression_id]);
-    }
-    /**
-     * Used to determine the select clause for GROUPS table when do query
-     * to marshal group objects for the controller mainly in mangeGroups
-     * @param mixed $args We use $args[1] to say whether in browse mode or not.
-     *     browse mode is for groups a user could join rather than ones already
-     *     joined
-     */
-    public function selectCallback($args = null)
-    {
-        $select = "";
-        list($query, $conditions, ) = $args;
-        if ($query=="INTENTS") {
-            $select = "INTENT_ID, INTENT";
-        }
-        else if ($query=="ENTITIES") {
-            $select = "ENTITY_ID, ENTITY_NAME";
-        }
-        else if($query=="EXPRESSIONS"){
-            $select = "I.INTENT AS INTENT, E.EXPRESSION AS EXPRESSION,
-            E.EXPRESSION_ID AS EXPRESSION_ID";
-        }
-        else if ($query=="ENTITY_VALUES") {
-            $select = "ID, ENTITY_VALUE";
-        }
-        return $select;
-    }
     /**
      * {@inheritDoc}
-     *
-     * @param mixed $args any additional arguments which should be used to
-     *     determine these tables (in this case none)
      */
     public function fromCallback($args = null)
     {
-        $from="";
-        list($query, $conditions, ) = $args;
-        if ($query=="INTENTS") {
-            $from = "INTENT";
-        }
-        else if ($query=="ENTITIES") {
-            $from = "ENTITY";
-        }
-        else if($query=="EXPRESSIONS") {
-            $from = "INTENT I, EXPRESSION E";
-        }
-        else if ($query=="ENTITY_VALUES") {
-            $from = "INTENT_EXPRESSION_ENTITY";
-        }
-            return $from;
+        return "CHAT_BOT_PATTERN";
     }
     /**
      * Used to restrict getRows in which rows it returns. Rows in this
-     * case corresponding to Yioop groups. The restrictions added are to
-     * restrict to those group available to a given user_id and whether or
-     * not the user wants groups subscribed to, or groups that could be
-     * subscribed to
+     * case corresponding to chat bot patterns for a particular chat bot user.
      *
-     * @param array $args first two elements are the $user_id of the user
-     *     and the $browse flag which says whether or not user is browing
-     *     through all groups to which he could subscribe and read or
-     *     just those groups to which he is already subscribed.
+     * @param array $args first element is the $user_id of the chat bot user
      * @return string a SQL WHERE clause suitable to perform the above
      *     restrictions
      */
     public function whereCallback($args = null)
     {
-        $where = "";
-        list($query, $conditions, ) = $args;
-        if ($query == "INTENTS" || $query == "ENTITIES") {
-            $where = "USER_ID=" . $_SESSION['USER_ID'];
-        } else if ($query == "EXPRESSIONS") {
-            $where = "I.INTENT_ID = E.INTENT_ID AND USER_ID=" .
-                $_SESSION['USER_ID'];
-        } else if ($query == "ENTITY_VALUES" && $conditions[0]) {
-            $where = "ENTITY_ID =" . $conditions[0];
-        }
-            return $where;
-    }
-    /**
-     * Add the frequency count of the number of occurences of a term
-     * in an intent to the BOT_TERM_FREQUENCY table
-     *
-     * @param string $term to compute count for
-     * @param string $intent to count occurrences of term within
-     */
-    public function addTermFrequency($term, $intent)
-    {
-        $db = $this->db;
-        $sql = "SELECT FREQUENCY AS NUM FROM " .
-            "BOT_TERM_FREQUENCY BT WHERE BT.TERM = ? " .
-            "AND BT.INTENT_ID = ?";
-        $result = $db->execute($sql, [$term, $intent]);
-        $present = false;
-        $count = 0;
-        if ($result) {
-            while ($row = $db->fetchArray($result)) {
-                if ($row["NUM"] > 0) {
-                    $count = $row["NUM"];
-                    $present = true;
-                } else {
-                    $present = false;
-                }
-            }
-        }
-        if (!$present) {
-            $sql = "INSERT INTO BOT_TERM_FREQUENCY(TERM, FREQUENCY,
-                INTENT_ID) VALUES (?, ?, ?)";
-            $result = $db->execute($sql, [$term, $count + 1, $intent]);
-        } else {
-            $sql = "UPDATE BOT_TERM_FREQUENCY SET FREQUENCY = ?";
-            $sql .= " WHERE TERM = ? AND INTENT_ID = ?";
-            $this->db->execute($sql, [$count + 1, $term, $intent]);
-        }
-    }
-    /**
-     * Get list of intents associated with user_id
-     *
-     * @param string $user_id to use to look up list of intents
-     * @return array intents corresponding to the user_id.
-     */
-    public function getIntents($user_id)
-    {
-        $db = $this->db;
-        $intents = [];
-        $sql = "SELECT INTENT_ID,INTENT FROM INTENT WHERE USER_ID = (?) ";
-        $result = $db->execute($sql, [$user_id]);
-        while ($row = $db->fetchArray($result)){
-            $intents[] = $row;
+        if (empty($args)) {
+            return "";
         }
-        return $intents;
-    }
-    /**
-     * Gets count of the number of intents having the term
-     *
-     * @param string $term to use to look up intents
-     * @param string $intents ids of intents to look up to see if have term
-     * @return int the count of number intent within the listed intents that
-     *      have the term
-     */
-    public function getIntentsWithTerm($term, $intents)
-    {
-        $db = $this->db;
-        $sql = "SELECT COUNT(*) AS INTENT_COUNT FROM BOT_TERM_FREQUENCY
-                WHERE TERM = (?) AND INTENT_ID IN (?)";
-        $result = $db->execute($sql, [$term, implode(",", $intents)]);
-        $row = $db->fetchArray($result);
-        return $row['INTENT_COUNT'];
-    }
-    /**
-     * Gets the number of occurences of a term within a given intent
-     *
-     * @param string $term to count occurences of
-     * @param int $intent to count within
-     * @return int frequency corresponding to the term and intent.
-     */
-    public function getTermFrequency($term, $intent)
-    {
-        $db = $this->db;
-        $sql = "SELECT FREQUENCY FROM BOT_TERM_FREQUENCY
-            WHERE TERM = ? AND INTENT_ID = (?) ";
-        $result = $db->execute($sql, [$term, $intent]);
-        $row = $db->fetchArray($result);
-        return $row['FREQUENCY'];
-    }
-    /**
-     * Delete an entity value
-     *
-     * @param int $id to use to look up entity value
-     */
-    public function deleteEntityValue($id)
-    {
-        $sql = "DELETE FROM INTENT_EXPRESSION_ENTITY WHERE ID = ?";
-        $this->db->execute($sql, [$id]);
+        list($user_id, ) = $args;
+        return "USER_ID = $user_id";
     }
 }
diff --git a/src/models/CaptchaModel.php b/src/models/CaptchaModel.php
index 33e84f6be..5473b8481 100755
--- a/src/models/CaptchaModel.php
+++ b/src/models/CaptchaModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/CrawlModel.php b/src/models/CrawlModel.php
index 295c1ae8b..57bba7fcf 100755
--- a/src/models/CrawlModel.php
+++ b/src/models/CrawlModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -477,7 +477,7 @@ class CrawlModel extends ParallelModel
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; crawl.ini
diff --git a/src/models/CreditModel.php b/src/models/CreditModel.php
index b2804b3a4..6ecc27e58 100644
--- a/src/models/CreditModel.php
+++ b/src/models/CreditModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/CronModel.php b/src/models/CronModel.php
index a2fbcaf15..4c98e062c 100644
--- a/src/models/CronModel.php
+++ b/src/models/CronModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/EntityModel.php b/src/models/EntityModel.php
deleted file mode 100644
index 070971961..000000000
--- a/src/models/EntityModel.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-/**
- * SeekQuarry/Yioop --
- * Open Source Pure PHP Search Engine, Crawler, and Indexer
- *
- * Copyright (C) 2009 - 2018  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 - 2018
- * @filesource
- */
-namespace seekquarry\yioop\models;
-
-use seekquarry\yioop\configs as C;
-use seekquarry\yioop\library as L;
-
-/**
- * This class is used to handle
- * database statements related adding entities
- *
- * @author Salil Shenoy
- */
-class EntityModel extends Model
-{
-    /**
-     * Add an entity to the database using provided string
-     *
-     * @param string $entity the enityt to be added
-     * @param string $locale the locale to which the entity belongs
-     */
-    public function addEntity($entity, $locale)
-    {
-        $db = $this->db;
-        $sql = "INSERT INTO LEXICON(TERM, PART_OF_SPEECH, LOCALE) VALUES
-            (?,?,?)";
-        $result = $db->execute($sql, [$entity, "EN", $locale]);
-    }
-    /**
-     * Bulk upload entities to the database from a file for
-     * the given locale
-     *
-     * @param file $file_name containing entities uploaded to Yioop
-     * @param string $locale locale to which the entities belong
-     */
-    public function addEntities($file_name, $locale)
-    {
-        $db = $this->db;
-        $lines = file($file_name);
-        $sql = "INSERT INTO LEXICON(TERM, PART_OF_SPEECH, LOCALE) VALUES
-            (?,?,?)";
-        foreach ($lines as $line) {
-            $result = $db->execute($sql, [$line, "EN", $locale]);
-        }
-    }
-    /**
-     * Bulk edit entities already present in the database from the View
-     * Entities page the given locale.
-     *
-     * @param array $orignal_values of entities present in Yioop
-     * @param array $updated_values captured when the user clicks Save button
-     * @param string $locale locale to which the entities belong
-     */
-    public function bulkEditEntities($orignal_values, $updated_values, $locale)
-    {
-        $db = $this->db;
-        $sql = "UPDATE LEXICON SET TERM = ? WHERE TERM = ? AND LOCALE= ?";
-        /* The following code gets only the entites which are updated
-         *  For example,
-         *  $orignal_values = [0 => 'New Jersey', 1 => 'California']
-         *  $update_values = [ 0 => 'New York', 1 => 'California']
-         *  $old_values = [0 => 'New Jersey']
-         *  $new_values = [0 => 'New York']
-         */
-        $old_values = array_diff($orignal_values, $updated_values);
-        $new_values = array_diff($updated_values, $orignal_values);
-        $count = count($new_values);
-        if ($count > 0) {
-            foreach ($new_values as $key => $value) {
-                $new_value = $new_values[$key];
-                $old_value = $old_values[$key];
-                $db->execute($sql, [$new_value, $old_value, $locale]);
-                $count--;
-                if ($count == 0)
-                    break;
-            }
-        }
-    }
-    /**
-     * Shows all the entities foe that locale, you can then edit or delete
-     * entites from this page
-     *
-     * @param string $locale locale to which the entities belong
-     */
-    public function viewAll($locale)
-    {
-        $entities = [];
-        $db = $this->db;
-        $sql = "SELECT term FROM LEXICON WHERE LOCALE = ? AND
-            PART_OF_SPEECH = 'EN'";
-        $result = $db->execute($sql, [$locale]);
-        while ($row = $db->fetchArray($result)){
-            $entities[] = $row['TERM'];
-        }
-        return $entities;
-    }
-    /**
-     * Delete the entity for the locale
-     *
-     * @param string $entity entity to delete
-     * @param string $locale locale to which the entities belong
-     */
-    public function deleteEntity($entity, $locale)
-    {
-        $db = $this->db;
-        $sql = "DELETE FROM LEXICON WHERE TERM = ? AND LOCALE = ?";
-        $db->execute($sql, [$entity, $locale]);
-    }
-}
diff --git a/src/models/GroupModel.php b/src/models/GroupModel.php
index 2169f9835..966a4d891 100644
--- a/src/models/GroupModel.php
+++ b/src/models/GroupModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Mallika Perepa, Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -3440,8 +3440,9 @@ class GroupModel extends Model implements MediaConstants
         $sql = "SELECT CB.USER_ID, U.USER_NAME, CB.BOT_TOKEN, CB.CALLBACK_URL".
             " FROM USER_GROUP UG, USERS U, CHAT_BOT CB".
             " WHERE UG.GROUP_ID = ? AND UG.USER_ID = U.USER_ID AND" .
-            " CB.USER_ID = UG.USER_ID";
-        $result = $db->execute($sql,[$group_id]);
+            " CB.USER_ID = UG.USER_ID " .
+            $db->limitOffset(C\GROUP_BOT_FOLLOWERS);
+        $result = $db->execute($sql, [$group_id]);
         $bots = [];
         while ($bot = $db->fetchArray($result)) {
             $bots[] = $bot;
diff --git a/src/models/ImpressionModel.php b/src/models/ImpressionModel.php
index b7e64d486..18aade637 100644
--- a/src/models/ImpressionModel.php
+++ b/src/models/ImpressionModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/LocaleModel.php b/src/models/LocaleModel.php
index 4daac75e4..0df95743f 100755
--- a/src/models/LocaleModel.php
+++ b/src/models/LocaleModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -712,7 +712,7 @@ class LocaleModel extends Model
 ;  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/>.
+;  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 ;  ***** END LICENSE BLOCK *****
 ;
 ; configure.ini
diff --git a/src/models/MachineModel.php b/src/models/MachineModel.php
index 1e1952eec..a00749a6d 100644
--- a/src/models/MachineModel.php
+++ b/src/models/MachineModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/Model.php b/src/models/Model.php
index 2400108cb..26830c8fb 100755
--- a/src/models/Model.php
+++ b/src/models/Model.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -565,7 +565,7 @@ class Model implements CrawlConstants
      *      implementation)
      * @return array
      */
-    public function getRows($limit = 0, $num = 100, &$total,
+    public function getRows($limit, $num, &$total,
         $search_array = [], $args = null)
     {
         $db = $this->db;
diff --git a/src/models/ParallelModel.php b/src/models/ParallelModel.php
index 3757f368b..86a47b0bb 100755
--- a/src/models/ParallelModel.php
+++ b/src/models/ParallelModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/PhraseModel.php b/src/models/PhraseModel.php
index 71994ab3d..7258c1821 100755
--- a/src/models/PhraseModel.php
+++ b/src/models/PhraseModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/ProfileModel.php b/src/models/ProfileModel.php
index 6b214620f..e5e1be0bf 100755
--- a/src/models/ProfileModel.php
+++ b/src/models/ProfileModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -151,12 +151,17 @@ class ProfileModel extends Model
                 METHOD_NAME VARCHAR(" . C\LONG_NAME_LEN . "))",
             "ACTIVITY_TRANSLATION_ID_INDEX" => "CREATE INDEX
                 ACTIVITY_TRANSLATION_ID_INDEX ON ACTIVITY (TRANSLATION_ID)",
-            "BOT_TERM_FREQUENCY" => "CREATE TABLE BOT_TERM_FREQUENCY(TERM
-                VARCHAR(" . C\MAX_DESCRIPTION_LEN . "), FREQUENCY INTEGER,
-                INTENT_ID INTEGER, PRIMARY KEY(TERM, INTENT_ID))",
             "CHAT_BOT" => "CREATE TABLE CHAT_BOT(
                 USER_ID INTEGER PRIMARY KEY, BOT_TOKEN CHAR(". C\TIMESTAMP_LEN .
                 ") UNIQUE, CALLBACK_URL VARCHAR(" . C\MAX_URL_LEN . "))",
+            "CHAT_BOT_PATTERN" => "CREATE TABLE CHAT_BOT_PATTERN(
+                PATTERN_ID $serial PRIMARY KEY $auto_increment,
+                USER_ID  INTEGER,
+                REQUEST VARCHAR(" . C\MAX_DESCRIPTION_LEN ."),
+                TRIGGER_STATE VARCHAR(" . C\NAME_LEN . "),
+                REMOTE_MESSAGE VARCHAR(" . C\MAX_DESCRIPTION_LEN . "),
+                RESULT_STATE VARCHAR(" . C\NAME_LEN . "),
+                RESPONSE VARCHAR(" . C\MAX_DESCRIPTION_LEN ."))",
             "CRAWL_MIXES" => "CREATE TABLE CRAWL_MIXES (TIMESTAMP NUMERIC(".
                 C\TIMESTAMP_LEN.")
                 PRIMARY KEY, NAME VARCHAR(" . C\NAME_LEN .
@@ -174,14 +179,6 @@ class ProfileModel extends Model
                 CREDIT_LEDGER (USER_ID)",
             "CURRENT_WEB_INDEX" => "CREATE TABLE CURRENT_WEB_INDEX
                 (CRAWL_TIME NUMERIC(" . C\TIMESTAMP_LEN . ") PRIMARY KEY)",
-            "ENTITY" => "CREATE TABLE ENTITY(ENTITY_ID INTEGER
-                PRIMARY KEY $auto_increment,
-                ENTITY_NAME VARCHAR(" . C\MAX_DESCRIPTION_LEN ."),
-                USER_ID INTEGER)",
-            "EXPRESSION" => "CREATE TABLE EXPRESSION(EXPRESSION_ID INTEGER
-                PRIMARY KEY $auto_increment,
-                EXPRESSION VARCHAR(" . C\MAX_DESCRIPTION_LEN ."),
-                INTENT_ID INTEGER)",
             "FEED_ITEM" => "CREATE TABLE FEED_ITEM (GUID CHAR(".
                 C\TIMESTAMP_LEN . ") PRIMARY KEY,
                 TITLE VARCHAR(".C\TITLE_LEN."), LINK VARCHAR(" .
@@ -247,16 +244,6 @@ class ProfileModel extends Model
                 GROUPS (OWNER_ID)",
             "GRP_MEMBER_ACCESS_INDEX" => "CREATE INDEX GRP_MEMBER_ACCESS_INDEX
                 ON GROUPS(MEMBER_ACCESS)",
-            "INTENT" => "CREATE TABLE INTENT(
-                INTENT_ID $serial PRIMARY KEY
-                $auto_increment, INTENT VARCHAR(" . C\MAX_DESCRIPTION_LEN . "),
-                USER_ID INTEGER)",
-            "INTENT_EXPRESSION_ENTITY" =>"CREATE TABLE INTENT_EXPRESSION_ENTITY(
-                ID $serial PRIMARY KEY $auto_increment,
-                INTENT_ID INTEGER, EXPRESSION_ID INTEGER, ENTITY_ID INTEGER,
-                ENTITY_VALUE VARCHAR(" . C\MAX_DESCRIPTION_LEN ."))",
-            "IEE_INDEX" => "CREATE INDEX IEE_INDEX ON INTENT_EXPRESSION_ENTITY(
-                INTENT_ID, EXPRESSION_ID, ENTITY_ID)",
             "ITEM_IMPRESSION" => "CREATE TABLE ITEM_IMPRESSION(
                 USER_ID INTEGER, ITEM_ID INTEGER, ITEM_TYPE INTEGER,
                 VIEW_DATE NUMERIC(" . C\TIMESTAMP_LEN . "))",
@@ -390,10 +377,6 @@ class ProfileModel extends Model
                 ACCESS_COUNT INTEGER,
                 PRIMARY KEY(ADDRESS, PAGE_NAME))",
             "VERSION" => "CREATE TABLE VERSION(ID INTEGER PRIMARY KEY)",
-            "LEXICON" => "CREATE TABLE LEXICON(
-                TERM VARCHAR(". C\LONG_NAME_LEN ."),
-                LOCALE VARCHAR(" . C\NAME_LEN . "),
-                PART_OF_SPEECH VARCHAR(16), PRIMARY KEY(TERM, LOCALE))",
             ];
     }
     /**
@@ -499,13 +482,13 @@ class ProfileModel extends Model
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009-2012
  * @filesource
  */
diff --git a/src/models/RoleModel.php b/src/models/RoleModel.php
index d01a83e36..7af3b317c 100644
--- a/src/models/RoleModel.php
+++ b/src/models/RoleModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/ScraperModel.php b/src/models/ScraperModel.php
index cdc831126..427c55168 100644
--- a/src/models/ScraperModel.php
+++ b/src/models/ScraperModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.orgs
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/SearchfiltersModel.php b/src/models/SearchfiltersModel.php
index 97eb4c553..4c873effd 100644
--- a/src/models/SearchfiltersModel.php
+++ b/src/models/SearchfiltersModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/SigninModel.php b/src/models/SigninModel.php
index bd4c8f37e..9f56da0d4 100755
--- a/src/models/SigninModel.php
+++ b/src/models/SigninModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.orgs
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/SourceModel.php b/src/models/SourceModel.php
index 128b211f0..17e0a5d8a 100644
--- a/src/models/SourceModel.php
+++ b/src/models/SourceModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.orgs
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/UserModel.php b/src/models/UserModel.php
index e8c805813..c75f04543 100755
--- a/src/models/UserModel.php
+++ b/src/models/UserModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -536,10 +536,17 @@ class UserModel extends Model
                 }
             }
         }
+        if (!$this->isBotUser($user["USER_ID"])) {
+            if (!$is_new_bot) {
+                $sql = "DELETE FROM CHAT_BOT WHERE USER_ID = ?";
+                $db->execute($sql, [$user['USER_ID']]);
+            }
+            return;
+        }
         if ($is_new_bot) {
             $sql = "INSERT INTO CHAT_BOT(USER_ID, BOT_TOKEN,
                 CALLBACK_URL) VALUES (?, ?, ?)";
-            $result = $db->execute($sql,[$user['USER_ID'], $user['BOT_TOKEN'],
+            $result = $db->execute($sql, [$user['USER_ID'], $user['BOT_TOKEN'],
                 $user['CALLBACK_URL']]);
         } else {
             $sql = "UPDATE CHAT_BOT SET ";
diff --git a/src/models/VisitorModel.php b/src/models/VisitorModel.php
index dfbf6287d..8933839c9 100644
--- a/src/models/VisitorModel.php
+++ b/src/models/VisitorModel.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/datasources/DatasourceManager.php b/src/models/datasources/DatasourceManager.php
index 7d3aebe12..ad1ebe001 100755
--- a/src/models/datasources/DatasourceManager.php
+++ b/src/models/datasources/DatasourceManager.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/datasources/MysqlManager.php b/src/models/datasources/MysqlManager.php
index b5ffd45b1..32d76e28b 100755
--- a/src/models/datasources/MysqlManager.php
+++ b/src/models/datasources/MysqlManager.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/datasources/PdoManager.php b/src/models/datasources/PdoManager.php
index 2f802da66..559bafeaa 100644
--- a/src/models/datasources/PdoManager.php
+++ b/src/models/datasources/PdoManager.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/models/datasources/Sqlite3Manager.php b/src/models/datasources/Sqlite3Manager.php
index f5d723aae..25cfe26bc 100644
--- a/src/models/datasources/Sqlite3Manager.php
+++ b/src/models/datasources/Sqlite3Manager.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/privacy.php b/src/privacy.php
index cdd22c279..e31f08dc3 100755
--- a/src/privacy.php
+++ b/src/privacy.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * the SeekQuarry/Yioop Search engine
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/scripts/basic.js b/src/scripts/basic.js
index 727b025c0..963c0e4b0 100755
--- a/src/scripts/basic.js
+++ b/src/scripts/basic.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/scripts/big_int.js b/src/scripts/big_int.js
index 3b4807558..c15f9c700 100644
--- a/src/scripts/big_int.js
+++ b/src/scripts/big_int.js
@@ -17,14 +17,14 @@
  * 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/>.
+ * along with this program.    If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Akash Patel (edited by Chris Pollett chris@pollett.org)
  *     Ideas adapted Leemon Baird's bigint.js
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/scripts/chart.js b/src/scripts/chart.js
index 274d4585a..e557ba418 100644
--- a/src/scripts/chart.js
+++ b/src/scripts/chart.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2016
  * @filesource
  */
diff --git a/src/scripts/classifiers.js b/src/scripts/classifiers.js
index 4fbbd64ab..a06c3354b 100644
--- a/src/scripts/classifiers.js
+++ b/src/scripts/classifiers.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/scripts/hash_captcha.js b/src/scripts/hash_captcha.js
index 7d3b458b7..f12e8c62c 100644
--- a/src/scripts/hash_captcha.js
+++ b/src/scripts/hash_captcha.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/scripts/help.js b/src/scripts/help.js
index 724bff453..27cfc35f8 100644
--- a/src/scripts/help.js
+++ b/src/scripts/help.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala epinapala@live.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/scripts/history.js b/src/scripts/history.js
index 6a85f6a18..7fb213147 100644
--- a/src/scripts/history.js
+++ b/src/scripts/history.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Akshat Kukreti
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/scripts/mix.js b/src/scripts/mix.js
index 65fab400a..a66e5ebd0 100644
--- a/src/scripts/mix.js
+++ b/src/scripts/mix.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/scripts/register_validator.js b/src/scripts/register_validator.js
index 702a60509..7ac48d1bd 100644
--- a/src/scripts/register_validator.js
+++ b/src/scripts/register_validator.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sarika Padmashali (tweaks cpollett)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/scripts/sha1.js b/src/scripts/sha1.js
index 32ce90fa4..819419b83 100644
--- a/src/scripts/sha1.js
+++ b/src/scripts/sha1.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/scripts/spreadsheet.js b/src/scripts/spreadsheet.js
index 0aaf01c23..8331053b9 100644
--- a/src/scripts/spreadsheet.js
+++ b/src/scripts/spreadsheet.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2017 - 2018
  * @filesource
  */
diff --git a/src/scripts/suggest.js b/src/scripts/suggest.js
index 0850e3cd7..6c19dd848 100644
--- a/src/scripts/suggest.js
+++ b/src/scripts/suggest.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sandhya Vissapragada, Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018s
  * @filesource
  */
diff --git a/src/scripts/wiki.js b/src/scripts/wiki.js
index f9b1478d1..fa94a432b 100755
--- a/src/scripts/wiki.js
+++ b/src/scripts/wiki.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala (edited Chris Pollett)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2014
  * @filesource
  */
diff --git a/src/scripts/zkp.js b/src/scripts/zkp.js
index a792c7de2..b38c935ed 100644
--- a/src/scripts/zkp.js
+++ b/src/scripts/zkp.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Akash Patel (edited by Chris Pollett chris@pollett.org)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/terms.php b/src/terms.php
index c41a26bd7..dc763a233 100755
--- a/src/terms.php
+++ b/src/terms.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * the use of this web site
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/AdminView.php b/src/views/AdminView.php
index cf808db5a..ee1fdc461 100755
--- a/src/views/AdminView.php
+++ b/src/views/AdminView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/ApiView.php b/src/views/ApiView.php
index becd51335..54acd15a1 100644
--- a/src/views/ApiView.php
+++ b/src/views/ApiView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala epinapala@live.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/CrawlstatusView.php b/src/views/CrawlstatusView.php
index 9292d18bd..8c92f5adf 100755
--- a/src/views/CrawlstatusView.php
+++ b/src/views/CrawlstatusView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/FeedstatusView.php b/src/views/FeedstatusView.php
index a30fdbd90..b40d4d03d 100644
--- a/src/views/FeedstatusView.php
+++ b/src/views/FeedstatusView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/FetchView.php b/src/views/FetchView.php
index 37622d0a2..38789d467 100755
--- a/src/views/FetchView.php
+++ b/src/views/FetchView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/GroupView.php b/src/views/GroupView.php
index 8f7eac53d..3bf2f700a 100644
--- a/src/views/GroupView.php
+++ b/src/views/GroupView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/MachinestatusView.php b/src/views/MachinestatusView.php
index b70d22182..20eb7de66 100644
--- a/src/views/MachinestatusView.php
+++ b/src/views/MachinestatusView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/NocacheView.php b/src/views/NocacheView.php
index 6a73458e7..6d87d735b 100755
--- a/src/views/NocacheView.php
+++ b/src/views/NocacheView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/RecoverView.php b/src/views/RecoverView.php
index 2d4b66e93..13e2fc3ee 100644
--- a/src/views/RecoverView.php
+++ b/src/views/RecoverView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/RegisterView.php b/src/views/RegisterView.php
index 15f632107..51eef8411 100755
--- a/src/views/RegisterView.php
+++ b/src/views/RegisterView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/ResendEmailView.php b/src/views/ResendEmailView.php
index 21af2298b..ab97aaf26 100644
--- a/src/views/ResendEmailView.php
+++ b/src/views/ResendEmailView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/RssView.php b/src/views/RssView.php
index 77ab39ee1..9e5321496 100644
--- a/src/views/RssView.php
+++ b/src/views/RssView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/SearchView.php b/src/views/SearchView.php
index b1c10d26d..c443c9f5a 100755
--- a/src/views/SearchView.php
+++ b/src/views/SearchView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/SettingsView.php b/src/views/SettingsView.php
index 1e83eb702..7d10c586a 100755
--- a/src/views/SettingsView.php
+++ b/src/views/SettingsView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/SigninView.php b/src/views/SigninView.php
index 10df5cf04..360122e9e 100755
--- a/src/views/SigninView.php
+++ b/src/views/SigninView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/StaticView.php b/src/views/StaticView.php
index d6f58e779..d9ee650f3 100644
--- a/src/views/StaticView.php
+++ b/src/views/StaticView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/SuggestView.php b/src/views/SuggestView.php
index 040c79d2e..7229a1eec 100644
--- a/src/views/SuggestView.php
+++ b/src/views/SuggestView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/TestsView.php b/src/views/TestsView.php
index 1dad09aaa..521bdeb3f 100644
--- a/src/views/TestsView.php
+++ b/src/views/TestsView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/View.php b/src/views/View.php
index 1f88c32d6..268df1e88 100644
--- a/src/views/View.php
+++ b/src/views/View.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/WikiView.php b/src/views/WikiView.php
index 87739848e..7b8225ae8 100644
--- a/src/views/WikiView.php
+++ b/src/views/WikiView.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ActivityElement.php b/src/views/elements/ActivityElement.php
index f1f3d6871..82f6c1189 100755
--- a/src/views/elements/ActivityElement.php
+++ b/src/views/elements/ActivityElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.orgs
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ApiElement.php b/src/views/elements/ApiElement.php
index a15c4985b..f3b4d70fb 100644
--- a/src/views/elements/ApiElement.php
+++ b/src/views/elements/ApiElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala epinapala@live.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/AppearanceElement.php b/src/views/elements/AppearanceElement.php
index 358d72e12..7baa1dee8 100644
--- a/src/views/elements/AppearanceElement.php
+++ b/src/views/elements/AppearanceElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/BotstoryElement.php b/src/views/elements/BotstoryElement.php
index 17e2499b9..5c1b8b801 100644
--- a/src/views/elements/BotstoryElement.php
+++ b/src/views/elements/BotstoryElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -35,9 +35,9 @@ use seekquarry\yioop\configs as C;

 /**
  * Element responsible for displaying the bot story features
- * that someone can create for their own bot.
+ * that someone can use to create for their own chat bot.
  *
- * @author Harika Nukala
+ * @author Chris Pollett rewrite of file created by Harika Nukala
  */
 class BotstoryElement extends Element
 {
@@ -49,378 +49,112 @@ class BotstoryElement extends Element
      */
     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=botStory&amp;";
+        $add_pattern_url = $base_url . "pattern_form_type=addpattern";
+        $base_url .= "pattern_form_type=" . $data['PATTERN_FORM_TYPE'];
         ?>
         <div class="current-activity">
-                <ul class='tab-menu-list'>
-                    <li><a href="javascript:
-                switchTab('createintenttab', 'createentitytab',
-                'createexpressionstab');"
-                           id='createintenttabitem'
-                           class="<?= $data['create_intent_active'] ?>"><?=
-                            tl('botstory_element_create_intent')?></a></li>
-                    <li><a href="javascript:
-                switchTab('createentitytab', 'createintenttab',
-                'createexpressionstab');"
-                           id='createentitytabitem'
-                           class="<?= $data['create_entity_active'] ?>"><?=
-                            tl('botstory_element_create_entity')?></a></li>
-                    <li><a href="javascript:
-                switchTab('createexpressionstab', 'createintenttab',
-                'createentitytab');"
-                           id='createexpressionstabitem'
-                           class="<?= $data['create_expressions_active'] ?>"><?=
-                            tl('botstory_element_create_expressions')?></a></li>
-                </ul>
-                <div class='tab-menu-content'>
-                    <div id='createintenttab'>
-                        <?php
-                        $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=botStory&amp;
-                        option_type=".$data['option_type'];
-                        ?>
-                        <div>
-                            <?php if ($data["INTENT_FORM_TYPE"] == "editintent")
-                            {
-                                ?>
-                                <div class='float-opposite'><a href='<?=
-                                    $base_url ?>'><?=
-                            tl('botstory_element_addintent_form') ?></a></div>
-                               <h2><?= tl('botstory_element_edit_intent')?></h2>
-                                <?php
-                            }
-                            ?>
-                            </div>
-                        <form id="botIntentForm" method="post">
-                            <input type="hidden" name="c" value="admin" />
-                            <input type="hidden" id='option-type'
-                                   name="option_type" value="<?=
-                            $data['option_type'] ?>" />
-                            <input type="hidden" name="<?= C\CSRF_TOKEN ?>"
-                                   value="<?= $data[C\CSRF_TOKEN] ?>" />
-                            <input type="hidden" name="a" value="botStory" />
-                            <input type="hidden" name="arg" value="<?=
-                            $data['INTENT_FORM_TYPE']?>" />
-                            <?php
-                            if ($data['INTENT_FORM_TYPE'] == "editintent") {
-                            ?>
-                            <input type="hidden" name="id" value="<?=
-                                $data['id']?>" />
-                            <?php
-                            }
-                            ?>
-                            <div class="top-margin"><b><label for="intent"><?=
-                                     tl('botstory_element_intent')?></label></b>
-                               <input type="text" id="intent" class="wide-field"
-                                       name="BOT_INTENT" value="<?=
-                                       $data['BOT_INTENT']  ?>" />
-                                <button id="bot-intent-save" class="button-box"
-                                        type="submit"
-                                ><?= tl('bot_intent_save') ?></button>
-                            </div>
-                            </form>
-                        <?php
-                        ?>
-                        <table class="search-sources-table">
-                           <tr><th><?= tl('botstory_element_intentname') ?></th>
-                               <th colspan="3"><?=
-                                   tl('botstory_element_actions')?></th>
-                            </tr><?php
-                            foreach ($data['INTENTS'] as $intent) {
-                                ?>
-                                <tr>
-                                    <td><?= $intent['INTENT'] ?></td>
-                                    <td><a href="<?=$pre_base_url .
-                                    "&amp;a=botStory&amp;option_type=".
-                                        $data['option_type']
-                                        ."&amp;arg=editintent&amp;id=".
-                                         $intent['INTENT_ID']?>"><?=
-                                            tl('botstory_element_editintent')
-                                            ?></a></td>
-                                    <td><a onclick='javascript:return
-                                        confirm("<?=
-                                        tl('botstory_element_delete_operation')
-                                        ?>");' href="<?=$pre_base_url
-                                            ."&amp;a=botStory&amp;option_type="
-                                        .$data['option_type']
-                                        ."&amp;arg=deleteintent&amp;
-                                          id=".$intent['INTENT_ID']
-                                     ?>"><?= tl('botstory_element_deleteintent')
-                                            ?></a></td>
-                                </tr>
-                                <?php
-                            } ?>
-                        </table>
-                    </div>
-                    <div id='createentitytab'>
-                        <div>
-                          <?php if ($data["ENTITY_FORM_TYPE"] == "editentity") {
-                                ?>
-                           <div class='float-opposite'><a href='<?=
-                          $base_url ?>'><?=tl('botstory_element_addentity_form')
-                             ?></a></div>
-                               <h2><?= tl('botstory_element_edit_entity')?></h2>
-                           <?php
-                            }
-                            ?>
-                        </div>
-                        <form id="createEntityForm" method="post">
-                            <input type="hidden" name="c" value="admin" />
-                            <input type="hidden" id='option-type'
-                            name="option_type" value="<?=
-                            $data['option_type'] ?>" />
-                            <input type="hidden" name="<?= C\CSRF_TOKEN ?>"
-                            value="<?=
-                            $data[C\CSRF_TOKEN] ?>" />
-                            <input type="hidden" name="a" value="botStory" />
-                            <input type="hidden" name="arg" value="<?=
-                            $data['ENTITY_FORM_TYPE']?>" />
-                            <?php
-                            if ($data['ENTITY_FORM_TYPE'] == "editentity") {
-                                ?>
-                                <input type="hidden" name="id"
-                                    value="<?= $data['id']?>" />
-                                <?php
-                            }
-                            ?>
-                            <div class="top-margin">
-                                <table class="name-table">
-                                    <tr><th class="table-label">
-                                    <label for="new_entity"><?=
-                                            tl('botstory_element_new_entity')?>
-                                    </label>:</th>
-                                        <th> <input type="text" id="entity-name"
-                                                     class="wide-field"
-                                              name="BOT_ENTITY_NAME" value="<?=
-                                            $data['BOT_ENTITY_NAME']  ?>" />
-                                            </th>
-                                        </tr>
-                                <?php
-                                if ($data['ENTITY_FORM_TYPE'] == "editentity") {
-                                    ?>
-                                   <tr><th class="table-label"><label
-                                         for="new_entity_value"><?=
-                                       tl('botstory_element_new_entity_value')?>
-                                       </label>:</th>
-                                        <td><div class='light-gray-box'><table>
-                                        <?php
-                                        foreach ($data['ENTITY_VALUES'] as
-                                            $entity) {  ?>
-                                            <tr>
-                                                <td><?= $entity['ENTITY_VALUE']
-                                                ?></td>
-                                                <td><a onclick='javascript:
-                                                return confirm("<?=
-                                  tl('botstory_element_delete_operation') ?>");'
-                                                 href="<?=
-                                                 $pre_base_url ."&amp;a=botStory
-                                                &amp;option_type=create_entity"
-                                                    ."&amp;arg=deleteentityvalue
-                                                    &amp;id=".$entity['ID']
-                                                    ?>"><?=
-                                        tl('botstory_element_deleteentityvalue')
-                                                        ?></a></td>
-                                            </tr>
-                                            <?php
-                                        } ?>
-                                    <tr><td><input type="text" id="entity-value"
-                                            name="BOT_ENTITY_VALUE"
-                                            value="<?= $data['BOT_ENTITY_VALUE']
-                                          ?>" /></td></tr>
-                                    </table>
-                                           </div>
-                                <?php
-                                }
-                                ?>
-                                <tr><td></td></td><td class="center">
-                                 <button class="button-box" id="bot-entity-save"
-                                    type="submit"><?php
-                                    e(tl('bot_entity_save'));
-                                    ?></button></td></tr>
-                                    </table>
-                            </div>
-                        </form>
-                        <?php
-                        ?>
-                        <table class="search-sources-table">
-                           <tr><th><?= tl('botstory_element_entityname') ?></th>
-                                <th colspan="3"><?=
-                            tl('botstory_element_actions')?></th>
-                            </tr><?php
-                            foreach ($data['ENTITIES'] as $entity) {
-                                ?>
-                                <tr>
-                                    <td><?= $entity['ENTITY_NAME'] ?></td>
-                                    <td><a href="<?=$pre_base_url
-                                    ."&amp;a=botStory&amp;
-                                    option_type=create_entity"
-                                   ."&amp;arg=editentity&amp;id=".
-                                        $entity['ENTITY_ID']?>"><?=
-                                            tl('botstory_element_editentity')
-                                            ?></a></td>
-                                  <td><a onclick='javascript:return confirm("<?=
-                                  tl('botstory_element_delete_operation') ?>");'
-                                  href="<?=
-                                  $pre_base_url ."&amp;a=botStory&amp;
-                                    option_type=create_entity"
-                                        ."&amp;arg=deleteentity&amp;
-                                           id=".$entity['ENTITY_ID']
-                                     ?>"><?= tl('botstory_element_deleteentity')
-                                            ?></a></td>
-                                </tr>
-                                <?php
-                            } ?>
-                        </table>
-
-                    </div>
-                    <div id='createexpressionstab'>
-                        <div>
-                            <?php if ($data["EXPRESSION_FORM_TYPE"] ==
-                                     "editexpression") {
-                                ?>
-                                <div class='float-opposite'><a href='<?=
-                                        $base_url ?>'><?=
-                                       tl('botstory_element_addexpression_form')
-                                         ?></a></div>
-                                <h2><?= tl('botstory_element_edit_expression')?>
-                                </h2>
-                                <?php
-                            }
-                            ?>
-                        </div>
-                        <form id="expressionForm" method="post">
-                            <input type="hidden" name="c" value="admin" />
-                            <input type="hidden" id="option-type"
-                                  name="option_type"
-                                 value="<?= $data['option_type'] ?>" />
-                            <input type="hidden" name="<?= C\CSRF_TOKEN ?>"
-                            value="<?= $data[C\CSRF_TOKEN] ?>" />
-                            <input type="hidden" name="a" value="botStory" />
-                            <input type="hidden" name="arg" value="<?=
-                            $data['EXPRESSION_FORM_TYPE']?>" />
-                            <?php
-                            if ($data['EXPRESSION_FORM_TYPE'] ==
-                                   "editexpression") {
-                                ?>
-                                <input type="hidden" name="id"
-                                    value="<?= $data['id']?>" />
-                                <?php
-                            }
-                            ?>
-                            <table class="name-table">
-                                <tr><td><label for="intent-select"><b><?=
-                                             tl('botstory_element_intentselect')
-                                        ?></b></label></td><td>
-                                        <?php
-                                        $this->view->helper("options")->
-                                            render("intent-select",
-                                            "INTENT_ID", $data['INTENT_LISTS'],
-                                           $data['CURRENT_STORY']['INTENT_ID']);
-                                         ?></td></tr>
-                                <tr><td><b><label for="create_expressions"><?=
-                                        tl('botstory_element_new_expressions')?>
-                                        </label></b></label></td><td>
-                                        <input type="text" id="expression"
-                                                class="extra-wide-field"
-                                               name="EXPRESSION" value="<?=
-                                    $data['CURRENT_STORY']['EXPRESSION']  ?>" />
-                                               </td></tr>
-                              <tr><td colspan="3"><b><label for="view_entities">
-                                        <?= "Bot User has following Entities:"?>
-                                                </label></b></label></td></tr>
-                                <?php
-                                foreach ($data['ENTITIES'] as $entity) {
-                                    $value =
-                                        (empty($entity['ENTITY_NAME']) ||
-                                        empty($data[$entity['ENTITY_NAME']])) ?
-                                        "" : $data[$entity['ENTITY_NAME']];
-                                ?>
-                                <tr>
-                                    <td><input type="text" id="exp-entity-name"
-                                     class="wide-field" value="<?=
-                                     $entity['ENTITY_NAME'] ?>"
-                                        style="background: none;
-                                        border:none" disabled="disabled"/>
-                                        </td>
-                                    <td><input type="text" id="exp-entity-value"
-                                               class="wide-field"
-                                               name="<?=$entity['ENTITY_ID']?>"
-                                               value="<?= $value ?>"/>
-                                    </td>
-                                </tr>
-                                <?php
-                                } ?>
-                                <tr><td></td><td class="center">
-                             <button class="button-box" id="bot-expression-save"
-                              type="submit"><?= tl('bot_expression_save')
-                                            ?></button></td></tr>
-                            </table>
-                        </form>
-                        <table class="search-sources-table">
-                           <tr>
-                           <th><?= tl('botstory_element_expressionname') ?></th>
-                           <th><?= tl('botstory_element_intentname') ?></th>
-                          <th colspan="3"><?= tl('botstory_element_actions')?>
-                            </th>
-                            </tr><?php
-                            foreach ($data['EXPRESSIONS'] as $expression) {
-                                ?>
-                                <tr>
-                                    <td><?= $expression['EXPRESSION'] ?></td>
-                                    <td><?= $expression['INTENT'] ?></td>
-                                    <td><a href="<?=$pre_base_url .
-                                        "&amp;a=botStory&amp;" .
-                                        "option_type=create_expressions" .
-                                        "&amp;arg=editexpression&amp;id=".
-                                        $expression['EXPRESSION_ID']?>"><?=
-                                           tl('botstory_element_editexpression')
-                                            ?></a></td>
-                                    <td><a onclick='javascript:return
-                                        confirm("<?=
-                                        tl('botstory_element_delete_operation')
-                                        ?>");' href="<?=
-                                        $pre_base_url ."&amp;a=botStory&amp;
-                                        option_type=create_expressions"
-                                        ."&amp;arg=deleteexpression&amp;
-                                        id=".$expression['EXPRESSION_ID']
-                                 ?>"><?= tl('botstory_element_deleteexpression')
-                                            ?></a></td>
-                                </tr>
-                                <?php
-                            } ?>
-                        </table>
-                    </div>
-                </div>
-        </div>
-        <script type="text/javascript">
-            function switchTab(newtab, oldtab, oldtab2)
-            {
-                setDisplay(newtab, true);
-                setDisplay(oldtab, false);
-                setDisplay(oldtab2, false);
-                ntab = elt(newtab + "item");
-                if (ntab) {
-                    ntab.className = 'active';
-                }
-                otab = elt(oldtab + "item");
-                if (otab) {
-                    otab.className = '';
-                }
-                otab2 = elt(oldtab2 + "item");
-                if (otab2) {
-                    otab2.className = '';
-                }
-                ctype = elt('option-type');
-                if (ctype) {
-                    ctype.value = (newtab == 'createintenttab')
-                        ? 'create_intent' : ((newtab == 'createentitytab') ?
-                        'create_entity' : 'create_expressions' );
-                }
-                console.log(ctype)
+            <?php
+            $editpattern = ($data['PATTERN_FORM_TYPE'] == "editpattern") ?
+                true : false;
+            if ($editpattern) { ?>
+                <div class='float-opposite'><a href='<?=$add_pattern_url?>'>
+                    <?=tl('botstory_element_addpattern_form') ?></a></div>
+                <h2><?= tl('botstory_element_edit_pattern') . " " .
+                    $this->view->helper("helpbutton")->render(
+                    "Bot Story Patterns", $data[C\CSRF_TOKEN]) ?></h2><?php
+            } else { ?>
+                <h2><?= tl('botstory_element_add_pattern') . " " .
+                    $this->view->helper("helpbutton")->render(
+                    "Bot Story Patterns", $data[C\CSRF_TOKEN]) ?></h2><?php
             }
-        </script>
+            ?>
+            <form id="patternForm" 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="botStory" />
+            <input type="hidden" name="arg" value="<?=
+                $data['PATTERN_FORM_TYPE'] ?>" />
+            <?php
+            if (!empty($data['CURRENT_PATTERN']['pattern_id'])) { ?>
+                <input type="hidden" name="pattern_id" value="<?=
+                    $data['CURRENT_PATTERN']['pattern_id'] ?>" /><?php
+            } ?>
+            <table class="name-table">
+            <tr><th><?=tl('botstory_element_request') ?></th><td><input
+                type="text" name="request"
+                maxlength="<?= C\MAX_DESCRIPTION_LEN ?>"
+                value="<?= $data['CURRENT_PATTERN']['request'] ?>"
+                class="wide-field" /></td>
+            </tr>
+            <tr><th><?=tl('botstory_element_trigger_state') ?></th><td><input
+                type="text" name="trigger_state"  maxlength="<?= C\NAME_LEN  ?>"
+                value="<?= $data['CURRENT_PATTERN']['trigger_state'] ?>"
+                class="narrow-field" /></td>
+            </tr>
+            <tr><th><?=tl('botstory_element_remote_message') ?></th><td><input
+                type="text" name="remote_message"  maxlength="<?=
+                C\MAX_DESCRIPTION_LEN  ?>" value="<?=
+                $data['CURRENT_PATTERN']['remote_message'] ?>"
+                class="wide-field" />
+                </td>
+            </tr>
+            <tr><th><?=tl('botstory_element_result_state') ?></th><td><input
+                type="text" name="result_state"  maxlength="<?= C\NAME_LEN  ?>"
+                value="<?= $data['CURRENT_PATTERN']['result_state'] ?>"
+                class="narrow-field" /></td>
+            </tr>
+            <tr><th><?=tl('botstory_element_response') ?></th><td><input
+                type="text" name="response"  maxlength="<?=
+                C\MAX_DESCRIPTION_LEN  ?>" value="<?=
+                $data['CURRENT_PATTERN']['response'] ?>" class="wide-field" />
+                </td>
+            </tr>
+            <tr><td></td><td class="center"><button class="button-box"
+                type="submit"><?= tl('botstory_element_save') ?></button></td>
+            </tr>
+            </table>
+            </form>
+            <table class="search-sources-table">
+            <tr>
+            <th><?= tl('botstory_element_pattern_header') ?></th>
+            <th colspan="3"><?= tl('botstory_element_actions')?>
+            </th>
+            </tr><?php
+            foreach ($data['PATTERNS'] as $pattern) {
+                ?>
+                <tr>
+                <td><i><?= tl('botstory_element_request') ?></i> <?=
+                    $pattern['REQUEST'] ?><br />
+                <i><?= tl('botstory_element_trigger_state') ?></i> <?=
+                    $pattern['TRIGGER_STATE'] ?><br />
+                <i><?= tl('botstory_element_remote_message') ?></i> <?=
+                    $pattern['REMOTE_MESSAGE'] ?><br />
+                <i><?= tl('botstory_element_result_state') ?></i> <?=
+                    $pattern['RESULT_STATE'] ?><br />
+                <i><?= tl('botstory_element_response') ?></i> <?=
+                    $pattern['RESPONSE'] ?>
+                </td>
+                <td><a href="<?=$pre_base_url . "&amp;a=botStory&amp;" .
+                    "pattern_form_type=editpattern&amp;pattern_id=" .
+                    $pattern['PATTERN_ID'] ?>"><?=
+                    tl('botstory_element_editpattern')
+                        ?></a></td>
+                <td><a onclick='javascript:return confirm("<?=
+                    tl('botstory_element_delete_operation')
+                    ?>");' href="<?=$pre_base_url . "&amp;a=botStory&amp;" .
+                    "arg=deletepattern&amp;pattern_id=" .
+                    $pattern['PATTERN_ID'] ?>"><?=
+                    tl('botstory_element_deletepattern') ?></a></td>
+                </tr>
+                <?php
+            } ?>
+            </table>
+        </div>
         <?php
     }
 }
diff --git a/src/views/elements/ConfigureElement.php b/src/views/elements/ConfigureElement.php
index 7106b0fa1..96bc1d484 100644
--- a/src/views/elements/ConfigureElement.php
+++ b/src/views/elements/ConfigureElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/CrawloptionsElement.php b/src/views/elements/CrawloptionsElement.php
index efdf714e8..37fd6cd7c 100644
--- a/src/views/elements/CrawloptionsElement.php
+++ b/src/views/elements/CrawloptionsElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/DisplayadvertisementElement.php b/src/views/elements/DisplayadvertisementElement.php
index 1fbb2f038..bd5895ba0 100644
--- a/src/views/elements/DisplayadvertisementElement.php
+++ b/src/views/elements/DisplayadvertisementElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Pushkar Umaranikar
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/EditclassifierElement.php b/src/views/elements/EditclassifierElement.php
index c71881c08..4de816f2d 100644
--- a/src/views/elements/EditclassifierElement.php
+++ b/src/views/elements/EditclassifierElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/EditlocalesElement.php b/src/views/elements/EditlocalesElement.php
index 103574a08..4983fd5bb 100644
--- a/src/views/elements/EditlocalesElement.php
+++ b/src/views/elements/EditlocalesElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/EditmixElement.php b/src/views/elements/EditmixElement.php
index 8ab5b4b08..21e7f450d 100644
--- a/src/views/elements/EditmixElement.php
+++ b/src/views/elements/EditmixElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/Element.php b/src/views/elements/Element.php
index 4fc62f6f3..9085837ac 100755
--- a/src/views/elements/Element.php
+++ b/src/views/elements/Element.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/FooterElement.php b/src/views/elements/FooterElement.php
index 1e4504ae1..e52973298 100755
--- a/src/views/elements/FooterElement.php
+++ b/src/views/elements/FooterElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -94,7 +94,7 @@ class FooterElement extends Element
         if (tl('footer_element_developed_seek_quarry') !=
             'footer_element_developed_seek_quarry') {
             ?>
-            <a href="http://www.seekquarry.com/"><?=
+            <a href="https://www.seekquarry.com/"><?=
             tl('footer_element_developed_seek_quarry') ?></a><?php
         }
         ?> -
diff --git a/src/views/elements/GroupfeedElement.php b/src/views/elements/GroupfeedElement.php
index 8796720cf..2d642f46e 100644
--- a/src/views/elements/GroupfeedElement.php
+++ b/src/views/elements/GroupfeedElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/HelpElement.php b/src/views/elements/HelpElement.php
index 3d786b0d4..f3390292c 100644
--- a/src/views/elements/HelpElement.php
+++ b/src/views/elements/HelpElement.php
@@ -18,13 +18,13 @@
  *  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/>.
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  *  END LICENSE
  *
  *  @author Eswara Rajesh Pinapala epinapala@live.com
- *  @license http://www.gnu.org/licenses/ GPL3
- *  @link http://www.seekquarry.com/
+ *  @license https://www.gnu.org/licenses/ GPL3
+ *  @link https://www.seekquarry.com/
  *  @copyright 2009 - 2018
  *  @filesource
  */
diff --git a/src/views/elements/LanguageElement.php b/src/views/elements/LanguageElement.php
index b9cb92d4b..7427b77fd 100755
--- a/src/views/elements/LanguageElement.php
+++ b/src/views/elements/LanguageElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/MachinelogElement.php b/src/views/elements/MachinelogElement.php
index c66b6652a..41fe8a58d 100644
--- a/src/views/elements/MachinelogElement.php
+++ b/src/views/elements/MachinelogElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ManageaccountElement.php b/src/views/elements/ManageaccountElement.php
index b1fca0fa7..948eacbf7 100755
--- a/src/views/elements/ManageaccountElement.php
+++ b/src/views/elements/ManageaccountElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ManageadvertisementsElement.php b/src/views/elements/ManageadvertisementsElement.php
index 2f184dc61..5ef505ca3 100644
--- a/src/views/elements/ManageadvertisementsElement.php
+++ b/src/views/elements/ManageadvertisementsElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Pushkar Umaranikar
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ManageclassifiersElement.php b/src/views/elements/ManageclassifiersElement.php
index 6f6eb54f1..8a1062761 100644
--- a/src/views/elements/ManageclassifiersElement.php
+++ b/src/views/elements/ManageclassifiersElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ManagecrawlsElement.php b/src/views/elements/ManagecrawlsElement.php
index f7c8ea8d6..6ed716e20 100755
--- a/src/views/elements/ManagecrawlsElement.php
+++ b/src/views/elements/ManagecrawlsElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ManagecreditsElement.php b/src/views/elements/ManagecreditsElement.php
index d741f5271..f8e25f420 100644
--- a/src/views/elements/ManagecreditsElement.php
+++ b/src/views/elements/ManagecreditsElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ManagegroupsElement.php b/src/views/elements/ManagegroupsElement.php
index 1170e9039..a9c942f60 100755
--- a/src/views/elements/ManagegroupsElement.php
+++ b/src/views/elements/ManagegroupsElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Mallika Perepa (Creator), Chris Pollett (rewrote)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ManagelocalesElement.php b/src/views/elements/ManagelocalesElement.php
index e5a079f66..5a1a681e7 100644
--- a/src/views/elements/ManagelocalesElement.php
+++ b/src/views/elements/ManagelocalesElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ManagemachinesElement.php b/src/views/elements/ManagemachinesElement.php
index 8d7bb9c96..02bb1f33a 100644
--- a/src/views/elements/ManagemachinesElement.php
+++ b/src/views/elements/ManagemachinesElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ManagerolesElement.php b/src/views/elements/ManagerolesElement.php
index 1a287be65..2feae3530 100644
--- a/src/views/elements/ManagerolesElement.php
+++ b/src/views/elements/ManagerolesElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
@@ -100,7 +100,8 @@ class ManagerolesElement extends Element
                     e(tl('manageroles_element_edit'));
                     ?></a></td>
                 <td><?php
-                    if ($role['NAME'] == 'Admin' || $role['NAME'] == 'User') {
+                    if (in_array($role['NAME'], ['Admin', 'User',
+                        'Bot User', 'Business User'])) {
                         e('<span class="gray">'.
                             tl('manageroles_element_delete').'</span>');
                     } else {
@@ -180,7 +181,11 @@ class ManagerolesElement extends Element
                     e("<tr><td><b>".
                         $activity_array['ACTIVITY_NAME'].
                         "</b></td>");
-                    if ($data['CURRENT_ROLE']['name'] == 'Admin') {
+                    if ($data['CURRENT_ROLE']['name'] == 'Admin' &&
+                        in_array($activity_array['ACTIVITY_NAME'],
+                        ["Manage Account", "Manage Users",
+                        "Manage Roles", "Manage Groups",
+                        "Server Settings", "Security", "Configure"])) {
                         e("<td><span class='gray'>".
                             tl('manageroles_element_delete')."</span></td>");
                     } else {
@@ -235,4 +240,4 @@ class ManagerolesElement extends Element
         $view->helper("searchform")->render($data, $controller, $activity,
                 $view, $title, $return_form_name, $fields);
     }
-}
\ No newline at end of file
+}
diff --git a/src/views/elements/ManageusersElement.php b/src/views/elements/ManageusersElement.php
index 8f9d10711..33fee71ca 100644
--- a/src/views/elements/ManageusersElement.php
+++ b/src/views/elements/ManageusersElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/MixcrawlsElement.php b/src/views/elements/MixcrawlsElement.php
index 1ff18415f..6521ab06a 100644
--- a/src/views/elements/MixcrawlsElement.php
+++ b/src/views/elements/MixcrawlsElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/MoreoptionsElement.php b/src/views/elements/MoreoptionsElement.php
index 3f2c2bca4..11ca204be 100644
--- a/src/views/elements/MoreoptionsElement.php
+++ b/src/views/elements/MoreoptionsElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/PageoptionsElement.php b/src/views/elements/PageoptionsElement.php
index 96a909cd5..c1428b233 100644
--- a/src/views/elements/PageoptionsElement.php
+++ b/src/views/elements/PageoptionsElement.php
@@ -18,20 +18,19 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
 namespace seekquarry\yioop\views\elements;

 use seekquarry\yioop\configs as C;
-use seekquarry\yioop as B;

 /**
  * This element is used to render the Page Options admin activity
@@ -52,30 +51,20 @@ class PageOptionsElement extends Element
     {
     ?>
         <div class="current-activity">
-        <form id="pageoptionsForm" enctype="multipart/form-data"
-         method="post" action='?'>
+        <form id="pageoptionsForm" method="post">
         <ul class='tab-menu-list'>
         <li><a href="javascript:
-                switchTab('crawltimetab', 'searchtimetab', 'namedentitytab',
-                    'testoptionstab');"
+                switchTab('crawltimetab', 'searchtimetab', 'testoptionstab');"
             id='crawltimetabitem'
             class="<?=$data['crawl_time_active'] ?>"><?=
             tl('pageoptions_element_crawl_time')?></a></li>
         <li><a href="javascript:
-                switchTab('searchtimetab', 'crawltimetab', 'namedentitytab',
-                    'testoptionstab');"
+                switchTab('searchtimetab', 'crawltimetab','testoptionstab');"
             id='searchtimetabitem'
             class="<?=$data['search_time_active'] ?>"><?=
             tl('pageoptions_element_search_time')?></a></li>
         <li><a href="javascript:
-                switchTab('namedentitytab', 'crawltimetab', 'searchtimetab',
-                    'testoptionstab');"
-            id='namedentitytabitem'
-            class="<?=$data['named_entity_active'] ?>"><?=
-            tl('pageoptions_element_named_entity') ?></a></li>
-        <li><a href="javascript:
-                switchTab('testoptionstab', 'crawltimetab', 'searchtimetab',
-                'namedentitytab');"
+                switchTab('testoptionstab', 'crawltimetab', 'searchtimetab');"
             id='testoptionstabitem'
             class="<?=$data['test_options_active'] ?>"><?=
             tl('pageoptions_element_test_options') ?></a></li>
@@ -366,61 +355,6 @@ class PageOptionsElement extends Element
                 value="<?= $data['SERVER_ALPHA'] ?>" /></td></tr>
         </table>
         </div>
-        <div id='namedentitytab'>
-        <?php
-        $locale_list = [];
-        foreach ($data['LOCALES'] as $locale_tag => $locale_name) {
-            $locale_list[] = $locale_tag;
-        }
-        ?>
-        <input type="hidden" name="arg" value="save-entities" />
-        <h2>Entities: <?php echo $data['CURRENT_LOCALE_NAME'] ?></h2>
-        <table id="entity-table" class="entity-table">
-        <tr>
-        <th>Locale: <?=  $this->view->helper("options")->render("LOCALE_TAG",
-            "LOCALE_TAG", array_combine($locale_list, $locale_list),
-            $data['CURRENT_LOCALE_TAG'], true); ?></th>
-        <th>
-        <?php
-            $this->view->helper("options")->render("ADD_ENTITY_OPTION",
-            "ADD_ENTITY_OPTION", $data['upload_options'],
-             $data['entity_default'], "uploadOptions();");
-        ?>
-        </th>
-        </tr>
-        <?php
-        $admin_url = htmlentities(B\controllerUrl('admin', true));
-        $base_url = $admin_url ."a=pageOptions&amp;".
-            C\CSRF_TOKEN . "=" . $data[C\CSRF_TOKEN] . "&amp;selectlocale=" .
-            $data['CURRENT_LOCALE_TAG'];
-        $i = 0;
-        $delete_url = $base_url .
-        "&amp;arg=deleteentities&option_type=named_entity";
-        foreach ($data['ENTITIES'] as $entity) {
-            e("<tr><td style='display:none;'><input type='hidden' ".
-             "value='$entity' id=$i name=OLD_VALUE[$i]");
-            e("<tr><td><input type='text' ". "value='$entity'
-                id=$i name=EN[$i]/></td>");
-            $i++;
-            e("<td><a name=$entity href='$base_url"
-            ."&amp;arg=deleteentities&amp;option_type=named_entity&amp;
-            value=$entity"."'");?>
-            onclick='javascript:return confirm("<?php
-            e(tl('editentities_confirm_delete')); ?>");'><?php
-            e(tl("editentities_element_delete")."</a></td></tr>");
-        }
-        ?>
-        </table>
-        <?php
-            $this->view->helper("pagination")->render($base_url,
-                $data['LIMIT'], $data['NUM_ENTITIES_SHOW'],
-                $data['TOTAL_ENTITIES']);
-        ?>
-        <div id="save-entity-btn-space" class="center slight-pad">
-        <button type="submit" class="button-box" id="named-entity-btn">
-        <?php e(tl('pageoptions_element_save_options'));?></button></div>
-        </div>
-        </div>
         <div id='testoptionstab'>
         <h2><?= tl('pageoptions_element_test_page') ?>
         <?= $this->view->helper("helpbutton")->render(
@@ -436,7 +370,7 @@ class PageOptionsElement extends Element
         <textarea class="tall-text-area" id="testpage"
             name="TESTPAGE" ><?=$data['TESTPAGE'] ?></textarea>
         </div>
-        <div id="page-btn-space" class="center slight-pad">
+        <div class="center slight-pad">
             <button class="button-box" id="page-button"
             type="submit"><?php if ($data['test_options_active'] == "") {
                 e(tl('pageoptions_element_save_options'));
@@ -522,15 +456,11 @@ class PageOptionsElement extends Element
         }
         ?>
         <script type="text/javascript">
-        function switchTab(newtab, oldtab, oldtab2, oldtab3)
+        function switchTab(newtab, oldtab, oldtab2)
         {
-            var div1 = document.getElementById('save-entity-btn-space');
-            var div2 = document.getElementById('page-btn-space');
-
             setDisplay(newtab, true);
             setDisplay(oldtab, false);
             setDisplay(oldtab2, false);
-            setDisplay(oldtab3, false);
             ntab = elt(newtab + "item");
             if (ntab) {
                 ntab.className = 'active';
@@ -543,37 +473,11 @@ class PageOptionsElement extends Element
             if (otab2) {
                 otab2.className = '';
             }
-            otab3 = elt(oldtab3 + "item");
-            if (otab3) {
-                otab3.className = '';
-            }
             ctype = elt('option-type');
             if (ctype) {
-                switch (newtab) {
-                    case 'crawltimetab':
-                        ctype.value = 'crawl_time';
-                        div1.style.display = "none";
-                        div2.style.display = "block";
-                        break;
-
-                    case 'searchtimetab':
-                        ctype.value = 'search_time';
-                        div1.style.display = "none";
-                        div2.style.display = "block";
-                        break;
-
-                    case 'namedentitytab':
-                        ctype.value = 'named_entity';
-                        div1.style.display = "block";
-                        div2.style.display = "none";
-                        break;
-
-                    default:
-                        ctype.value = 'test_options';
-                        div1.style.display = "none";
-                        div2.style.display = "block";
-                }
-
+                ctype.value = (newtab == 'crawltimetab')
+                    ? 'crawl_time' : ((newtab == 'searchtimetab') ?
+                    'search_time' : 'test_options' );
                 if (ctype.value == 'test_options') {
                     elt('page-button').innerHTML =
                         '<?= tl('pageoptions_element_run_tests') ?>';
@@ -585,31 +489,6 @@ class PageOptionsElement extends Element
                 }
             }
         }
-
-        function uploadOptions() {
-            var form = document.getElementById("pageoptionsForm");
-            var options = document.getElementById("ADD_ENTITY_OPTION");
-            var index = options.selectedIndex;
-            var text =  options[index].text;
-            if (text == '<?= tl('pageoptions_element_add_entity') ?>') {
-                var entity_name = document.createElement('input');
-                entity_name.setAttribute('name', 'ENTITY_NAME');
-                entity_name.setAttribute('type', 'text');
-                var entity = prompt("Please enter the entity:", "");
-                if (entity != null || entity != "") {
-                    entity_name.value = entity;
-                    form.appendChild(entity_name);
-                    entity_name.style.visibility = "hidden";
-                }
-            } else if (text == '<?= tl('pageoptions_element_file_upload') ?>') {
-                var fileSelector = document.createElement('input');
-                fileSelector.setAttribute('name', 'ENTITY_FILE');
-                fileSelector.setAttribute('type', 'file');
-                fileSelector.click();
-                form.appendChild(fileSelector);
-                fileSelector.style.visibility = "hidden";
-            }
-        }
         </script>
     <?php
     }
diff --git a/src/views/elements/QuerystatsElement.php b/src/views/elements/QuerystatsElement.php
index 1c4fe2f3f..74a396ba5 100644
--- a/src/views/elements/QuerystatsElement.php
+++ b/src/views/elements/QuerystatsElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ResultseditorElement.php b/src/views/elements/ResultseditorElement.php
index f5f81aa10..e63dfb57f 100644
--- a/src/views/elements/ResultseditorElement.php
+++ b/src/views/elements/ResultseditorElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ScrapersElement.php b/src/views/elements/ScrapersElement.php
index ed1bd43db..2e0ada6c8 100644
--- a/src/views/elements/ScrapersElement.php
+++ b/src/views/elements/ScrapersElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/SearchsourcesElement.php b/src/views/elements/SearchsourcesElement.php
index 9f1508fe9..37dfb7372 100644
--- a/src/views/elements/SearchsourcesElement.php
+++ b/src/views/elements/SearchsourcesElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/SecurityElement.php b/src/views/elements/SecurityElement.php
index b5e58b927..b18b62040 100755
--- a/src/views/elements/SecurityElement.php
+++ b/src/views/elements/SecurityElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Sreenidhi Muralidharan
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/ServersettingsElement.php b/src/views/elements/ServersettingsElement.php
index e160aa7fe..650f85bcc 100644
--- a/src/views/elements/ServersettingsElement.php
+++ b/src/views/elements/ServersettingsElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/SigninElement.php b/src/views/elements/SigninElement.php
index 552024ae8..0f97e4036 100755
--- a/src/views/elements/SigninElement.php
+++ b/src/views/elements/SigninElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/StatisticsElement.php b/src/views/elements/StatisticsElement.php
index 424fa1c11..26fd900d9 100644
--- a/src/views/elements/StatisticsElement.php
+++ b/src/views/elements/StatisticsElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/SubsearchElement.php b/src/views/elements/SubsearchElement.php
index c26b21fd8..ee05861a1 100644
--- a/src/views/elements/SubsearchElement.php
+++ b/src/views/elements/SubsearchElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/elements/WikiElement.php b/src/views/elements/WikiElement.php
index 56cbc30cd..66d414cbb 100644
--- a/src/views/elements/WikiElement.php
+++ b/src/views/elements/WikiElement.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/DisplayresultsHelper.php b/src/views/helpers/DisplayresultsHelper.php
index df9735a31..b67765a8b 100644
--- a/src/views/helpers/DisplayresultsHelper.php
+++ b/src/views/helpers/DisplayresultsHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Priya Gangaraju priya.gangaraju@gmail.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/FeedsHelper.php b/src/views/helpers/FeedsHelper.php
index 518029e9b..5b20718b5 100644
--- a/src/views/helpers/FeedsHelper.php
+++ b/src/views/helpers/FeedsHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/FiletypeHelper.php b/src/views/helpers/FiletypeHelper.php
index bbc6c18ef..0484f3c17 100644
--- a/src/views/helpers/FiletypeHelper.php
+++ b/src/views/helpers/FiletypeHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/FileuploadHelper.php b/src/views/helpers/FileuploadHelper.php
index 601df1e1f..ee07fd785 100644
--- a/src/views/helpers/FileuploadHelper.php
+++ b/src/views/helpers/FileuploadHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/HelpbuttonHelper.php b/src/views/helpers/HelpbuttonHelper.php
index d9b589da9..7eee39ccf 100644
--- a/src/views/helpers/HelpbuttonHelper.php
+++ b/src/views/helpers/HelpbuttonHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala epinapala@live.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/Helper.php b/src/views/helpers/Helper.php
index 1ed10ed72..0ce6837b5 100755
--- a/src/views/helpers/Helper.php
+++ b/src/views/helpers/Helper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/ImagesHelper.php b/src/views/helpers/ImagesHelper.php
index 6d7cd3573..f5c09d797 100644
--- a/src/views/helpers/ImagesHelper.php
+++ b/src/views/helpers/ImagesHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/OptionsHelper.php b/src/views/helpers/OptionsHelper.php
index 73466cd6c..f2f7bc066 100755
--- a/src/views/helpers/OptionsHelper.php
+++ b/src/views/helpers/OptionsHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/PaginationHelper.php b/src/views/helpers/PaginationHelper.php
index b47aa3b4e..80072521f 100755
--- a/src/views/helpers/PaginationHelper.php
+++ b/src/views/helpers/PaginationHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/PagingtableHelper.php b/src/views/helpers/PagingtableHelper.php
index 8538baece..8f5dd838d 100644
--- a/src/views/helpers/PagingtableHelper.php
+++ b/src/views/helpers/PagingtableHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/SearchformHelper.php b/src/views/helpers/SearchformHelper.php
index 8339a0abf..559354893 100644
--- a/src/views/helpers/SearchformHelper.php
+++ b/src/views/helpers/SearchformHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/ToggleHelper.php b/src/views/helpers/ToggleHelper.php
index 46818e272..2762990a5 100644
--- a/src/views/helpers/ToggleHelper.php
+++ b/src/views/helpers/ToggleHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/helpers/VideourlHelper.php b/src/views/helpers/VideourlHelper.php
index aff60f2eb..06b4801e9 100644
--- a/src/views/helpers/VideourlHelper.php
+++ b/src/views/helpers/VideourlHelper.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/layouts/ApiLayout.php b/src/views/layouts/ApiLayout.php
index 315b6e321..80bc6c10d 100644
--- a/src/views/layouts/ApiLayout.php
+++ b/src/views/layouts/ApiLayout.php
@@ -18,13 +18,13 @@
  *  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/>.
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  *  END LICENSE
  *
  *  @author Eswara Rajesh Pinapala epinapala@live.com
- *  @license http://www.gnu.org/licenses/ GPL3
- *  @link http://www.seekquarry.com/
+ *  @license https://www.gnu.org/licenses/ GPL3
+ *  @link https://www.seekquarry.com/
  *  @copyright 2009 - 2018
  *  @filesource
  */
diff --git a/src/views/layouts/Layout.php b/src/views/layouts/Layout.php
index 0692efb2b..913644644 100755
--- a/src/views/layouts/Layout.php
+++ b/src/views/layouts/Layout.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/layouts/RssLayout.php b/src/views/layouts/RssLayout.php
index a742bcd87..5629fd7b3 100644
--- a/src/views/layouts/RssLayout.php
+++ b/src/views/layouts/RssLayout.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/src/views/layouts/WebLayout.php b/src/views/layouts/WebLayout.php
index 00f39e4cb..345b5a6bc 100755
--- a/src/views/layouts/WebLayout.php
+++ b/src/views/layouts/WebLayout.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/BloomFilterFileTest.php b/tests/BloomFilterFileTest.php
index 259757907..17f084fbd 100755
--- a/tests/BloomFilterFileTest.php
+++ b/tests/BloomFilterFileTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/BtreeTest.php b/tests/BtreeTest.php
index 3d140afc1..164ee1f1c 100644
--- a/tests/BtreeTest.php
+++ b/tests/BtreeTest.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * etags during a crawl
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/DeTokenizerTest.php b/tests/DeTokenizerTest.php
index 2bc9aedcb..cd24a034d 100644
--- a/tests/DeTokenizerTest.php
+++ b/tests/DeTokenizerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/DocxProcessorTest.php b/tests/DocxProcessorTest.php
index a282cb26c..e70e9a861 100644
--- a/tests/DocxProcessorTest.php
+++ b/tests/DocxProcessorTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Nakul Natu nakul.natu@gmail.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/EnTokenizerTest.php b/tests/EnTokenizerTest.php
index 8786a4847..b36598eca 100644
--- a/tests/EnTokenizerTest.php
+++ b/tests/EnTokenizerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/EpubProcessorTest.php b/tests/EpubProcessorTest.php
index 6712d69e8..81e804269 100644
--- a/tests/EpubProcessorTest.php
+++ b/tests/EpubProcessorTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Vijeth Patil vijeth.patil@gmail.coms
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/EsTokenizerTest.php b/tests/EsTokenizerTest.php
index c892c64fa..52f7f4682 100644
--- a/tests/EsTokenizerTest.php
+++ b/tests/EsTokenizerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/FaTokenizerTest.php b/tests/FaTokenizerTest.php
index a18727ec3..69d313944 100644
--- a/tests/FaTokenizerTest.php
+++ b/tests/FaTokenizerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/FrTokenizerTest.php b/tests/FrTokenizerTest.php
index af1674480..dfb428da0 100644
--- a/tests/FrTokenizerTest.php
+++ b/tests/FrTokenizerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/HashTableTest.php b/tests/HashTableTest.php
index 18d8cb42b..6969fa9dc 100755
--- a/tests/HashTableTest.php
+++ b/tests/HashTableTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/HiTokenizerTest.php b/tests/HiTokenizerTest.php
new file mode 100644
index 000000000..a46e5380a
--- /dev/null
+++ b/tests/HiTokenizerTest.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * SeekQuarry/Yioop --
+ * Open Source Pure PHP Search Engine, Crawler, and Indexer
+ *
+ * Copyright (C) 2009 - 2017  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 <https://www.gnu.org/licenses/>.
+ *
+ * END LICENSE
+ *
+ * @author Chris Pollett chris@pollett.org
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
+ * @copyright 2009 - 2018
+ * @filesource
+ */
+namespace seekquarry\yioop\tests;
+
+use seekquarry\yioop\configs as C;
+use seekquarry\yioop\library as L;
+use seekquarry\yioop\library\PhraseParser;
+use seekquarry\yioop\library\UnitTest;
+
+/**
+ * Code used to test the Hindi stemming algorithm. The inputs for the
+ * algorithm came from the sample text file for the
+ * The stemmed results come from the Java program that the PHP stemmer is
+ * based off of at
+ * http://members.unine.ch/jacques.savoy/clef/HindiStemmerLight.java.txt
+ * which has since been modified to try to improve accuracy
+ *
+ * @author Chris Pollett
+ */
+class HiTokenizerTest extends UnitTest
+{
+    /**
+     * Each test we set up a new Hindi Tokenizer object
+     */
+    public function setUp()
+    {
+        $this->test_objects['FILE1'] = PhraseParser::getTokenizer("hi");
+    }
+    /**
+     * Nothing done for unit test tear done
+     */
+    public function tearDown()
+    {
+    }
+    /**
+     * Tests whether the stem function for the Hindi stemming algorithm
+     * stems words according to the rules of stemming. The function tests stem
+     * by calling stem with the words in $test_words and compares the results
+     * with the stem words in $stem_words
+     *
+     * $test_words is an array containing a set of words in French provided in
+     * the snowball web page
+     * $stem_words is an array containing the stems for words in $test_words
+     */
+    public function stemmerTestCase()
+    {
+        $stem_dir = C\PARENT_DIR.'/tests/test_files/hindi_stemmer';
+        //Test word set from snowball
+        $test_words = file("$stem_dir/input_vocabulary.txt");
+        //Stem word set from snowball for comparing results
+        $stem_words = file("$stem_dir/stemmed_result.txt");
+        /**
+         * check if function stem correctly stems the words in $test_words by
+         * comparing results with stem words in $stem_words
+         */
+        $tokenizer = $this->test_objects['FILE1'];
+        $no_stem_list = isset($tokenizer::$no_stem_list) ?
+            $tokenizer::$no_stem_list : [];
+        for ($i = 0; $i < count($test_words); $i++) {
+            $word = trim($test_words[$i]);
+            if (in_array($word, $no_stem_list) ||
+                strlen($word) < 3) {
+                continue;
+            }
+            $stem = trim($stem_words[$i]);
+            $word_stem = $tokenizer->stem($word);
+            $this->assertEqual($word_stem, $stem, "function stem correctly ".
+                "stems $word to $stem, stems to $word_stem instead");
+        }
+    }
+    /**
+     *
+     */
+    public function partsOfSpeechTestCase()
+    {
+        $tokenizer = $this->test_objects['FILE1'];
+        echo $tokenizer::tagPartsOfSpeechPhrase("महामा गाँधी का जम 2 अक्टूबर को हुआ");
+
+    }
+}
diff --git a/tests/IndexShardTest.php b/tests/IndexShardTest.php
index 53198f7da..a1bc2abbc 100644
--- a/tests/IndexShardTest.php
+++ b/tests/IndexShardTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/ItTokenizerTest.php b/tests/ItTokenizerTest.php
index 0bb0df5e3..1b7b5d114 100644
--- a/tests/ItTokenizerTest.php
+++ b/tests/ItTokenizerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/ManyScrapersExperiment.php b/tests/ManyScrapersExperiment.php
index a5bfefb7c..65d255f62 100644
--- a/tests/ManyScrapersExperiment.php
+++ b/tests/ManyScrapersExperiment.php
@@ -18,14 +18,14 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Charles Bocage charles.bocage@sjsu.edu
  *  (changed to web scrapers by Chris Pollett)
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/ManyUserExperiment.php b/tests/ManyUserExperiment.php
index 9946e1f78..0c6bd65fb 100644
--- a/tests/ManyUserExperiment.php
+++ b/tests/ManyUserExperiment.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * operations take.
  *
  * @author Chris Pollett chris@pollett.orgs
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/NlTokenizerTest.php b/tests/NlTokenizerTest.php
index 673511ef0..e2a76a951 100644
--- a/tests/NlTokenizerTest.php
+++ b/tests/NlTokenizerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/PdfProcessorTest.php b/tests/PdfProcessorTest.php
index 5df3d1f9a..39032a8bf 100644
--- a/tests/PdfProcessorTest.php
+++ b/tests/PdfProcessorTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/PhantomjsUiTest.php b/tests/PhantomjsUiTest.php
index 0e8b155e8..8ca5f376a 100644
--- a/tests/PhantomjsUiTest.php
+++ b/tests/PhantomjsUiTest.php
@@ -13,12 +13,12 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala epinapala@live.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/PhraseParserTest.php b/tests/PhraseParserTest.php
index 4f9e520f6..ea429e151 100644
--- a/tests/PhraseParserTest.php
+++ b/tests/PhraseParserTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/PptxProcessorTest.php b/tests/PptxProcessorTest.php
index d98379ac6..22e8c61ba 100644
--- a/tests/PptxProcessorTest.php
+++ b/tests/PptxProcessorTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Nakul Natu nakul.natu@gmail.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/PriorityQueueTest.php b/tests/PriorityQueueTest.php
index 2f1683e4d..010372f50 100755
--- a/tests/PriorityQueueTest.php
+++ b/tests/PriorityQueueTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/PtTokenizerTest.php b/tests/PtTokenizerTest.php
index 16c5d04de..0ef230a23 100644
--- a/tests/PtTokenizerTest.php
+++ b/tests/PtTokenizerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Niravkumar Patel niravkumar.patel1989@gmail.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/QueueServerTest.php b/tests/QueueServerTest.php
index 2e46d1458..779848cd0 100644
--- a/tests/QueueServerTest.php
+++ b/tests/QueueServerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/RuTokenizerTest.php b/tests/RuTokenizerTest.php
index 6054b0b87..ecac824c8 100644
--- a/tests/RuTokenizerTest.php
+++ b/tests/RuTokenizerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/ScraperManagerTest.php b/tests/ScraperManagerTest.php
index 08276fe87..f45bdb5b3 100644
--- a/tests/ScraperManagerTest.php
+++ b/tests/ScraperManagerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://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/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/Sha1JavascriptTest.php b/tests/Sha1JavascriptTest.php
index 17062c69e..9281bc27f 100644
--- a/tests/Sha1JavascriptTest.php
+++ b/tests/Sha1JavascriptTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/SocketExperiment.php b/tests/SocketExperiment.php
index 583c134d0..ea17b11f9 100755
--- a/tests/SocketExperiment.php
+++ b/tests/SocketExperiment.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -37,8 +37,8 @@
  * </pre>
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/StringArrayTest.php b/tests/StringArrayTest.php
index 4d77fc78f..03d53293b 100644
--- a/tests/StringArrayTest.php
+++ b/tests/StringArrayTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/StringCatExperiment.php b/tests/StringCatExperiment.php
index dff218f5f..fff8bad99 100644
--- a/tests/StringCatExperiment.php
+++ b/tests/StringCatExperiment.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * operations take.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/SummarizerTest.php b/tests/SummarizerTest.php
index d51b97989..d4d3ed521 100644
--- a/tests/SummarizerTest.php
+++ b/tests/SummarizerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/TrieTest.php b/tests/TrieTest.php
index d043f4201..2ae1bb70c 100755
--- a/tests/TrieTest.php
+++ b/tests/TrieTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/UrlParserTest.php b/tests/UrlParserTest.php
index 1114521fc..351ce3636 100644
--- a/tests/UrlParserTest.php
+++ b/tests/UrlParserTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/UtilityTest.php b/tests/UtilityTest.php
index bd6d97ea7..9794c91aa 100644
--- a/tests/UtilityTest.php
+++ b/tests/UtilityTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/VersionManagerTest.php b/tests/VersionManagerTest.php
index 00cfdd744..03dac6a70 100644
--- a/tests/VersionManagerTest.php
+++ b/tests/VersionManagerTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/WebArchiveTest.php b/tests/WebArchiveTest.php
index 0ffc3d356..337e03d37 100755
--- a/tests/WebArchiveTest.php
+++ b/tests/WebArchiveTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/WebQueueBundleTest.php b/tests/WebQueueBundleTest.php
index d8d3a3ba4..0775c64d4 100644
--- a/tests/WebQueueBundleTest.php
+++ b/tests/WebQueueBundleTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/XlsxProcessorTest.php b/tests/XlsxProcessorTest.php
index c7dd2ddf3..0bf6fe0ab 100644
--- a/tests/XlsxProcessorTest.php
+++ b/tests/XlsxProcessorTest.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Tarun Ramaswamy tarun.pepira@gmail.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/mobile_ui_tests.js b/tests/mobile_ui_tests.js
index 2ed926af0..79c3a6371 100644
--- a/tests/mobile_ui_tests.js
+++ b/tests/mobile_ui_tests.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala epinapala@live.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/phantomjs_runner.js b/tests/phantomjs_runner.js
index ba0b5f904..a37c689e7 100644
--- a/tests/phantomjs_runner.js
+++ b/tests/phantomjs_runner.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala epinapala@live.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/test_files/VocabSampler.php b/tests/test_files/VocabSampler.php
index 11367edc5..bca8db57f 100644
--- a/tests/test_files/VocabSampler.php
+++ b/tests/test_files/VocabSampler.php
@@ -18,7 +18,7 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
@@ -26,8 +26,8 @@
  * operations take.
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/tests/test_files/hindi_stemmer/input_vocabulary.txt b/tests/test_files/hindi_stemmer/input_vocabulary.txt
new file mode 100644
index 000000000..623db2580
--- /dev/null
+++ b/tests/test_files/hindi_stemmer/input_vocabulary.txt
@@ -0,0 +1,1000 @@
+है
+हैं
+लिए
+कुछ
+होता
+दिया
+हुए
+रूप
+से
+मैं
+रहा
+बात
+क्या
+बहुत
+तरह
+बाद
+फिर
+रहे
+होने
+एवं
+हुई
+उनके
+चाहिए
+दिन
+लेकिन
+काम
+इसके
+उन्हें
+आदि
+बार
+दोनों
+उन्होंने
+कार्य
+लिया
+उनकी
+प्राप्त
+लोगों
+गयी
+लगा
+अन्य
+देश
+यदि
+नाम
+वर्ष
+विकास
+अपना
+दूसरे
+भाषा
+मेरे
+बड़े
+वाली
+व्यक्ति
+इसलिए
+तीन
+इसका
+विशेष
+स्थिति
+परन्तु
+स्थान
+यही
+क्यों
+गाँव
+अलग
+जिस
+बाहर
+बना
+तैयार
+अनेक
+शिक्षा
+दृष्टि
+श्री
+थीं
+चार
+बड़ा
+आगे
+उत्तर
+आने
+लगे
+लगभग
+होना
+इससे
+मात्रा
+वाला
+नीचे
+हो
+प्रतिशत
+अगर
+आया
+स्वयं
+रात
+किए
+निर्माण
+पूर्व
+देख
+दिनों
+रंग
+स्तर
+मेरा
+दूसरी
+रोग
+काल
+अच्छी
+ज्ञान
+बनाने
+रखा
+आवश्यकता
+हों
+सहायता
+अतिरिक्त
+देर
+तरफ
+लेने
+सामाजिक
+मगर
+समझ
+कला
+भीतर
+संस्कृति
+विभाग
+बताया
+जगह
+इतनी
+स्थापित
+राष्ट्रीय
+स्वर
+जिसके
+दौरान
+हाँ
+किस
+केन्द्र
+पूर्ण
+पुलिस
+थईआ
+कार्यक्रम
+समस्या
+भूमि
+भाव
+देखकर
+मूल
+आये
+लाभ
+राम
+सेवा
+रचना
+की
+भिन्न
+आती
+बल्कि
+प्राय
+लेते
+जान
+बढ़
+सारे
+शायद
+पड़ा
+छोड़
+विधि
+जबकि
+लिखा
+सिर्फ
+प्रक्रिया
+शब्दों
+लाल
+गए
+स्वीकार
+याद
+उठा
+माध्यम
+दूसरा
+जिन
+संबंध
+चाहे
+चाहते
+प्रणाली
+इनमें
+पुत्र
+उद्देश्य
+पिछले
+ताकि
+बालक
+अन्त
+संगीत
+हजार
+कोशिश
+पति
+खाने
+प्रकृति
+फसल
+नीति
+पक्ष
+पौधों
+प्रकट
+यद्यपि
+भारी
+मात्र
+चाहिये
+अन्तर्गत
+शामिल
+अपेक्षा
+बोली
+हेतु
+नगर
+सम्बन्धी
+पुस्तक
+खुद
+जोर
+बने
+युग
+बैठ
+अर्थात
+लगती
+सारा
+अवसर
+लें
+शैली
+चारों
+प्रकाश
+जायेगा
+उल्लेख
+लेना
+विकसित
+प्रसिद्ध
+बन्द
+विशिष्ट
+रखते
+सिद्ध
+वालों
+चित्रों
+पदार्थ
+इतने
+दिए
+गति
+पड़ी
+संगठन
+इस्तेमाल
+कितना
+प्रकाशित
+पड़े
+अंग्रेजी
+आधुनिक
+सुन्दर
+शहर
+उनको
+महीने
+संसार
+रखना
+पृथ्वी
+ऊर्जा
+संघ
+वास्तविक
+हमने
+सहयोग
+अवधि
+प्रचलित
+लगते
+सात
+संघर्ष
+दिशा
+बैठा
+स्थित
+अधिकांश
+तुलना
+शादी
+वातावरण
+राजीव
+सम्पूर्ण
+कितने
+परम्परा
+मानसिक
+अंग
+बोले
+जरूरत
+बैठक
+इनकी
+ग्रामीण
+कथा
+निकाल
+घटना
+बातचीत
+कवि
+आयी
+इच्छा
+रक्त
+आकार
+गुण
+हृदय
+चुकी
+नष्ट
+खेती
+आरम्भ
+जिन्हें
+सुबह
+खाली
+वायु
+ॐ
+व्यक्तियों
+राजनीतिक
+जरा
+तेज
+बदल
+उपज
+उपभोक्ता
+मकान
+कपड़े
+जानते
+देवता
+प्रयत्न
+संभव
+सकता
+निकट
+वास्तव
+बाकी
+कठिन
+अरे
+सोच
+राज्यों
+अभाव
+किस्म
+सीधे
+जरूरी
+पुराने
+विदेशी
+सेना
+जाएगी
+वनस्पति
+अधिकारी
+पार
+आशा
+पूर्ति
+सुधार
+जानता
+अध्यक्ष
+व्यापक
+ध्वनि
+प्रचार
+प्रयुक्त
+प्रगति
+उन्हीं
+लगातार
+आखिर
+लौट
+बनाये
+सुरक्षित
+दें
+सोचा
+चीज
+खेत
+लाने
+श्रीमती
+उपयुक्त
+चाहती
+मामले
+वस्तुओं
+शारीरिक
+बाबू
+तुम्हारी
+सफलता
+संस्थान
+पैर
+करे
+विचारों
+जिसकी
+नियम
+अंदर
+पेट
+त्वचा
+गायन
+लागू
+जमा
+बोर्ड
+कानून
+क्रम
+लेखक
+बावजूद
+शुरु
+स्टेशन
+अगले
+सम्भव
+गर्म
+रास्ते
+अधिकारियों
+पुरानी
+संबंधी
+यानी
+युवक
+पाठ
+रखकर
+पशु
+अंक
+सरल
+वृक्ष
+शिकार
+मुझसे
+हत्या
+आँखों
+शुद्ध
+दृष्टिकोण
+लम्बी
+बनाना
+बच्चा
+दीवार
+अध्याय
+अत्यधिक
+सचमुच
+सम्मेलन
+बिहार
+मुख
+तार
+चूर्ण
+परस्पर
+बता
+लघु
+तुम्हारा
+छात्र
+अक्सर
+चुप
+वाद्य
+जायेगी
+फलों
+आजकल
+भार
+रखे
+अमेरिका
+गिर
+उतर
+विषयों
+सुना
+स्थानीय
+गांवों
+व्यवसाय
+शताब्दी
+निश्चय
+बाँध
+आतंकवादियों
+भागों
+अंश
+वैदिक
+काट
+अधिकतर
+बैठी
+स्वाभाविक
+ग्रन्थ
+कही
+नियोजन
+शत्रु
+सूर्य
+पश्चात्‌
+आयोजित
+चिन्ता
+सिख
+भेज
+वाद्यों
+मुसलमान
+दृश्य
+खाद
+समुद्र
+डाक
+कदम
+अनिवार्य
+चीनी
+अप्रैल
+वितरण
+क्रमशः
+सकें
+पहचान
+पीठ
+पाई
+डाक्टर
+लकड़ी
+रुपये
+सैनिक
+वजह
+गाय
+माननीय
+क्षण
+सम्पर्क
+वीं
+जीव
+खुशी
+दोष
+संदर्भ
+हालत
+जंगल
+प्रदर्शित
+रिपोर्ट
+अंकित
+गरम
+त्याग
+गर्भ
+ज्ञात
+बुरी
+शाखा
+समाचार
+तरीके
+बजाय
+चित्रकला
+चरित्र
+क्यू
+स्पर्श
+हिस्सा
+संरचना
+ग्रा
+गले
+कक्षा
+बेटे
+बेटा
+युक्त
+खबर
+यथार्थ
+बहू
+सम्मान
+दशा
+समझता
+गरीब
+बिलकुल
+सामान
+दरवाजे
+कमजोर
+सौन्दर्य
+विद्युत
+अभ्यास
+उतनी
+कीट
+गीतों
+वीर
+नियमों
+भीड़
+मजबूत
+मान्यता
+तमाम
+विष
+नवीन
+उत्तम
+नियमित
+स्थिर
+भरे
+बनाई
+भला
+मालिक
+माह
+शास्त्र
+चीजें
+कठोर
+अनुपात
+पारिवारिक
+विद्या
+राय
+अधीन
+विधान
+तुरन्त
+प्रत्यक्ष
+पित्त
+तर्क
+चुपचाप
+फरवरी
+करा
+भी
+शिक्षक
+पात्र
+कठिनाई
+पूर्वी
+बनता
+विष्णु
+खुश
+कोश
+अभिव्यक्ति
+सदस्यों
+मूत्र
+भरा
+बुरा
+खून
+उतार
+छूट
+घरों
+जाता
+सर्वप्रथम
+साहस
+दिखायी
+चालू
+इस्पात
+सूची
+समितियों
+असर
+फुट
+व्याख्या
+बैल
+केन्द्रों
+तहत
+दादा
+चरक
+कान
+उद्योगों
+सुनने
+वाणी
+भाषाविज्ञान
+दो
+नरेश
+संभावना
+भेजा
+यथा
+पंचायत
+मास
+कुर्सी
+स्वतन्त्र
+विशेषता
+सूक्ष्म
+प्रौद्योगिकी
+पुराण
+फैल
+स्त्रोत
+वर्गीकरण
+चक्कर
+ज्यों
+क्रोध
+ना
+इंका
+शिकायत
+वस्तुतः
+विद्यालय
+बहन
+भुगतान
+उच्चारण
+घोड़े
+सीधा
+विद्वानों
+संचार
+विरुद्ध
+निकला
+सोने
+मन्दिर
+अंतर्गत
+अपेक्षित
+राष्ट्रपति
+शक्ति
+रमेश
+रहेगा
+समाधान
+कम्पनी
+जानने
+कक्ष
+उत्पन्न
+इसको
+उपकरणों
+थोड़े
+नुकसान
+सर्वाधिक
+बाढ़
+बजट
+गहरा
+कालेज
+उल्लेखनीय
+पसन्द
+संशोधन
+राजाओं
+प्रार्थना
+मजदूर
+पदार्थों
+एकता
+बाग
+समुदाय
+बचा
+लोरिक
+शोथ
+पर्वत
+अन्तर्राष्ट्रीय
+मानकर
+सोचने
+सामान्यतः
+वित्तीय
+स्वतंत्रता
+रूक
+चलकर
+अंकन
+लक्ष्मी
+आधी
+गंभीर
+प्रोटीन
+वस्त्र
+सहन
+शेर
+वैसा
+अतएव
+शांति
+दिखाया
+डालने
+डेढ़
+महिलाओं
+छवि
+मानने
+सम्पत्ति
+वार्ता
+ठोस
+चिन्तन
+क्रांति
+दरवाजा
+स्मिता
+नाना
+स्थल
+हिमाचल
+रखती
+पहुंचने
+बरस
+पश्चात
+डाली
+राग
+विद्यालयों
+कार्रवाई
+इस्लाम
+मोटी
+विद्यार्थियों
+सेवन
+सावधानी
+स्वतन्त्रता
+शून्य
+घोषित
+हिस्से
+परेशान
+सम्राट
+कार्यक्रमों
+गणेश
+चावल
+आँख
+अदालत
+आतंकवादी
+ईश्वर
+बगल
+रूपों
+तुरंत
+निगम
+अमल
+महत्व
+उक्त
+भयंकर
+होटल
+हजारों
+छाती
+गढ़वाल
+अंगों
+कार
+बचपन
+पान
+ली
+हरे
+मामला
+बैंकों
+मछली
+अनाज
+तमिल
+चौधरी
+बाहरी
+सन्देह
+बारी
+प्रतीक्षा
+अतीत
+अफ्रीका
+पैरों
+किन
+साढ़े
+विमर्श
+सिरे
+विधियों
+संयोग
+व्यावहारिक
+वचन
+निर्देश
+दावा
+उत्तरी
+उदास
+विदेश
+हल्के
+जानती
+देखभाल
+इनसे
+दरअसल
+औषधि
+स्नेह
+हरी
+हिम्मत
+बदले
+गुस्सा
+निकालने
+अत्यंत
+बोरोन
+मिश्रण
+सदन
+सूखे
+शक्तिशाली
+संकल्प
+उपेक्षा
+बादल
+उम्मीद
+बोझ
+वेद
+संस्थानों
+संगठनों
+सुपर
+विशेषकर
+पूछ
+प्रतिदिन
+खींच
+प्रशंसा
+गहराई
+मेकअप
+बनते
+सिद्धान्तों
+सकते
+सुनते
+भूत
+मेल
+प्रताप
+हिंसा
+सेवाओं
+गाने
+दफ्तर
+आएँ
+पुत्री
+जानवर
+लाइसेंस
+पाप
+ललित
+पचास
+गिरने
+नागरिक
+इलाके
+उपन्यास
+सास
+सीख
+यूरेनियम
+प्रभावशाली
+प्रमाणित
+प्रयोगशाला
+जीत
+बुलाया
+गुरू
+गुस्से
+संसद
+मंच
+देव
+पुरुषों
+ताकत
+निरीक्षण
+प्रारम्भिक
+तत्कालीन
+तंत्र
+रोम
+फैला
+परिवारों
+फेंक
+ध्रुपद
+पाण्डु
+मूर्ति
+बेर
+अशोक
+कहानियों
+जायें
+लक्षणों
+राहुलजी
+हिंदू
+संयंत्र
+वैसी
+लावनी
+सुंदर
+सृजन
+कोट
+खाकर
+चमक
+मानवीय
+शांत
+समझना
+श्रीलंका
+शर्त
+लिपि
+श्रमिक
+घड़ी
+गलती
+तिवारी
+दोस्त
+अत्याचार
+आयुर्वेद
+आवेदन
+ईसाई
+शर्मा
+विश्वविद्यालय
+प्रजा
+मानना
+बस्ती
+भरपूर
+घरेलू
+कलावती
+उड़
+पक्षों
+आघात
+करना
+भाभी
+सोचता
+हंस
+बनती
+विश्वनाथ
+वेतन
+भेजे
+मथुरा
+एकाएक
+प्रचलन
+प्रोफेसर
+आधे
+मेहनत
+रेलवे
+लोकप्रिय
+मिश्रित
+व्यावसायिक
+बिन्दु
+महान
+निवेदन
+तरल
+नोट
+क्षमा
+असफल
+इंजन
+पकड़ा
+किलोमीटर
+दाने
+समर्थ
+प्रश्नों
+सरस्वती
+बताते
+मंत्र
+लाकर
+जाती
+घाट
+झूठ
+निकालकर
+तापमान
+अनु
+कश्मीर
+उन्नत
+कामों
+लहर
+लेखा
+मासिक
+सगर्भता
+सरदार
+हल्की
+सावित्री
+मद्रास
+शुभ
+पवित्र
+परिषद
+परि
+बिजलीघर
+भेजने
+भली
+गोपाल
+नाश
+जापान
+दलों
+काटने
+पैदावार
+अंतरिक्ष
+कोशिकाओं
+लेप
+लिखित
+बेकार
+मर्यादा
+संदेश
+मेज
+खुराक
+उपायों
+आवाज़
+उपयोगिता
+मित्रों
+व्यास
+पढ़ा
+प्रातः
+चुनौती
+नेताजी
+गौतम
+कटाई
+किस्में
+समीक्षा
+हटा
+बचने
+शोर
+मना
+चलना
+चाल
+खैर
+अर्थव्यवस्था
+अंचल
+इसने
+कंपनी
+कोर्ट
+सुनी
+तत्काल
+फायदा
+समग्र
+तुल्फ
+प्रस्तावों
+कुमाऊँ
+आंगन
+बुनियादी
\ No newline at end of file
diff --git a/tests/test_files/hindi_stemmer/stemmed_result.txt b/tests/test_files/hindi_stemmer/stemmed_result.txt
new file mode 100644
index 000000000..917f77f32
--- /dev/null
+++ b/tests/test_files/hindi_stemmer/stemmed_result.txt
@@ -0,0 +1,1000 @@
+है
+हैं
+लिए
+कुछ
+होता
+दिया
+हुए
+रूप
+से
+मैं
+रहा
+बात
+क्या
+बहुत
+तरह
+बाद
+फिर
+रहे
+होने
+एवं
+हुई
+उनके
+चाहिए
+दिन
+लेकिन
+काम
+इसके
+उन्हें
+आदि
+बार
+दोनों
+उन्होंने
+कार्य
+लिया
+उनकी
+प्राप्त
+लोगों
+गयी
+लगा
+अन्य
+देश
+यदि
+नाम
+वर्ष
+विकास
+अपना
+दूसरे
+भाषा
+मेरे
+बड़े
+वाली
+व्यक्ति
+इसलिए
+तीन
+इसका
+विशेष
+स्थिति
+परन्तु
+स्थान
+यही
+क्यों
+गाँव
+अलग
+जिस
+बाहर
+बना
+तैयार
+अनेक
+शिक्षा
+दृष्टि
+श्री
+थीं
+चार
+बड़ा
+आगे
+उत्तर
+आने
+लगे
+लगभग
+होना
+इससे
+मात्रा
+वाला
+नीचे
+हो
+प्रतिशत
+अगर
+आया
+स्वयं
+रात
+किए
+निर्माण
+पूर्व
+देख
+दिनों
+रंग
+स्तर
+मेरा
+दूसरी
+रोग
+काल
+अच्छी
+ज्ञान
+बनाने
+रखा
+आवश्यकता
+हों
+सहायता
+अतिरिक्त
+देर
+तरफ
+लेने
+सामाजिक
+मगर
+समझ
+कला
+भीतर
+संस्कृति
+विभाग
+बताया
+जगह
+इतनी
+स्थापित
+राष्ट्रीय
+स्वर
+जिसके
+दौरान
+हाँ
+किस
+केन्द्र
+पूर्ण
+पुलिस
+थईआ
+कार्यक्रम
+समस्या
+भूमि
+भाव
+देखकर
+मूल
+आये
+लाभ
+राम
+सेवा
+रचना
+की
+भिन्न
+आती
+बल्कि
+प्राय
+लेते
+जान
+बढ़
+सारे
+शायद
+पड़ा
+छोड़
+विधि
+जबकि
+लिखा
+सिर्फ
+प्रक्रिया
+शब्दों
+लाल
+गए
+स्वीकार
+याद
+उठा
+माध्यम
+दूसरा
+जिन
+संबंध
+चाहे
+चाहते
+प्रणाली
+इनमें
+पुत्र
+उद्देश्य
+पिछले
+ताकि
+बालक
+अन्त
+संगीत
+हजार
+कोशिश
+पति
+खाने
+प्रकृति
+फसल
+नीति
+पक्ष
+पौधों
+प्रकट
+यद्यपि
+भारी
+मात्र
+चाहिये
+अन्तर्गत
+शामिल
+अपेक्षा
+बोली
+हेतु
+नगर
+सम्बन्धी
+पुस्तक
+खुद
+जोर
+बने
+युग
+बैठ
+अर्थात
+लगती
+सारा
+अवसर
+लें
+शैली
+चारों
+प्रकाश
+जायेगा
+उल्लेख
+लेना
+विकसित
+प्रसिद्ध
+बन्द
+विशिष्ट
+रखते
+सिद्ध
+वालों
+चित्रों
+पदार्थ
+इतने
+दिए
+गति
+पड़ी
+संगठन
+इस्तेमाल
+कितना
+प्रकाशित
+पड़े
+अंग्रेजी
+आधुनिक
+सुन्दर
+शहर
+उनको
+महीने
+संसार
+रखना
+पृथ्वी
+ऊर्जा
+संघ
+वास्तविक
+हमने
+सहयोग
+अवधि
+प्रचलित
+लगते
+सात
+संघर्ष
+दिशा
+बैठा
+स्थित
+अधिकांश
+तुलना
+शादी
+वातावरण
+राजीव
+सम्पूर्ण
+कितने
+परम्परा
+मानसिक
+अंग
+बोले
+जरूरत
+बैठक
+इनकी
+ग्रामीण
+कथा
+निकाल
+घटना
+बातचीत
+कवि
+आयी
+इच्छा
+रक्त
+आकार
+गुण
+हृदय
+चुकी
+नष्ट
+खेती
+आरम्भ
+जिन्हें
+सुबह
+खाली
+वायु
+ॐ
+व्यक्तियों
+राजनीतिक
+जरा
+तेज
+बदल
+उपज
+उपभोक्ता
+मकान
+कपड़े
+जानते
+देवता
+प्रयत्न
+संभव
+सकता
+निकट
+वास्तव
+बाकी
+कठिन
+अरे
+सोच
+राज्यों
+अभाव
+किस्म
+सीधे
+जरूरी
+पुराने
+विदेशी
+सेना
+जाएगी
+वनस्पति
+अधिकारी
+पार
+आशा
+पूर्ति
+सुधार
+जानता
+अध्यक्ष
+व्यापक
+ध्वनि
+प्रचार
+प्रयुक्त
+प्रगति
+उन्हीं
+लगातार
+आखिर
+लौट
+बनाये
+सुरक्षित
+दें
+सोचा
+चीज
+खेत
+लाने
+श्रीमती
+उपयुक्त
+चाहती
+मामले
+वस्तुओं
+शारीरिक
+बाबू
+तुम्हारी
+सफलता
+संस्थान
+पैर
+करे
+विचारों
+जिसकी
+नियम
+अंदर
+पेट
+त्वचा
+गायन
+लागू
+जमा
+बोर्ड
+कानून
+क्रम
+लेखक
+बावजूद
+शुरु
+स्टेशन
+अगले
+सम्भव
+गर्म
+रास्ते
+अधिकारियों
+पुरानी
+संबंधी
+यानी
+युवक
+पाठ
+रखकर
+पशु
+अंक
+सरल
+वृक्ष
+शिकार
+मुझसे
+हत्या
+आँखों
+शुद्ध
+दृष्टिकोण
+लम्बी
+बनाना
+बच्चा
+दीवार
+अध्याय
+अत्यधिक
+सचमुच
+सम्मेलन
+बिहार
+मुख
+तार
+चूर्ण
+परस्पर
+बता
+लघु
+तुम्हारा
+छात्र
+अक्सर
+चुप
+वाद्य
+जायेगी
+फलों
+आजकल
+भार
+रखे
+अमेरिका
+गिर
+उतर
+विषयों
+सुना
+स्थानीय
+गांवों
+व्यवसाय
+शताब्दी
+निश्चय
+बाँध
+आतंकवादियों
+भागों
+अंश
+वैदिक
+काट
+अधिकतर
+बैठी
+स्वाभाविक
+ग्रन्थ
+कही
+नियोजन
+शत्रु
+सूर्य
+पश्चात्‌
+आयोजित
+चिन्ता
+सिख
+भेज
+वाद्यों
+मुसलमान
+दृश्य
+खाद
+समुद्र
+डाक
+कदम
+अनिवार्य
+चीनी
+अप्रैल
+वितरण
+क्रमशः
+सकें
+पहचान
+पीठ
+पाई
+डाक्टर
+लकड़ी
+रुपये
+सैनिक
+वजह
+गाय
+माननीय
+क्षण
+सम्पर्क
+वीं
+जीव
+खुशी
+दोष
+संदर्भ
+हालत
+जंगल
+प्रदर्शित
+रिपोर्ट
+अंकित
+गरम
+त्याग
+गर्भ
+ज्ञात
+बुरी
+शाखा
+समाचार
+तरीके
+बजाय
+चित्रकला
+चरित्र
+क्यू
+स्पर्श
+हिस्सा
+संरचना
+ग्रा
+गले
+कक्षा
+बेटे
+बेटा
+युक्त
+खबर
+यथार्थ
+बहू
+सम्मान
+दशा
+समझता
+गरीब
+बिलकुल
+सामान
+दरवाजे
+कमजोर
+सौन्दर्य
+विद्युत
+अभ्यास
+उतनी
+कीट
+गीतों
+वीर
+नियमों
+भीड़
+मजबूत
+मान्यता
+तमाम
+विष
+नवीन
+उत्तम
+नियमित
+स्थिर
+भरे
+बनाई
+भला
+मालिक
+माह
+शास्त्र
+चीजें
+कठोर
+अनुपात
+पारिवारिक
+विद्या
+राय
+अधीन
+विधान
+तुरन्त
+प्रत्यक्ष
+पित्त
+तर्क
+चुपचाप
+फरवरी
+करा
+भी
+शिक्षक
+पात्र
+कठिनाई
+पूर्वी
+बनता
+विष्णु
+खुश
+कोश
+अभिव्यक्ति
+सदस्यों
+मूत्र
+भरा
+बुरा
+खून
+उतार
+छूट
+घरों
+जाता
+सर्वप्रथम
+साहस
+दिखायी
+चालू
+इस्पात
+सूची
+समितियों
+असर
+फुट
+व्याख्या
+बैल
+केन्द्रों
+तहत
+दादा
+चरक
+कान
+उद्योगों
+सुनने
+वाणी
+भाषाविज्ञान
+दो
+नरेश
+संभावना
+भेजा
+यथा
+पंचायत
+मास
+कुर्सी
+स्वतन्त्र
+विशेषता
+सूक्ष्म
+प्रौद्योगिकी
+पुराण
+फैल
+स्त्रोत
+वर्गीकरण
+चक्कर
+ज्यों
+क्रोध
+ना
+इंका
+शिकायत
+वस्तुतः
+विद्यालय
+बहन
+भुगतान
+उच्चारण
+घोड़े
+सीधा
+विद्वानों
+संचार
+विरुद्ध
+निकला
+सोने
+मन्दिर
+अंतर्गत
+अपेक्षित
+राष्ट्रपति
+शक्ति
+रमेश
+रहेगा
+समाधान
+कम्पनी
+जानने
+कक्ष
+उत्पन्न
+इसको
+उपकरणों
+थोड़े
+नुकसान
+सर्वाधिक
+बाढ़
+बजट
+गहरा
+कालेज
+उल्लेखनीय
+पसन्द
+संशोधन
+राजाओं
+प्रार्थना
+मजदूर
+पदार्थों
+एकता
+बाग
+समुदाय
+बचा
+लोरिक
+शोथ
+पर्वत
+अन्तर्राष्ट्रीय
+मानकर
+सोचने
+सामान्यतः
+वित्तीय
+स्वतंत्रता
+रूक
+चलकर
+अंकन
+लक्ष्मी
+आधी
+गंभीर
+प्रोटीन
+वस्त्र
+सहन
+शेर
+वैसा
+अतएव
+शांति
+दिखाया
+डालने
+डेढ़
+महिलाओं
+छवि
+मानने
+सम्पत्ति
+वार्ता
+ठोस
+चिन्तन
+क्रांति
+दरवाजा
+स्मिता
+नाना
+स्थल
+हिमाचल
+रखती
+पहुंचने
+बरस
+पश्चात
+डाली
+राग
+विद्यालयों
+कार्रवाई
+इस्लाम
+मोटी
+विद्यार्थियों
+सेवन
+सावधानी
+स्वतन्त्रता
+शून्य
+घोषित
+हिस्से
+परेशान
+सम्राट
+कार्यक्रमों
+गणेश
+चावल
+आँख
+अदालत
+आतंकवादी
+ईश्वर
+बगल
+रूपों
+तुरंत
+निगम
+अमल
+महत्व
+उक्त
+भयंकर
+होटल
+हजारों
+छाती
+गढ़वाल
+अंगों
+कार
+बचपन
+पान
+ली
+हरे
+मामला
+बैंकों
+मछली
+अनाज
+तमिल
+चौधरी
+बाहरी
+सन्देह
+बारी
+प्रतीक्षा
+अतीत
+अफ्रीका
+पैरों
+किन
+साढ़े
+विमर्श
+सिरे
+विधियों
+संयोग
+व्यावहारिक
+वचन
+निर्देश
+दावा
+उत्तरी
+उदास
+विदेश
+हल्के
+जानती
+देखभाल
+इनसे
+दरअसल
+औषधि
+स्नेह
+हरी
+हिम्मत
+बदले
+गुस्सा
+निकालने
+अत्यंत
+बोरोन
+मिश्रण
+सदन
+सूखे
+शक्तिशाली
+संकल्प
+उपेक्षा
+बादल
+उम्मीद
+बोझ
+वेद
+संस्थानों
+संगठनों
+सुपर
+विशेषकर
+पूछ
+प्रतिदिन
+खींच
+प्रशंसा
+गहराई
+मेकअप
+बनते
+सिद्धान्तों
+सकते
+सुनते
+भूत
+मेल
+प्रताप
+हिंसा
+सेवाओं
+गाने
+दफ्तर
+आएँ
+पुत्री
+जानवर
+लाइसेंस
+पाप
+ललित
+पचास
+गिरने
+नागरिक
+इलाके
+उपन्यास
+सास
+सीख
+यूरेनियम
+प्रभावशाली
+प्रमाणित
+प्रयोगशाला
+जीत
+बुलाया
+गुरू
+गुस्से
+संसद
+मंच
+देव
+पुरुषों
+ताकत
+निरीक्षण
+प्रारम्भिक
+तत्कालीन
+तंत्र
+रोम
+फैला
+परिवारों
+फेंक
+ध्रुपद
+पाण्डु
+मूर्ति
+बेर
+अशोक
+कहानियों
+जायें
+लक्षणों
+राहुलजी
+हिंदू
+संयंत्र
+वैसी
+लावनी
+सुंदर
+सृजन
+कोट
+खाकर
+चमक
+मानवीय
+शांत
+समझना
+श्रीलंका
+शर्त
+लिपि
+श्रमिक
+घड़ी
+गलती
+तिवारी
+दोस्त
+अत्याचार
+आयुर्वेद
+आवेदन
+ईसाई
+शर्मा
+विश्वविद्यालय
+प्रजा
+मानना
+बस्ती
+भरपूर
+घरेलू
+कलावती
+उड़
+पक्षों
+आघात
+करना
+भाभी
+सोचता
+हंस
+बनती
+विश्वनाथ
+वेतन
+भेजे
+मथुरा
+एकाएक
+प्रचलन
+प्रोफेसर
+आधे
+मेहनत
+रेलवे
+लोकप्रिय
+मिश्रित
+व्यावसायिक
+बिन्दु
+महान
+निवेदन
+तरल
+नोट
+क्षमा
+असफल
+इंजन
+पकड़ा
+किलोमीटर
+दाने
+समर्थ
+प्रश्नों
+सरस्वती
+बताते
+मंत्र
+लाकर
+जाती
+घाट
+झूठ
+निकालकर
+तापमान
+अनु
+कश्मीर
+उन्नत
+कामों
+लहर
+लेखा
+मासिक
+सगर्भता
+सरदार
+हल्की
+सावित्री
+मद्रास
+शुभ
+पवित्र
+परिषद
+परि
+बिजलीघर
+भेजने
+भली
+गोपाल
+नाश
+जापान
+दलों
+काटने
+पैदावार
+अंतरिक्ष
+कोशिकाओं
+लेप
+लिखित
+बेकार
+मर्यादा
+संदेश
+मेज
+खुराक
+उपायों
+आवाज़
+उपयोगिता
+मित्रों
+व्यास
+पढ़ा
+प्रातः
+चुनौती
+नेताजी
+गौतम
+कटाई
+किस्में
+समीक्षा
+हटा
+बचने
+शोर
+मना
+चलना
+चाल
+खैर
+अर्थव्यवस्था
+अंचल
+इसने
+कंपनी
+कोर्ट
+सुनी
+तत्काल
+फायदा
+समग्र
+तुल्फ
+प्रस्तावों
+कुमाऊँ
+आंगन
+बुनियादी
diff --git a/tests/web_ui_tests.js b/tests/web_ui_tests.js
index ff6094e7a..ad360e5ae 100644
--- a/tests/web_ui_tests.js
+++ b/tests/web_ui_tests.js
@@ -17,13 +17,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Eswara Rajesh Pinapala epinapala@live.com
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009 - 2018
  * @filesource
  */
diff --git a/work_directory/_placeholder.php b/work_directory/_placeholder.php
index 1477b3a6a..795877b6d 100644
--- a/work_directory/_placeholder.php
+++ b/work_directory/_placeholder.php
@@ -18,13 +18,13 @@
  * 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/>.
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  *
  * END LICENSE
  *
  * @author Chris Pollett chris@pollett.org
- * @license http://www.gnu.org/licenses/ GPL3
- * @link http://www.seekquarry.com/
+ * @license https://www.gnu.org/licenses/ GPL3
+ * @link https://www.seekquarry.com/
  * @copyright 2009-2017
  * @filesource
  */
ViewGit